wiki:ToDo/VirtualFileSystem

Block devices

Block device API

Ajouter un champ flag dans les requetes, on peut imaginer

  • un attribut nocache

Buffer cache

Au niveau Block device

  • Dans deux structures:
    • Une liste chainee de LRU
    • Une hash table pour faire les lookups
  • avoir un attribut dirty

VFS

struct vfs_mount_s
{
  struct device_s *dev;
  struct vfs_mount_private_s *pv;
  struct vfs_node_s *mountpoint;
};

struct vfs_node_ops_s
{
  error_t (*read)(struct vfs_node_s *node, void *data, pos_t pos, size_t size);
  error_t (*write)(struct vfs_node_s *node, const void *data, pos_t pos, size_t size);
  error_t (*trunc)(struct vfs_node_s *node, size_t size);
  struct vfs_node_s* (*create)(struct vfs_node_s *node, int flags);
  error_t (*link)(struct vfs_node_s *node, struct vfs_node_s *newparent, const char *newname, size_t newnamelen, int op);
  error_t (*unlink)(struct vfs_node_s *node);
  struct vfs_node_s* (*lookup)(struct vfs_node_s *parent, const char *name, size_t namelen);
  void (*list_dir)(struct vfs_node_s *parent, void (*fcn)(char *name, size_t namelen, struct vfs_stat_s *st, void *pv), void *pv);
};

struct vfs_node_s
{
  struct vfs_node_s *parent;
  HASH(const char *name, struct vfs_node_s*) children;
  struct vfs_node_private_s *pv;
  struct vfs_mount_s *m;
  int refcount;
  const struct vfs_node_ops_s *ops;
};

struct vfs_file_s
{
  int mode;
  struct vfs_node_s *node;
};

FS API

FAT

En couches:

VFAT (gestion des noms longs)

Est une backend optionnelle registrable dans le FS

FS

  • gère la notion de répertoire
  • gère les fichiers
struct vfs_node_s* fat_fs_open(device_s *dev, uint32_t flags);

Gère bien entendu les actions décrites en haut

Backend

  • gère la/les FAT, et leur recopie, les clusters, les blocs
  • implem particulière pour FAT12/16/32
  • gère l'espace libre
  • gère les listes chainées des blocs pour les fichiers (extent)
  • représentation abstraite d'un extent par un pointeur sur struct
  • API d'adressage au bloc (pas au cluster) dans un fichier
  • permet de faire la traduction (extent, block no) -> lba

flags à l'ouverture du fs:

  • read_only
  • extent_cache_disable
struct fat_backend_s;
struct extent_s;

struct fat_backend_ops_s
{
    error_t open(struct device_s *dev, struct fat_backend_s *b, uint32_t flags);

    size_t free_block_count(struct fat_backend_s *b);

    error_t extent_allocate(struct fat_backend_s *b, struct extent_s **extent_out);
    error_t extent_release(struct fat_backend_s *b, struct extent_s *extent);
    error_t extent_start_at(struct fat_backend_s *b, dev_block_lba_t lba, struct extent_s **extent_out);
    dev_block_lba_t extent_get_lba(struct fat_backend_s *b, struct extent_s *extent, size_t block_no);
    error_t extent_resize(struct fat_backend_s *b, struct extent_s *extent, size_t new_block_count);
}
Last modified 15 years ago Last modified on Oct 28, 2009, 11:56:26 AM