]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
UBUNTU: SAUCE: Allow mounting datasets more than once (LP: #1759848)
authorColin Ian King <colin.king@canonical.com>
Thu, 29 Mar 2018 17:07:02 +0000 (18:07 +0100)
committerSeth Forshee <seth.forshee@canonical.com>
Fri, 30 Mar 2018 19:13:32 +0000 (14:13 -0500)
BugLink: https://bugs.launchpad.net/bugs/1759848
Currently mounting an already mounted zfs dataset results in an
error, whereas it is typically allowed with other filesystems.
This causes some bad interactions with mount namespaces. Take
this sequence for example:

 - Create a dataset
 - Create a snapshot of the dataset
 - Create a clone of the snapshot
 - Create a new mount namespace
 - Rename the original dataset

The rename results in unmounting and remounting the clone in the
original mount namespace, however the remount fails because the
dataset is still mounted in the new mount namespace. (Note that
this means the mount in the new mount namespace is never being
unmounted, so perhaps the unmount/remount of the clone isn't
actually necessary.)

The problem here is a result of the way mounting is implemented
in the kernel module. Since it is not mounting block devices it
uses mount_nodev() instead of the usual mount_bdev(). However,
mount_nodev() is written for filesystems for which each mount is
a new instance (i.e. a new super block), and zfs should be able
to detect when a mount request can be satisfied using an existing
super block.

Change zpl_mount() to call sget() directly with it's own test
callback. Passing the objset_t object as the fs data allows
checking if a superblock already exists for the dataset, and in
that case we just need to return a new reference for the sb's
root dentry.

[ Sync'd from zfsutils-linux, from a patch by Seth Forshee ]

Signed-off-by: Colin Ian King <colin.king@canonical.com>
[ saf: sync missing test for HAVE_FST_MOUNT ]
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
UBUNTU: SAUCE: (noup) Update zfs to 0.7.5-1ubuntu13

Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
18 files changed:
zfs/META
zfs/Makefile.in
zfs/aclocal.m4
zfs/config/kernel-fst-mount.m4 [new file with mode: 0644]
zfs/config/kernel-mount-nodev.m4 [deleted file]
zfs/config/kernel.m4
zfs/configure
zfs/include/Makefile.in
zfs/include/linux/Makefile.in
zfs/include/linux/vfs_compat.h
zfs/include/sys/Makefile.in
zfs/include/sys/crypto/Makefile.in
zfs/include/sys/fm/Makefile.in
zfs/include/sys/fm/fs/Makefile.in
zfs/include/sys/fs/Makefile.in
zfs/include/sys/sysevent/Makefile.in
zfs/module/zfs/zpl_super.c
zfs/zfs_config.h.in

index 21950640fe561dcbe74ece9decf165c4b399221a..d624ae400e3c26b067ae526291a20424eac6b6c1 100644 (file)
--- a/zfs/META
+++ b/zfs/META
@@ -2,7 +2,7 @@ Meta:         1
 Name:         zfs
 Branch:       1.0
 Version:      0.7.5
-Release:      1ubuntu12
+Release:      1ubuntu13
 Release-Tags: relext
 License:      CDDL
 Author:       OpenZFS on Linux
index ed2c4302788d4dfa451431a4de6d34b1d34b18da..7adbeba0d1383d04ea9f5e3610c4bf4bc0928444 100644 (file)
@@ -146,6 +146,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -165,7 +166,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 7d89c6e7978f50af95ac11045a7634b8996614d6..b8e2b5de42eeb1767810e1a89bfdaf856929a9d9 100644 (file)
@@ -1253,6 +1253,7 @@ m4_include([config/kernel-file-inode.m4])
 m4_include([config/kernel-fmode-t.m4])
 m4_include([config/kernel-follow-down-one.m4])
 m4_include([config/kernel-fpu.m4])
+m4_include([config/kernel-fst-mount.m4])
 m4_include([config/kernel-fsync.m4])
 m4_include([config/kernel-generic_io_acct.m4])
 m4_include([config/kernel-generic_readlink.m4])
@@ -1272,7 +1273,6 @@ m4_include([config/kernel-lseek-execute.m4])
 m4_include([config/kernel-mk-request-fn.m4])
 m4_include([config/kernel-mkdir-umode-t.m4])
 m4_include([config/kernel-mod-param.m4])
-m4_include([config/kernel-mount-nodev.m4])
 m4_include([config/kernel-objtool.m4])
 m4_include([config/kernel-open-bdev-exclusive.m4])
 m4_include([config/kernel-put-link.m4])
diff --git a/zfs/config/kernel-fst-mount.m4 b/zfs/config/kernel-fst-mount.m4
new file mode 100644 (file)
index 0000000..a8ac50b
--- /dev/null
@@ -0,0 +1,28 @@
+dnl #
+dnl # 2.6.38 API change
+dnl # The .get_sb callback has been replaced by a .mount callback
+dnl # in the file_system_type structure.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_FST_MOUNT], [
+        AC_MSG_CHECKING([whether fst->mount() exists])
+        ZFS_LINUX_TRY_COMPILE([
+                #include <linux/fs.h>
+
+                static struct dentry *
+                mount(struct file_system_type *fs_type, int flags,
+                    const char *osname, void *data) {
+                        struct dentry *d = NULL;
+                        return (d);
+                }
+
+                static struct file_system_type fst __attribute__ ((unused)) = {
+                        .mount = mount,
+                };
+        ],[
+        ],[
+                AC_MSG_RESULT(yes)
+                AC_DEFINE(HAVE_FST_MOUNT, 1, [fst->mount() exists])
+        ],[
+                AC_MSG_RESULT(no)
+        ])
+])
diff --git a/zfs/config/kernel-mount-nodev.m4 b/zfs/config/kernel-mount-nodev.m4
deleted file mode 100644 (file)
index 28a4515..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-dnl #
-dnl # 2.6.39 API change
-dnl # The .get_sb callback has been replaced by a .mount callback
-dnl # in the file_system_type structure.  When using the new
-dnl # interface the caller must now use the mount_nodev() helper.
-dnl # This updated callback and helper no longer pass the vfsmount.
-dnl #
-AC_DEFUN([ZFS_AC_KERNEL_MOUNT_NODEV],
-       [AC_MSG_CHECKING([whether mount_nodev() is available])
-       ZFS_LINUX_TRY_COMPILE_SYMBOL([
-               #include <linux/fs.h>
-       ], [
-               mount_nodev(NULL, 0, NULL, NULL);
-       ], [mount_nodev], [fs/super.c], [
-               AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_MOUNT_NODEV, 1, [mount_nodev() is available])
-       ], [
-               AC_MSG_RESULT(no)
-       ])
-])
index 8d982adb3edd64fb3f6a3cebbe7e18769a2442cb..65344e5b10a9a1e15597aab365cc3565b8c0507f 100644 (file)
@@ -98,7 +98,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_TRUNCATE_SETSIZE
        ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY
        ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY
