Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux.git] / Documentation / filesystems / vfs.txt
index 419e7348c481679da09a5721711cc56a32279abd..617f6d70c0778ce37716d25fde6f0c158f492707 100644 (file)
@@ -347,6 +347,8 @@ struct inode_operations {
        int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
        int (*rename) (struct inode *, struct dentry *,
                        struct inode *, struct dentry *);
+       int (*rename2) (struct inode *, struct dentry *,
+                       struct inode *, struct dentry *, unsigned int);
        int (*readlink) (struct dentry *, char __user *,int);
         void * (*follow_link) (struct dentry *, struct nameidata *);
         void (*put_link) (struct dentry *, struct nameidata *, void *);
@@ -414,6 +416,20 @@ otherwise noted.
   rename: called by the rename(2) system call to rename the object to
        have the parent and name given by the second inode and dentry.
 
+  rename2: this has an additional flags argument compared to rename.
+       If no flags are supported by the filesystem then this method
+       need not be implemented.  If some flags are supported then the
+       filesystem must return -EINVAL for any unsupported or unknown
+       flags.  Currently the following flags are implemented:
+       (1) RENAME_NOREPLACE: this flag indicates that if the target
+       of the rename exists the rename should fail with -EEXIST
+       instead of replacing the target.  The VFS already checks for
+       existence, so for local filesystems the RENAME_NOREPLACE
+       implementation is equivalent to plain rename.
+       (2) RENAME_EXCHANGE: exchange source and target.  Both must
+       exist; this is checked by the VFS.  Unlike plain rename,
+       source and target may be of different type.
+
   readlink: called by the readlink(2) system call. Only required if
        you want to support reading symbolic links