vfs.txt
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- auto-fill -*-                                                         */
  2. Overview of the Virtual File System
  3. Richard Gooch <rgooch@atnf.csiro.au>
  4.       5-JUL-1999
  5. Conventions used in this document                                     <section>
  6. =================================
  7. Each section in this document will have the string "<section>" at the
  8. right-hand side of the section title. Each subsection will have
  9. "<subsection>" at the right-hand side. These strings are meant to make
  10. it easier to search through the document.
  11. NOTE that the master copy of this document is available online at:
  12. http://www.atnf.csiro.au/~rgooch/linux/docs/vfs.txt
  13. What is it?                                                           <section>
  14. ===========
  15. The Virtual File System (otherwise known as the Virtual Filesystem
  16. Switch) is the software layer in the kernel that provides the
  17. filesystem interface to userspace programs. It also provides an
  18. abstraction within the kernel which allows different filesystem
  19. implementations to co-exist.
  20. A Quick Look At How It Works                                          <section>
  21. ============================
  22. In this section I'll briefly describe how things work, before
  23. launching into the details. I'll start with describing what happens
  24. when user programs open and manipulate files, and then look from the
  25. other view which is how a filesystem is supported and subsequently
  26. mounted.
  27. Opening a File                                                     <subsection>
  28. --------------
  29. The VFS implements the open(2), stat(2), chmod(2) and similar system
  30. calls. The pathname argument is used by the VFS to search through the
  31. directory entry cache (dentry cache or "dcache"). This provides a very
  32. fast lookup mechanism to translate a pathname (filename) into a
  33. specific dentry.
  34. An individual dentry usually has a pointer to an inode. Inodes are the
  35. things that live on disc drives, and can be regular files (you know:
  36. those things that you write data into), directories, FIFOs and other
  37. beasts. Dentries live in RAM and are never saved to disc: they exist
  38. only for performance. Inodes live on disc and are copied into memory
  39. when required. Later any changes are written back to disc. The inode
  40. that lives in RAM is a VFS inode, and it is this which the dentry
  41. points to. A single inode can be pointed to by multiple dentries
  42. (think about hardlinks).
  43. The dcache is meant to be a view into your entire filespace. Unlike
  44. Linus, most of us losers can't fit enough dentries into RAM to cover
  45. all of our filespace, so the dcache has bits missing. In order to
  46. resolve your pathname into a dentry, the VFS may have to resort to
  47. creating dentries along the way, and then loading the inode. This is
  48. done by looking up the inode.
  49. To lookup an inode (usually read from disc) requires that the VFS
  50. calls the lookup() method of the parent directory inode. This method
  51. is installed by the specific filesystem implementation that the inode
  52. lives in. There will be more on this later.
  53. Once the VFS has the required dentry (and hence the inode), we can do
  54. all those boring things like open(2) the file, or stat(2) it to peek
  55. at the inode data. The stat(2) operation is fairly simple: once the
  56. VFS has the dentry, it peeks at the inode data and passes some of it
  57. back to userspace.
  58. Opening a file requires another operation: allocation of a file
  59. structure (this is the kernel-side implementation of file
  60. descriptors). The freshly allocated file structure is initialised with
  61. a pointer to the dentry and a set of file operation member functions.
  62. These are taken from the inode data. The open() file method is then
  63. called so the specific filesystem implementation can do it's work. You
  64. can see that this is another switch performed by the VFS.
  65. The file structure is placed into the file descriptor table for the
  66. process.
  67. Reading, writing and closing files (and other assorted VFS operations)
  68. is done by using the userspace file descriptor to grab the appropriate
  69. file structure, and then calling the required file structure method
  70. function to do whatever is required.
  71. For as long as the file is open, it keeps the dentry "open" (in use),
  72. which in turn means that the VFS inode is still in use.
  73. All VFS system calls (i.e. open(2), stat(2), read(2), write(2),
  74. chmod(2) and so on) are called from a process context. You should
  75. assume that these calls are made without any kernel locks being
  76. held. This means that the processes may be executing the same piece of
  77. filesystem or driver code at the same time, on different
  78. processors. You should ensure that access to shared resources is
  79. protected by appropriate locks.
  80. Registering and Mounting a Filesystem                              <subsection>
  81. -------------------------------------
  82. If you want to support a new kind of filesystem in the kernel, all you
  83. need to do is call register_filesystem(). You pass a structure
  84. describing the filesystem implementation (struct file_system_type)
  85. which is then added to an internal table of supported filesystems. You
  86. can do:
  87. % cat /proc/filesystems
  88. to see what filesystems are currently available on your system.
  89. When a request is made to mount a block device onto a directory in
  90. your filespace the VFS will call the appropriate method for the
  91. specific filesystem. The dentry for the mount point will then be
  92. updated to point to the root inode for the new filesystem.
  93. It's now time to look at things in more detail.
  94. struct file_system_type                                               <section>
  95. =======================
  96. This describes the filesystem. As of kernel 2.1.99, the following
  97. members are defined:
  98. struct file_system_type {
  99. const char *name;
  100. int fs_flags;
  101. struct super_block *(*read_super) (struct super_block *, void *, int);
  102. struct file_system_type * next;
  103. };
  104.   name: the name of the filesystem type, such as "ext2", "iso9660",
  105. "msdos" and so on
  106.   fs_flags: various flags (i.e. FS_REQUIRES_DEV, FS_NO_DCACHE, etc.)
  107.   read_super: the method to call when a new instance of this
  108. filesystem should be mounted
  109.   next: for internal VFS use: you should initialise this to NULL
  110. The read_super() method has the following arguments:
  111.   struct super_block *sb: the superblock structure. This is partially
  112. initialised by the VFS and the rest must be initialised by the
  113. read_super() method
  114.   void *data: arbitrary mount options, usually comes as an ASCII
  115. string
  116.   int silent: whether or not to be silent on error
  117. The read_super() method must determine if the block device specified
  118. in the superblock contains a filesystem of the type the method
  119. supports. On success the method returns the superblock pointer, on
  120. failure it returns NULL.
  121. The most interesting member of the superblock structure that the
  122. read_super() method fills in is the "s_op" field. This is a pointer to
  123. a "struct super_operations" which describes the next level of the
  124. filesystem implementation.
  125. struct super_operations                                               <section>
  126. =======================
  127. This describes how the VFS can manipulate the superblock of your
  128. filesystem. As of kernel 2.1.99, the following members are defined:
  129. struct super_operations {
  130. void (*read_inode) (struct inode *);
  131. void (*write_inode) (struct inode *, int);
  132. void (*put_inode) (struct inode *);
  133. void (*delete_inode) (struct inode *);
  134. int (*notify_change) (struct dentry *, struct iattr *);
  135. void (*put_super) (struct super_block *);
  136. void (*write_super) (struct super_block *);
  137. int (*statfs) (struct super_block *, struct statfs *, int);
  138. int (*remount_fs) (struct super_block *, int *, char *);
  139. void (*clear_inode) (struct inode *);
  140. };
  141. All methods are called without any locks being held, unless otherwise
  142. noted. This means that most methods can block safely. All methods are
  143. only called from a process context (i.e. not from an interrupt handler
  144. or bottom half).
  145.   read_inode: this method is called to read a specific inode from the
  146. mounted filesystem. The "i_ino" member in the "struct inode"
  147. will be initialised by the VFS to indicate which inode to
  148. read. Other members are filled in by this method
  149.   write_inode: this method is called when the VFS needs to write an
  150. inode to disc.  The second parameter indicates whether the write
  151. should be synchronous or not, not all filesystems check this flag.
  152.   put_inode: called when the VFS inode is removed from the inode
  153. cache. This method is optional
  154.   delete_inode: called when the VFS wants to delete an inode
  155.   notify_change: called when VFS inode attributes are changed. If this
  156. is NULL the VFS falls back to the write_inode() method. This
  157. is called with the kernel lock held
  158.   put_super: called when the VFS wishes to free the superblock
  159. (i.e. unmount). This is called with the superblock lock held
  160.   write_super: called when the VFS superblock needs to be written to
  161. disc. This method is optional
  162.   statfs: called when the VFS needs to get filesystem statistics. This
  163. is called with the kernel lock held
  164.   remount_fs: called when the filesystem is remounted. This is called
  165. with the kernel lock held
  166.   clear_inode: called then the VFS clears the inode. Optional
  167. The read_inode() method is responsible for filling in the "i_op"
  168. field. This is a pointer to a "struct inode_operations" which
  169. describes the methods that can be performed on individual inodes.
  170. struct inode_operations                                               <section>
  171. =======================
  172. This describes how the VFS can manipulate an inode in your
  173. filesystem. As of kernel 2.1.99, the following members are defined:
  174. struct inode_operations {
  175. struct file_operations * default_file_ops;
  176. int (*create) (struct inode *,struct dentry *,int);
  177. int (*lookup) (struct inode *,struct dentry *);
  178. int (*link) (struct dentry *,struct inode *,struct dentry *);
  179. int (*unlink) (struct inode *,struct dentry *);
  180. int (*symlink) (struct inode *,struct dentry *,const char *);
  181. int (*mkdir) (struct inode *,struct dentry *,int);
  182. int (*rmdir) (struct inode *,struct dentry *);
  183. int (*mknod) (struct inode *,struct dentry *,int,int);
  184. int (*rename) (struct inode *, struct dentry *,
  185. struct inode *, struct dentry *);
  186. int (*readlink) (struct dentry *, char *,int);
  187. struct dentry * (*follow_link) (struct dentry *, struct dentry *);
  188. int (*readpage) (struct file *, struct page *);
  189. int (*writepage) (struct file *, struct page *);
  190. int (*bmap) (struct inode *,int);
  191. void (*truncate) (struct inode *);
  192. int (*permission) (struct inode *, int);
  193. int (*smap) (struct inode *,int);
  194. int (*updatepage) (struct file *, struct page *, const char *,
  195. unsigned long, unsigned int, int);
  196. int (*revalidate) (struct dentry *);
  197. };
  198. Again, all methods are called without any locks being held, unless
  199. otherwise noted.
  200.   default_file_ops: this is a pointer to a "struct file_operations"
  201. which describes how to open and then manipulate open files
  202.   create: called by the open(2) and creat(2) system calls. Only
  203. required if you want to support regular files. The dentry you
  204. get should not have an inode (i.e. it should be a negative
  205. dentry). Here you will probably call d_instantiate() with the
  206. dentry and the newly created inode
  207.   lookup: called when the VFS needs to lookup an inode in a parent
  208. directory. The name to look for is found in the dentry. This
  209. method must call d_add() to insert the found inode into the
  210. dentry. The "i_count" field in the inode structure should be
  211. incremented. If the named inode does not exist a NULL inode
  212. should be inserted into the dentry (this is called a negative
  213. dentry). Returning an error code from this routine must only
  214. be done on a real error, otherwise creating inodes with system
  215. calls like create(2), mknod(2), mkdir(2) and so on will fail.
  216. If you wish to overload the dentry methods then you should
  217. initialise the "d_dop" field in the dentry; this is a pointer
  218. to a struct "dentry_operations".
  219. This method is called with the directory inode semaphore held
  220.   link: called by the link(2) system call. Only required if you want
  221. to support hard links. You will probably need to call
  222. d_instantiate() just as you would in the create() method
  223.   unlink: called by the unlink(2) system call. Only required if you
  224. want to support deleting inodes
  225.   symlink: called by the symlink(2) system call. Only required if you
  226. want to support symlinks. You will probably need to call
  227. d_instantiate() just as you would in the create() method
  228.   mkdir: called by the mkdir(2) system call. Only required if you want
  229. to support creating subdirectories. You will probably need to
  230. call d_instantiate() just as you would in the create() method
  231.   rmdir: called by the rmdir(2) system call. Only required if you want
  232. to support deleting subdirectories
  233.   mknod: called by the mknod(2) system call to create a device (char,
  234. block) inode or a named pipe (FIFO) or socket. Only required
  235. if you want to support creating these types of inodes. You
  236. will probably need to call d_instantiate() just as you would
  237. in the create() method
  238.   readlink: called by the readlink(2) system call. Only required if
  239. you want to support reading symbolic links
  240.   follow_link: called by the VFS to follow a symbolic link to the
  241. inode it points to. Only required if you want to support
  242. symbolic links
  243. struct file_operations                                                <section>
  244. ======================
  245. This describes how the VFS can manipulate an open file. As of kernel
  246. 2.1.99, the following members are defined:
  247. struct file_operations {
  248. loff_t (*llseek) (struct file *, loff_t, int);
  249. ssize_t (*read) (struct file *, char *, size_t, loff_t *);
  250. ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
  251. int (*readdir) (struct file *, void *, filldir_t);
  252. unsigned int (*poll) (struct file *, struct poll_table_struct *);
  253. int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
  254. int (*mmap) (struct file *, struct vm_area_struct *);
  255. int (*open) (struct inode *, struct file *);
  256. int (*release) (struct inode *, struct file *);
  257. int (*fsync) (struct file *, struct dentry *);
  258. int (*fasync) (struct file *, int);
  259. int (*check_media_change) (kdev_t dev);
  260. int (*revalidate) (kdev_t dev);
  261. int (*lock) (struct file *, int, struct file_lock *);
  262. };
  263. Again, all methods are called without any locks being held, unless
  264. otherwise noted.
  265.   llseek: called when the VFS needs to move the file position index
  266.   read: called by read(2) and related system calls
  267.   write: called by write(2) and related system calls
  268.   readdir: called when the VFS needs to read the directory contents
  269.   poll: called by the VFS when a process wants to check if there is
  270. activity on this file and (optionally) go to sleep until there
  271. is activity. Called by the select(2) and poll(2) system calls
  272.   ioctl: called by the ioctl(2) system call
  273.   mmap: called by the mmap(2) system call
  274.   open: called by the VFS when an inode should be opened. When the VFS
  275. opens a file, it creates a new "struct file" and initialises
  276. the "f_op" file operations member with the "default_file_ops"
  277. field in the inode structure. It then calls the open method
  278. for the newly allocated file structure. You might think that
  279. the open method really belongs in "struct inode_operations",
  280. and you may be right. I think it's done the way it is because
  281. it makes filesystems simpler to implement. The open() method
  282. is a good place to initialise the "private_data" member in the
  283. file structure if you want to point to a device structure
  284.   release: called when the last reference to an open file is closed
  285.   fsync: called by the fsync(2) system call
  286.   fasync: called by the fcntl(2) system call when asynchronous
  287. (non-blocking) mode is enabled for a file
  288. Note that the file operations are implemented by the specific
  289. filesystem in which the inode resides. When opening a device node
  290. (character or block special) most filesystems will call special
  291. support routines in the VFS which will locate the required device
  292. driver information. These support routines replace the filesystem file
  293. operations with those for the device driver, and then proceed to call
  294. the new open() method for the file. This is how opening a device file
  295. in the filesystem eventually ends up calling the device driver open()
  296. method. Note the devfs (the Device FileSystem) has a more direct path
  297. from device node to device driver (this is an unofficial kernel
  298. patch).
  299. struct dentry_operations                                              <section>
  300. ========================
  301. This describes how a filesystem can overload the standard dentry
  302. operations. Dentries and the dcache are the domain of the VFS and the
  303. individual filesystem implementations. Device drivers have no business
  304. here. These methods may be set to NULL, as they are either optional or
  305. the VFS uses a default. As of kernel 2.1.99, the following members are
  306. defined:
  307. struct dentry_operations {
  308. int (*d_revalidate)(struct dentry *);
  309. int (*d_hash) (struct dentry *, struct qstr *);
  310. int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
  311. void (*d_delete)(struct dentry *);
  312. void (*d_release)(struct dentry *);
  313. void (*d_iput)(struct dentry *, struct inode *);
  314. };
  315.   d_revalidate: called when the VFS needs to revalidate a dentry. This
  316. is called whenever a name lookup finds a dentry in the
  317. dcache. Most filesystems leave this as NULL, because all their
  318. dentries in the dcache are valid
  319.   d_hash: called when the VFS adds a dentry to the hash table
  320.   d_compare: called when a dentry should be compared with another
  321.   d_delete: called when the last reference to a dentry is
  322. deleted. This means no-one is using the dentry, however it is
  323. still valid and in the dcache
  324.   d_release: called when a dentry is really deallocated
  325.   d_iput: called when a dentry looses its inode (just prior to its
  326. being deallocated). The default when this is NULL is that the
  327. VFS calls iput(). If you define this method, you must call
  328. iput() yourself
  329. Each dentry has a pointer to its parent dentry, as well as a hash list
  330. of child dentries. Child dentries are basically like files in a
  331. directory.
  332. There are a number of functions defined which permit a filesystem to
  333. manipulate dentries:
  334.   dget: open a new handle for an existing dentry (this just increments
  335. the usage count)
  336.   dput: close a handle for a dentry (decrements the usage count). If
  337. the usage count drops to 0, the "d_delete" method is called
  338. and the dentry is placed on the unused list if the dentry is
  339. still in its parents hash list. Putting the dentry on the
  340. unused list just means that if the system needs some RAM, it
  341. goes through the unused list of dentries and deallocates them.
  342. If the dentry has already been unhashed and the usage count
  343. drops to 0, in this case the dentry is deallocated after the
  344. "d_delete" method is called
  345.   d_drop: this unhashes a dentry from its parents hash list. A
  346. subsequent call to dput() will dellocate the dentry if its
  347. usage count drops to 0
  348.   d_delete: delete a dentry. If there are no other open references to
  349. the dentry then the dentry is turned into a negative dentry
  350. (the d_iput() method is called). If there are other
  351. references, then d_drop() is called instead
  352.   d_add: add a dentry to its parents hash list and then calls
  353. d_instantiate()
  354.   d_instantiate: add a dentry to the alias hash list for the inode and
  355. updates the "d_inode" member. The "i_count" member in the
  356. inode structure should be set/incremented. If the inode
  357. pointer is NULL, the dentry is called a "negative
  358. dentry". This function is commonly called when an inode is
  359. created for an existing negative dentry