summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLOLi <[email protected]>2016-11-29 20:22:38 +0100
committerBrian Behlendorf <[email protected]>2016-11-29 12:22:38 -0700
commit2f71caf2d926249920d1b9162550c56715cc6461 (patch)
treef970d0355d9a315d16aac3afc138f2af229b1f8f /lib
parent251cb8dfacb51b9ad7a0e3da305c0bc5bbc1cb9e (diff)
Allow zfs unshare <protocol> -a
Allow `zfs unshare <protocol> -a` command to share or unshare all datasets of a given protocol, nfs or smb. Additionally, enable most of ZFS Test Suite zfs_share/zfs_unshare test cases. To work around some Illumos-specific functionalities ($SHARE/$UNSHARE) some function wrappers were added around them. Finally, fix and issue in smb_is_share_active() that would leave SMB shares exported when invoking 'zfs unshare -a' Reviewed-by: Giuseppe Di Natale <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Turbo Fredriksson <[email protected]> Signed-off-by: loli10K <[email protected]> Closes #3238 Closes #5367
Diffstat (limited to 'lib')
-rw-r--r--lib/libshare/smb.c8
-rw-r--r--lib/libzfs/libzfs_mount.c14
2 files changed, 19 insertions, 3 deletions
diff --git a/lib/libshare/smb.c b/lib/libshare/smb.c
index f8b7118a3..343586508 100644
--- a/lib/libshare/smb.c
+++ b/lib/libshare/smb.c
@@ -354,17 +354,19 @@ smb_validate_shareopts(const char *shareopts)
static boolean_t
smb_is_share_active(sa_share_impl_t impl_share)
{
+ smb_share_t *iter = smb_shares;
+
if (!smb_available())
return (B_FALSE);
/* Retrieve the list of (possible) active shares */
smb_retrieve_shares();
- while (smb_shares != NULL) {
- if (strcmp(impl_share->sharepath, smb_shares->path) == 0)
+ while (iter != NULL) {
+ if (strcmp(impl_share->sharepath, iter->path) == 0)
return (B_TRUE);
- smb_shares = smb_shares->next;
+ iter = iter->next;
}
return (B_FALSE);
diff --git a/lib/libzfs/libzfs_mount.c b/lib/libzfs/libzfs_mount.c
index 44781679d..ad8a3d20b 100644
--- a/lib/libzfs/libzfs_mount.c
+++ b/lib/libzfs/libzfs_mount.c
@@ -988,6 +988,20 @@ zfs_unshareall_bypath(zfs_handle_t *zhp, const char *mountpoint)
return (zfs_unshare_proto(zhp, mountpoint, share_all_proto));
}
+int
+zfs_unshareall_bytype(zfs_handle_t *zhp, const char *mountpoint,
+ const char *proto)
+{
+ if (proto == NULL)
+ return (zfs_unshare_proto(zhp, mountpoint, share_all_proto));
+ if (strcmp(proto, "nfs") == 0)
+ return (zfs_unshare_proto(zhp, mountpoint, nfs_only));
+ else if (strcmp(proto, "smb") == 0)
+ return (zfs_unshare_proto(zhp, mountpoint, smb_only));
+ else
+ return (1);
+}
+
/*
* Remove the mountpoint associated with the current dataset, if necessary.
* We only remove the underlying directory if: