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 16 years ago
Last modified on Oct 28, 2009, 11:56:26 AM