-       ZFS_AC_KERNEL_MOUNT_NODEV
+       ZFS_AC_KERNEL_FST_MOUNT
        ZFS_AC_KERNEL_SHRINK
        ZFS_AC_KERNEL_SHRINK_CONTROL_HAS_NID
        ZFS_AC_KERNEL_S_INSTANCES_LIST_HEAD
index 157b19684af65045c2a70330bdc3a36842729a5f..b7336e94ea0e92cbf1306aa10a0725d5339451b9 100755 (executable)
 
 
 
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mount_nodev() is available" >&5
-$as_echo_n "checking whether mount_nodev() is available... " >&6; }
 
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fst->mount() exists" >&5
+$as_echo_n "checking whether fst->mount() exists... " >&6; }
 
 
 cat confdefs.h - <<_ACEOF >conftest.c
 
 
-               #include <linux/fs.h>
+                #include <linux/fs.h>
+
+                static struct dentry *
+                mount(struct file_system_type *fs_type, int flags,
+                    const char *osname, void *data) {
+                        struct dentry *d = NULL;
+                        return (d);
+                }
+
+                static struct file_system_type fst __attribute__ ((unused)) = {
+                        .mount = mount,
+                };
 
 int
 main (void)
 {
 
-               mount_nodev(NULL, 0, NULL, NULL);
 
   ;
   return 0;
@@ -23006,64 +23016,25 @@ _ACEOF
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then :
-  rc=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
- rc=1
-
 
-fi
-       rm -Rf build
-
-
-       if test $rc -ne 0; then :
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+$as_echo "#define HAVE_FST_MOUNT 1" >>confdefs.h
 
-       else
-               if test "x$enable_linux_builtin" != xyes; then
-
-       grep -q -E '[[:space:]]mount_nodev[[:space:]]' \
-               $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
-       rc=$?
-       if test $rc -ne 0; then
-               export=0
-               for file in fs/super.c; do
-                       grep -q -E "EXPORT_SYMBOL.*(mount_nodev)" \
-                               "$LINUX/$file" 2>/dev/null
-                       rc=$?
-                       if test $rc -eq 0; then
-                               export=1
-                               break;
-                       fi
-               done
-               if test $export -eq 0; then :
-                       rc=1
-               else :
-                       rc=0
-               fi
-       else :
-               rc=0
-       fi
 
-               fi
-               if test $rc -ne 0; then :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 
-               else :
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define HAVE_MOUNT_NODEV 1" >>confdefs.h
 
+fi
+       rm -Rf build
 
-               fi
-       fi
 
 
 
 
 
 
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mount_nodev() is available" >&5
-$as_echo_n "checking whether mount_nodev() is available... " >&6; }
 
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fst->mount() exists" >&5
+$as_echo_n "checking whether fst->mount() exists... " >&6; }
 
 
 cat confdefs.h - <<_ACEOF >conftest.c
 
 
