]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 4.9 compat: iops->rename() wants flags
authorChunwei Chen <david.chen@osnexus.com>
Wed, 19 Oct 2016 18:19:01 +0000 (11:19 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 20 Oct 2016 16:39:09 +0000 (09:39 -0700)
In Linux 4.9, torvalds/linux@2773bf0, iops->rename() and iops->rename2() are
merged together into iops->rename(), it now wants flags.

Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
config/kernel-rename.m4 [new file with mode: 0644]
config/kernel.m4
module/zfs/zpl_ctldir.c
module/zfs/zpl_inode.c

diff --git a/config/kernel-rename.m4 b/config/kernel-rename.m4
new file mode 100644 (file)
index 0000000..9f894fb
--- /dev/null
@@ -0,0 +1,25 @@
+dnl #
+dnl # 4.9 API change,
+dnl # iops->rename2() merged into iops->rename(), and iops->rename() now wants
+dnl # flags.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_RENAME_WANTS_FLAGS], [
+       AC_MSG_CHECKING([whether iops->rename() wants flags])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/fs.h>
+               int rename_fn(struct inode *sip, struct dentry *sdp,
+                       struct inode *tip, struct dentry *tdp,
+                       unsigned int flags) { return 0; }
+
+               static const struct inode_operations
+                   iops __attribute__ ((unused)) = {
+                       .rename = rename_fn,
+               };
+       ],[
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_RENAME_WANTS_FLAGS, 1, [iops->rename() wants flags])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index c53e6115784170367e26f825dea67f2ba1d59104..37635256b322298804933a34b5f0c951cbc20d45 100644 (file)
@@ -103,6 +103,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_FPU
        ZFS_AC_KERNEL_KUID_HELPERS
        ZFS_AC_KERNEL_MODULE_PARAM_CALL_CONST
+       ZFS_AC_KERNEL_RENAME_WANTS_FLAGS
 
        AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
                KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ"
index 7c4fcea3e43c4efa485babde8720ebdf03ef03dc..cdd6668b1dc008a0be1e67fd1a6245448acf7947 100644 (file)
@@ -301,13 +301,17 @@ zpl_snapdir_readdir(struct file *filp, void *dirent, filldir_t filldir)
 }
 #endif /* HAVE_VFS_ITERATE */
 
-int
-zpl_snapdir_rename(struct inode *sdip, struct dentry *sdentry,
-    struct inode *tdip, struct dentry *tdentry)
+static int
+zpl_snapdir_rename2(struct inode *sdip, struct dentry *sdentry,
+    struct inode *tdip, struct dentry *tdentry, unsigned int flags)
 {
        cred_t *cr = CRED();
        int error;
 
+       /* We probably don't want to support renameat2(2) in ctldir */
+       if (flags)
+               return (-EINVAL);
+
        crhold(cr);
        error = -zfsctl_snapdir_rename(sdip, dname(sdentry),
            tdip, dname(tdentry), cr, 0);
@@ -317,6 +321,15 @@ zpl_snapdir_rename(struct inode *sdip, struct dentry *sdentry,
        return (error);
 }
 
+#ifndef HAVE_RENAME_WANTS_FLAGS
+static int
+zpl_snapdir_rename(struct inode *sdip, struct dentry *sdentry,
+    struct inode *tdip, struct dentry *tdentry)
+{
+       return (zpl_snapdir_rename2(sdip, sdentry, tdip, tdentry, 0));
+}
+#endif
+
 static int
 zpl_snapdir_rmdir(struct inode *dip, struct dentry *dentry)
 {
@@ -405,7 +418,11 @@ const struct file_operations zpl_fops_snapdir = {
 const struct inode_operations zpl_ops_snapdir = {
        .lookup         = zpl_snapdir_lookup,
        .getattr        = zpl_snapdir_getattr,
+#ifdef HAVE_RENAME_WANTS_FLAGS
+       .rename         = zpl_snapdir_rename2,
+#else
        .rename         = zpl_snapdir_rename,
+#endif
        .rmdir          = zpl_snapdir_rmdir,
        .mkdir          = zpl_snapdir_mkdir,
 };
index d26193ffa5b355204fdec901ab5566a424a8185c..113885ead7eb483d87455dca4182cdd0abd47ff4 100644 (file)
@@ -356,13 +356,17 @@ zpl_setattr(struct dentry *dentry, struct iattr *ia)
 }
 
 static int
-zpl_rename(struct inode *sdip, struct dentry *sdentry,
-    struct inode *tdip, struct dentry *tdentry)
+zpl_rename2(struct inode *sdip, struct dentry *sdentry,
+    struct inode *tdip, struct dentry *tdentry, unsigned int flags)
 {
        cred_t *cr = CRED();
        int error;
        fstrans_cookie_t cookie;
 
+       /* We don't have renameat2(2) support */
+       if (flags)
+               return (-EINVAL);
+
        crhold(cr);
        cookie = spl_fstrans_mark();
        error = -zfs_rename(sdip, dname(sdentry), tdip, dname(tdentry), cr, 0);
@@ -373,6 +377,15 @@ zpl_rename(struct inode *sdip, struct dentry *sdentry,
        return (error);
 }
 
+#ifndef HAVE_RENAME_WANTS_FLAGS
+static int
+zpl_rename(struct inode *sdip, struct dentry *sdentry,
+    struct inode *tdip, struct dentry *tdentry)
+{
+       return (zpl_rename2(sdip, sdentry, tdip, tdentry, 0));
+}
+#endif
+
 static int
 zpl_symlink(struct inode *dir, struct dentry *dentry, const char *name)
 {
@@ -681,7 +694,11 @@ const struct inode_operations zpl_dir_inode_operations = {
        .mkdir          = zpl_mkdir,
        .rmdir          = zpl_rmdir,
        .mknod          = zpl_mknod,
+#ifdef HAVE_RENAME_WANTS_FLAGS
+       .rename         = zpl_rename2,
+#else
        .rename         = zpl_rename,
+#endif
        .setattr        = zpl_setattr,
        .getattr        = zpl_getattr,
        .setxattr       = generic_setxattr,