diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 22:02:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 22:02:39 -0400 |
commit | bbd9d6f7fbb0305c9a592bf05a32e87eb364a4ff (patch) | |
tree | 12b2bb4202b05f6ae6a43c6ce830a0472043dbe5 /Documentation/filesystems | |
parent | 8e204874db000928e37199c2db82b7eb8966cc3c (diff) | |
parent | 5a9a43646cf709312d71eca71cef90ad802f28f9 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (107 commits)
vfs: use ERR_CAST for err-ptr tossing in lookup_instantiate_filp
isofs: Remove global fs lock
jffs2: fix IN_DELETE_SELF on overwriting rename() killing a directory
fix IN_DELETE_SELF on overwriting rename() on ramfs et.al.
mm/truncate.c: fix build for CONFIG_BLOCK not enabled
fs:update the NOTE of the file_operations structure
Remove dead code in dget_parent()
AFS: Fix silly characters in a comment
switch d_add_ci() to d_splice_alias() in "found negative" case as well
simplify gfs2_lookup()
jfs_lookup(): don't bother with . or ..
get rid of useless dget_parent() in btrfs rename() and link()
get rid of useless dget_parent() in fs/btrfs/ioctl.c
fs: push i_mutex and filemap_write_and_wait down into ->fsync() handlers
drivers: fix up various ->llseek() implementations
fs: handle SEEK_HOLE/SEEK_DATA properly in all fs's that define their own llseek
Ext4: handle SEEK_HOLE/SEEK_DATA generically
Btrfs: implement our own ->llseek
fs: add SEEK_HOLE and SEEK_DATA flags
reiserfs: make reiserfs default to barrier=flush
...
Fix up trivial conflicts in fs/xfs/linux-2.6/xfs_super.c due to the new
shrinker callout for the inode cache, that clashed with the xfs code to
start the periodic workers later.
Diffstat (limited to 'Documentation/filesystems')
-rw-r--r-- | Documentation/filesystems/Locking | 8 | ||||
-rw-r--r-- | Documentation/filesystems/porting | 27 | ||||
-rw-r--r-- | Documentation/filesystems/vfs.txt | 30 |
3 files changed, 53 insertions, 12 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 57d827d6071d..ca7e25292542 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -52,7 +52,7 @@ ata *); | |||
52 | void (*put_link) (struct dentry *, struct nameidata *, void *); | 52 | void (*put_link) (struct dentry *, struct nameidata *, void *); |
53 | void (*truncate) (struct inode *); | 53 | void (*truncate) (struct inode *); |
54 | int (*permission) (struct inode *, int, unsigned int); | 54 | int (*permission) (struct inode *, int, unsigned int); |
55 | int (*check_acl)(struct inode *, int, unsigned int); | 55 | int (*check_acl)(struct inode *, int); |
56 | int (*setattr) (struct dentry *, struct iattr *); | 56 | int (*setattr) (struct dentry *, struct iattr *); |
57 | int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *); | 57 | int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *); |
58 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); | 58 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); |
@@ -412,7 +412,7 @@ prototypes: | |||
412 | int (*open) (struct inode *, struct file *); | 412 | int (*open) (struct inode *, struct file *); |
413 | int (*flush) (struct file *); | 413 | int (*flush) (struct file *); |
414 | int (*release) (struct inode *, struct file *); | 414 | int (*release) (struct inode *, struct file *); |
415 | int (*fsync) (struct file *, int datasync); | 415 | int (*fsync) (struct file *, loff_t start, loff_t end, int datasync); |
416 | int (*aio_fsync) (struct kiocb *, int datasync); | 416 | int (*aio_fsync) (struct kiocb *, int datasync); |
417 | int (*fasync) (int, struct file *, int); | 417 | int (*fasync) (int, struct file *, int); |
418 | int (*lock) (struct file *, int, struct file_lock *); | 418 | int (*lock) (struct file *, int, struct file_lock *); |
@@ -438,9 +438,7 @@ prototypes: | |||
438 | 438 | ||
439 | locking rules: | 439 | locking rules: |
440 | All may block except for ->setlease. | 440 | All may block except for ->setlease. |
441 | No VFS locks held on entry except for ->fsync and ->setlease. | 441 | No VFS locks held on entry except for ->setlease. |
442 | |||
443 | ->fsync() has i_mutex on inode. | ||
444 | 442 | ||
445 | ->setlease has the file_list_lock held and must not sleep. | 443 | ->setlease has the file_list_lock held and must not sleep. |
446 | 444 | ||
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index 6e29954851a2..7f8861d341ea 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting | |||
@@ -400,10 +400,31 @@ a file off. | |||
400 | 400 | ||
401 | -- | 401 | -- |
402 | [mandatory] | 402 | [mandatory] |
403 | |||
404 | -- | ||
405 | [mandatory] | ||
406 | ->get_sb() is gone. Switch to use of ->mount(). Typically it's just | 403 | ->get_sb() is gone. Switch to use of ->mount(). Typically it's just |
407 | a matter of switching from calling get_sb_... to mount_... and changing the | 404 | a matter of switching from calling get_sb_... to mount_... and changing the |
408 | function type. If you were doing it manually, just switch from setting ->mnt_root | 405 | function type. If you were doing it manually, just switch from setting ->mnt_root |
409 | to some pointer to returning that pointer. On errors return ERR_PTR(...). | 406 | to some pointer to returning that pointer. On errors return ERR_PTR(...). |
407 | |||
408 | -- | ||
409 | [mandatory] | ||
410 | ->permission(), generic_permission() and ->check_acl() have lost flags | ||
411 | argument; instead of passing IPERM_FLAG_RCU we add MAY_NOT_BLOCK into mask. | ||
412 | generic_permission() has also lost the check_acl argument; if you want | ||
413 | non-NULL to be used for that inode, put it into ->i_op->check_acl. | ||
414 | |||
415 | -- | ||
416 | [mandatory] | ||
417 | If you implement your own ->llseek() you must handle SEEK_HOLE and | ||
418 | SEEK_DATA. You can hanle this by returning -EINVAL, but it would be nicer to | ||
419 | support it in some way. The generic handler assumes that the entire file is | ||
420 | data and there is a virtual hole at the end of the file. So if the provided | ||
421 | offset is less than i_size and SEEK_DATA is specified, return the same offset. | ||
422 | If the above is true for the offset and you are given SEEK_HOLE, return the end | ||
423 | of the file. If the offset is i_size or greater return -ENXIO in either case. | ||
424 | |||
425 | [mandatory] | ||
426 | If you have your own ->fsync() you must make sure to call | ||
427 | filemap_write_and_wait_range() so that all dirty pages are synced out properly. | ||
428 | You must also keep in mind that ->fsync() is not called with i_mutex held | ||
429 | anymore, so if you require i_mutex locking you must make sure to take it and | ||
430 | release it yourself. | ||
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 88b9f5519af9..eff6617c9a0f 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -229,6 +229,8 @@ struct super_operations { | |||
229 | 229 | ||
230 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); | 230 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); |
231 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 231 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
232 | int (*nr_cached_objects)(struct super_block *); | ||
233 | void (*free_cached_objects)(struct super_block *, int); | ||
232 | }; | 234 | }; |
233 | 235 | ||
234 | All methods are called without any locks being held, unless otherwise | 236 | All methods are called without any locks being held, unless otherwise |
@@ -301,6 +303,26 @@ or bottom half). | |||
301 | 303 | ||
302 | quota_write: called by the VFS to write to filesystem quota file. | 304 | quota_write: called by the VFS to write to filesystem quota file. |
303 | 305 | ||
306 | nr_cached_objects: called by the sb cache shrinking function for the | ||
307 | filesystem to return the number of freeable cached objects it contains. | ||
308 | Optional. | ||
309 | |||
310 | free_cache_objects: called by the sb cache shrinking function for the | ||
311 | filesystem to scan the number of objects indicated to try to free them. | ||
312 | Optional, but any filesystem implementing this method needs to also | ||
313 | implement ->nr_cached_objects for it to be called correctly. | ||
314 | |||
315 | We can't do anything with any errors that the filesystem might | ||
316 | encountered, hence the void return type. This will never be called if | ||
317 | the VM is trying to reclaim under GFP_NOFS conditions, hence this | ||
318 | method does not need to handle that situation itself. | ||
319 | |||
320 | Implementations must include conditional reschedule calls inside any | ||
321 | scanning loop that is done. This allows the VFS to determine | ||
322 | appropriate scan batch sizes without having to worry about whether | ||
323 | implementations will cause holdoff problems due to large scan batch | ||
324 | sizes. | ||
325 | |||
304 | Whoever sets up the inode is responsible for filling in the "i_op" field. This | 326 | Whoever sets up the inode is responsible for filling in the "i_op" field. This |
305 | is a pointer to a "struct inode_operations" which describes the methods that | 327 | is a pointer to a "struct inode_operations" which describes the methods that |
306 | can be performed on individual inodes. | 328 | can be performed on individual inodes. |
@@ -333,8 +355,8 @@ struct inode_operations { | |||
333 | void * (*follow_link) (struct dentry *, struct nameidata *); | 355 | void * (*follow_link) (struct dentry *, struct nameidata *); |
334 | void (*put_link) (struct dentry *, struct nameidata *, void *); | 356 | void (*put_link) (struct dentry *, struct nameidata *, void *); |
335 | void (*truncate) (struct inode *); | 357 | void (*truncate) (struct inode *); |
336 | int (*permission) (struct inode *, int, unsigned int); | 358 | int (*permission) (struct inode *, int); |
337 | int (*check_acl)(struct inode *, int, unsigned int); | 359 | int (*check_acl)(struct inode *, int); |
338 | int (*setattr) (struct dentry *, struct iattr *); | 360 | int (*setattr) (struct dentry *, struct iattr *); |
339 | int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); | 361 | int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); |
340 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); | 362 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); |
@@ -423,7 +445,7 @@ otherwise noted. | |||
423 | permission: called by the VFS to check for access rights on a POSIX-like | 445 | permission: called by the VFS to check for access rights on a POSIX-like |
424 | filesystem. | 446 | filesystem. |
425 | 447 | ||
426 | May be called in rcu-walk mode (flags & IPERM_FLAG_RCU). If in rcu-walk | 448 | May be called in rcu-walk mode (mask & MAY_NOT_BLOCK). If in rcu-walk |
427 | mode, the filesystem must check the permission without blocking or | 449 | mode, the filesystem must check the permission without blocking or |
428 | storing to the inode. | 450 | storing to the inode. |
429 | 451 | ||
@@ -755,7 +777,7 @@ struct file_operations { | |||
755 | int (*open) (struct inode *, struct file *); | 777 | int (*open) (struct inode *, struct file *); |
756 | int (*flush) (struct file *); | 778 | int (*flush) (struct file *); |
757 | int (*release) (struct inode *, struct file *); | 779 | int (*release) (struct inode *, struct file *); |
758 | int (*fsync) (struct file *, int datasync); | 780 | int (*fsync) (struct file *, loff_t, loff_t, int datasync); |
759 | int (*aio_fsync) (struct kiocb *, int datasync); | 781 | int (*aio_fsync) (struct kiocb *, int datasync); |
760 | int (*fasync) (int, struct file *, int); | 782 | int (*fasync) (int, struct file *, int); |
761 | int (*lock) (struct file *, int, struct file_lock *); | 783 | int (*lock) (struct file *, int, struct file_lock *); |