xfs: Make xfs_vn_rename compliant with renameat2() syscall
authorCarlos Maiolino <cmaiolino@redhat.com>
Tue, 23 Dec 2014 21:51:38 +0000 (08:51 +1100)
committerDave Chinner <david@fromorbit.com>
Tue, 23 Dec 2014 21:51:38 +0000 (08:51 +1100)
To be able to support RENAME_EXCHANGE flag from renameat2() system
call, XFS must have its inode_operations updated, exporting .rename2
method, instead of .rename.

This patch just replaces the (now old) .rename method by .rename2,
using the same infra-structure, but checking rename flags.  Calls to
.rename2 using RENAME_EXCHANGE flag, although now handled inside
XFS, still return -EINVAL.

RENAME_NOREPLACE is handled via VFS and we don't need to care about
it inside xfs_vn_rename.

Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_iops.c

index c50311cae1b1c294759841486d328e09a31e83ca..abb838a565ee6eb1b97b4b7d02305a3770af461d 100644 (file)
@@ -380,18 +380,23 @@ xfs_vn_rename(
        struct inode    *odir,
        struct dentry   *odentry,
        struct inode    *ndir,
-       struct dentry   *ndentry)
+       struct dentry   *ndentry,
+       unsigned int    flags)
 {
        struct inode    *new_inode = ndentry->d_inode;
        struct xfs_name oname;
        struct xfs_name nname;
 
+       /* XFS does not support RENAME_EXCHANGE yet */
+       if (flags & ~RENAME_NOREPLACE)
+               return -EINVAL;
+
        xfs_dentry_to_name(&oname, odentry, 0);
        xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode);
 
        return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
-                         XFS_I(ndir), &nname, new_inode ?
-                                               XFS_I(new_inode) : NULL);
+                         XFS_I(ndir), &nname,
+                         new_inode ? XFS_I(new_inode) : NULL);
 }
 
 /*
@@ -1144,7 +1149,7 @@ static const struct inode_operations xfs_dir_inode_operations = {
         */
        .rmdir                  = xfs_vn_unlink,
        .mknod                  = xfs_vn_mknod,
-       .rename                 = xfs_vn_rename,
+       .rename2                = xfs_vn_rename,
        .get_acl                = xfs_get_acl,
        .set_acl                = xfs_set_acl,
        .getattr                = xfs_vn_getattr,
@@ -1172,7 +1177,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = {
         */
        .rmdir                  = xfs_vn_unlink,
        .mknod                  = xfs_vn_mknod,
-       .rename                 = xfs_vn_rename,
+       .rename2                = xfs_vn_rename,
        .get_acl                = xfs_get_acl,
        .set_acl                = xfs_set_acl,
        .getattr                = xfs_vn_getattr,