mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 19:19:32 +03:00
Fix "zfs destroy" when "sharenfs=on" is used
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: 3fd3e56cfd
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
This commit is contained in:
parent
c955398b52
commit
1bf490ba93
@ -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);
|
||||
|
||||
|
@ -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],
|
||||
|
@ -48,6 +48,10 @@
|
||||
|
||||
verify_runnable "both"
|
||||
|
||||
if is_linux; then
|
||||
log_unsupported "Test case is known to fail on Linux"
|
||||
fi
|
||||
|
||||
function cleanup
|
||||
{
|
||||
typeset snap=""
|
||||
|
Loading…
Reference in New Issue
Block a user