]> granicus.if.org Git - zfs/commitdiff
Fix "zfs destroy" when "sharenfs=on" is used
authorPrakash Surya <prakash.surya@delphix.com>
Fri, 21 Sep 2018 15:47:42 +0000 (08:47 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 3 Oct 2018 17:17:58 +0000 (10:17 -0700)
When using "zfs destroy" on a dataset that is using "sharenfs=on" and
has been automatically exported (by libzfs), the dataset will not be
automatically unexported as it should be. This workflow appears to have
been broken by this commit: 3fd3e56cfd543d7d7a1bf502bfc0db6e24139668

In that change, the "zfs_unmount" function was modified to use the
"mnt.mnt_special" field when determining the mount point that is being
unmounted, rather than "mnt.mnt_mountp".

As a result, when "mntpt" is passed into "zfs_unshare_proto", it's value
is now the dataset name rather than the mountpoint. Thus, when this
value is used with the "is_shared" function (via "zfs_unshare_proto") it
will not find a match (since that function assumes it'll be passed the
mountpoint) and incorrectly reports that the dataset is not shared.

This can be easily reproduced with the following commands:

    $ sudo zpool create tank xvdb
    $ sudo zfs create -o sharenfs=on tank/fish
    $ sudo zfs destroy tank/fish

    $ sudo zfs list -r tank
    NAME   USED  AVAIL  REFER  MOUNTPOINT
    tank  97.5K  7.27G    24K  /tank

    $ sudo exportfs
    /tank/fish      <world>
    $ sudo cat /etc/dfs/sharetab
    /tank/fish      -       nfs     rw,crossmnt

At this point, the "tank/fish" filesystem doesn't exist, but it's still
listed as exported when looking at "exportfs" and "/etc/dfs/sharetab".

Also note, this change brings us back in-sync with the illumos code, as
it pertains to this one line; on illumos, "mnt.mnt_mountp" is used.

Reviewed by: loli10K <ezomori.nozomu@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Co-authored-by: George Wilson <george.wilson@delphix.com>
Signed-off-by: Prakash Surya <prakash.surya@delphix.com>
Issue #6143
Closes #7941

lib/libzfs/libzfs_mount.c
tests/test-runner/bin/zts-report.py
tests/zfs-tests/tests/functional/snapshot/rollback_003_pos.ksh

index 59b98a28450e7f20c7cd9545822cc3ef7c00bac5..252112e24bd3f802ef4d12b3364da8c59a0d95ca 100644 (file)
@@ -664,7 +664,7 @@ zfs_unmount(zfs_handle_t *zhp, const char *mountpoint, int flags)
                 * then get freed later. We strdup it to play it safe.
                 */
                if (mountpoint == NULL)
-                       mntpt = zfs_strdup(hdl, entry.mnt_special);
+                       mntpt = zfs_strdup(hdl, entry.mnt_mountp);
                else
                        mntpt = zfs_strdup(hdl, mountpoint);
 
index d4e743a171a9d17c073745f07c4e6731fec42f15..efee5d989bcfcef895c4e6241e4de2719f601235 100755 (executable)
@@ -184,6 +184,7 @@ known = {
     'removal/removal_with_zdb': ['SKIP', known_reason],
     'rootpool/setup': ['SKIP', na_reason],
     'rsend/rsend_008_pos': ['SKIP', '6066'],
+    'snapshot/rollback_003_pos': ['SKIP', '6143'],
     'vdev_zaps/vdev_zaps_007_pos': ['FAIL', known_reason],
     'xattr/xattr_008_pos': ['SKIP', na_reason],
     'xattr/xattr_009_neg': ['SKIP', na_reason],
index 9b1e400db56e075a3c7e84fd8d556b077ca99593..342e7df58fb50550d22234a059b83685dc2fd4d0 100755 (executable)
 
 verify_runnable "both"
 
+if is_linux; then
+       log_unsupported "Test case is known to fail on Linux"
+fi
+
 function cleanup
 {
        typeset snap=""