Inode:
un inode représente un fichier
on ne met pas le nom du fichier dans l’inode
on y met la taille

Filesystem:
on va monter un filesystem dans le /root avec mount()
qqsoit le filesystem, ça s’utilise de la même façon

V-tables (or virtual tables) are how most C++ implementations do polymorphism. For each concrete implementation of a class, there is a table of function pointers to all the virtual methods. A pointer to this table (called the virtual table) exists as a data member in all the objects. When one calls a virtual method, we lookup the object’s v-table and call the appropriate derived class method.

struct foo {
    struct foo_ops *ops;
};
struct foo_ops {
    int (*f)();
};

struct foo t;
t.ops = func;

struct file_operations;
/*
 * operations sur les fichiers:
 * open
 * read
 * write
 * stat (ou fstat)
 * mmap
 * sendfile
 * close
 * ioctl
 * release
 * 
 * check include/linux/fs.h
 */

virtual filesystem (VFS):
-> filesystem
-> namei (pour name inode), c’est cette partie là qui s’occupe de faire le caching
-> open => vfs_open
-> read => vfs_read
stat (ou fstat)

Factory (?)

read(fd, buf, 82) <- buf est une dentry *
variantes de read: pread && readv
Comment changer la sémantique de read() pour que ça ait du sens ?

(début de parenthèses du cours

struct iovec {
    void *ptr;
    size_t len;
};

reverse proxy
fin de parenthèses du cours)

getdent
use sendfile to recreate cp (man sendfile)

En C++, pour les functions qui ont virtual, on a besoin d’implémenter le destructeur.

Pour les shared_ptr -> ref_count pour éviter les types d’erreurs suivantes:

les fichiers de devices, y en a 2 types:

Major number -> quel est le driver associé au device ?
Minor number -> quelle est l’instance du device ?