-               #include <linux/fs.h>
+                #include <linux/fs.h>
+
+                static struct dentry *
+                mount(struct file_system_type *fs_type, int flags,
+                    const char *osname, void *data) {
+                        struct dentry *d = NULL;
+                        return (d);
+                }
+
+                static struct file_system_type fst __attribute__ ((unused)) = {
+                        .mount = mount,
+                };
 
 int
 main (void)
 {
 
-               mount_nodev(NULL, 0, NULL, NULL);
 
   ;
   return 0;
@@ -37808,64 +37789,25 @@ _ACEOF
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; }; then :
-  rc=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
- rc=1
-
 
-fi
-       rm -Rf build
-
-
-       if test $rc -ne 0; then :
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+$as_echo "#define HAVE_FST_MOUNT 1" >>confdefs.h
 
-       else
-               if test "x$enable_linux_builtin" != xyes; then
-
-       grep -q -E '[[:space:]]mount_nodev[[:space:]]' \
-               $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
-       rc=$?
-       if test $rc -ne 0; then
-               export=0
-               for file in fs/super.c; do
-                       grep -q -E "EXPORT_SYMBOL.*(mount_nodev)" \
-                               "$LINUX/$file" 2>/dev/null
-                       rc=$?
-                       if test $rc -eq 0; then
-                               export=1
-                               break;
-                       fi
-               done
-               if test $export -eq 0; then :
-                       rc=1
-               else :
-                       rc=0
-               fi
-       else :
-               rc=0
-       fi
 
-               fi
-               if test $rc -ne 0; then :
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 
-               else :
 
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define HAVE_MOUNT_NODEV 1" >>confdefs.h
 
+fi
+       rm -Rf build
 
-               fi
-       fi
 
 
 
index acd99dcf2e15beedccb78288be482d2d738ebc45..cc11bc4ce739098753dbe0f4b044fe98d66d623a 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 1002d83470863c9b2f5fd092ce41345f8645a6c5..28a724ef3130735e18c12c72697ebb8ca6d25e99 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 6111f0afca1d86332900654b78f836267abb17f3..ae77af841cb5e4cb95558b368e65f78162690854 100644 (file)
@@ -182,6 +182,30 @@ zpl_bdi_destroy(struct super_block *sb)
 }
 #endif
 
+/*
+ * 4.14 adds SB_* flag definitions, define them to MS_* equivalents
+ * if not set.
+ */
+#ifndef        SB_RDONLY
+#define        SB_RDONLY       MS_RDONLY
+#endif
+
+#ifndef        SB_SILENT
+#define        SB_SILENT       MS_SILENT
+#endif
+
+#ifndef        SB_ACTIVE
+#define        SB_ACTIVE       MS_ACTIVE
+#endif
+
+#ifndef        SB_POSIXACL
+#define        SB_POSIXACL     MS_POSIXACL
+#endif
+
+#ifndef        SB_MANDLOCK
+#define        SB_MANDLOCK     MS_MANDLOCK
+#endif
+
 /*
  * 2.6.38 API change,
  * LOOKUP_RCU flag introduced to distinguish rcu-walk from ref-walk cases.
index c24010a0b96215e2d69ffad3163c1989a362863c..4afd5fa08513f4264dc839efd5cfee67e49a769a 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 79a03c57caaac0078be586a92128e633952be8d8..b61884240020b548c571471b304cc404bc4c1de5 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index a73b969694ad6cad2d4ffdc410203bb1cf010b48..0d735864bf75e214e9b0fa08dfab1e6ecf924cb9 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 03e3298920834867cc4ac1d4dc13293f959644d0..4d66b974a4b9035c7e457371a79482239e832996 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 8ea51c9fc7bff9bda2d73b09a632919351c980dd..1e062378add383ef561bd7a0528e24d3a2fc4ce8 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index 2a9b504753201b06f64a1a3b4a71ab6ac27caf94..e17bae57c99a180f2b2a55ddbd1f367c329fa324 100644 (file)
@@ -138,6 +138,7 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-fmode-t.m4 \
        $(top_srcdir)/config/kernel-follow-down-one.m4 \
        $(top_srcdir)/config/kernel-fpu.m4 \
+       $(top_srcdir)/config/kernel-fst-mount.m4 \
        $(top_srcdir)/config/kernel-fsync.m4 \
        $(top_srcdir)/config/kernel-generic_io_acct.m4 \
        $(top_srcdir)/config/kernel-generic_readlink.m4 \
@@ -157,7 +158,6 @@ am__aclocal_m4_deps = $(top_srcdir)/config/always-arch.m4 \
        $(top_srcdir)/config/kernel-mk-request-fn.m4 \
        $(top_srcdir)/config/kernel-mkdir-umode-t.m4 \
        $(top_srcdir)/config/kernel-mod-param.m4 \
-       $(top_srcdir)/config/kernel-mount-nodev.m4 \
        $(top_srcdir)/config/kernel-objtool.m4 \
        $(top_srcdir)/config/kernel-open-bdev-exclusive.m4 \
        $(top_srcdir)/config/kernel-put-link.m4 \
index b6ef60277664b76b086ad5ba7836a9163ace5ece..848bb3c1062796ed09ea36b565e5ad23af14fae4 100644 (file)
@@ -248,14 +248,61 @@ zpl_fill_super(struct super_block *sb, void *data, int silent)
        return (error);
 }
 
-#ifdef HAVE_MOUNT_NODEV
+static int
+zpl_test_super(struct super_block *s, void *data)
+{
+       zfsvfs_t *zfsvfs = s->s_fs_info;
+       objset_t *os = data;
+
+       if (zfsvfs == NULL)
+               return (0);
+
+       return (os == zfsvfs->z_os);
+}
+
+static struct super_block *
+zpl_mount_impl(struct file_system_type *fs_type, int flags, zfs_mnt_t *zm)
+{
+       struct super_block *s;
+       objset_t *os;
+       int err;
+
+       err = dmu_objset_hold(zm->mnt_osname, FTAG, &os);
+       if (err)
+               return (ERR_PTR(-err));
+
+       s = zpl_sget(fs_type, zpl_test_super, set_anon_super, flags, os);
+       dmu_objset_rele(os, FTAG);
+       if (IS_ERR(s))
+               return (ERR_CAST(s));
+
+       if (s->s_root == NULL) {
+               err = zpl_fill_super(s, zm, flags & SB_SILENT ? 1 : 0);
+               if (err) {
+                       deactivate_locked_super(s);
+                       return (ERR_PTR(err));
+               }
+               s->s_flags |= SB_ACTIVE;
+       } else if ((flags ^ s->s_flags) & SB_RDONLY) {
+               deactivate_locked_super(s);
+               return (ERR_PTR(-EBUSY));
+       }
+
+       return (s);
+}
+
+#ifdef HAVE_FST_MOUNT
 static struct dentry *
 zpl_mount(struct file_system_type *fs_type, int flags,
     const char *osname, void *data)
 {
        zfs_mnt_t zm = { .mnt_osname = osname, .mnt_data = data };
 
-       return (mount_nodev(fs_type, flags, &zm, zpl_fill_super));
+       struct super_block *sb = zpl_mount_impl(fs_type, flags, &zm);
+       if (IS_ERR(sb))
+               return (ERR_CAST(sb));
+
+       return (dget(sb->s_root));
 }
 #else
 static int
@@ -264,9 +311,15 @@ zpl_get_sb(struct file_system_type *fs_type, int flags,
 {
        zfs_mnt_t zm = { .mnt_osname = osname, .mnt_data = data };
 
-       return (get_sb_nodev(fs_type, flags, &zm, zpl_fill_super, mnt));
+       struct super_block *sb = zpl_mount_impl(fs_type, flags, &zm);
+       if (IS_ERR(sb))
+               return (PTR_ERR(sb));
+
+       (void) simple_set_mnt(mnt, sb);
+
+       return (0);
 }
-#endif /* HAVE_MOUNT_NODEV */
+#endif /* HAVE_FST_MOUNT */
 
 static void
 zpl_kill_sb(struct super_block *sb)
@@ -333,10 +386,10 @@ const struct super_operations zpl_super_operations = {
 struct file_system_type zpl_fs_type = {
        .owner                  = THIS_MODULE,
        .name                   = ZFS_DRIVER,
-#ifdef HAVE_MOUNT_NODEV
+#ifdef HAVE_FST_MOUNT
        .mount                  = zpl_mount,
 #else
        .get_sb                 = zpl_get_sb,
-#endif /* HAVE_MOUNT_NODEV */
+#endif /* HAVE_FST_MOUNT */
        .kill_sb                = zpl_kill_sb,
 };
index a87d6ac187b0c84af99df7735f19c7c92af23c99..69bb8fda8a9aae8d310ed5d3c82ad1f97e537561 100644 (file)
 /* sops->free_cached_objects() exists */
 #undef HAVE_FREE_CACHED_OBJECTS
 
+/* fst->mount() exists */
+#undef HAVE_FST_MOUNT
+
 /* fops->fsync() with range */
 #undef HAVE_FSYNC_RANGE
 
 /* Define to 1 if you have the `mlockall' function. */
 #undef HAVE_MLOCKALL
 
-/* mount_nodev() is available */
-#undef HAVE_MOUNT_NODEV
-
 /* new_sync_read() is available */
 #undef HAVE_NEW_SYNC_READ