]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Replace libzfs sharing _nfs() and _smb() APIs with protocol lists
authorнаб <nabijaczleweli@nabijaczleweli.xyz>
Mon, 28 Feb 2022 15:52:07 +0000 (16:52 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 12 May 2022 16:26:42 +0000 (09:26 -0700)
With the additional benefit of removing all the _all() functions and
treating a NULL list as "all" ‒ the remaining all function is for all
/datasets/, which is consistent with the rest of the API

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #13165

cmd/zfs/zfs_main.c
cmd/zpool/zpool_main.c
include/libzfs.h
lib/libzfs/libzfs.abi
lib/libzfs/libzfs_changelist.c
lib/libzfs/libzfs_dataset.c
lib/libzfs/libzfs_impl.h
lib/libzfs/libzfs_mount.c

index c7c826aeceb074e391fdae3981400c806531f335..69f5bdf4d4949acbcc86cd3a9744724a93663511 100644 (file)
@@ -764,12 +764,12 @@ zfs_mount_and_share(libzfs_handle_t *hdl, const char *dataset, zfs_type_t type)
                        (void) fprintf(stderr, gettext("filesystem "
                            "successfully created, but not mounted\n"));
                        ret = 1;
-               } else if (zfs_share(zhp) != 0) {
+               } else if (zfs_share(zhp, NULL) != 0) {
                        (void) fprintf(stderr, gettext("filesystem "
                            "successfully created, but not shared\n"));
                        ret = 1;
                }
-               zfs_commit_all_shares();
+               zfs_commit_shares(NULL);
        }
 
        zfs_close(zhp);
@@ -6658,7 +6658,7 @@ typedef struct share_mount_state {
        boolean_t       sm_verbose;
        int     sm_flags;
        char    *sm_options;
-       char    *sm_proto; /* only valid for OP_SHARE */
+       enum sa_protocol        sm_proto; /* only valid for OP_SHARE */
        pthread_mutex_t sm_lock; /* protects the remaining fields */
        uint_t  sm_total; /* number of filesystems to process */
        uint_t  sm_done; /* number of filesystems processed */
@@ -6669,7 +6669,7 @@ typedef struct share_mount_state {
  * Share or mount a dataset.
  */
 static int
-share_mount_one(zfs_handle_t *zhp, int op, int flags, char *protocol,
+share_mount_one(zfs_handle_t *zhp, int op, int flags, enum sa_protocol protocol,
     boolean_t explicit, const char *options)
 {
        char mountpoint[ZFS_MAXPROPLEN];
@@ -6787,7 +6787,7 @@ share_mount_one(zfs_handle_t *zhp, int op, int flags, char *protocol,
                        return (0);
                if (op == OP_SHARE && !zfs_is_mounted(zhp, NULL)) {
                        /* also purge it from existing exports */
-                       zfs_unshareall_bypath(zhp, mountpoint);
+                       zfs_unshare(zhp, mountpoint, NULL);
                        return (0);
                }
        }
@@ -6845,10 +6845,11 @@ share_mount_one(zfs_handle_t *zhp, int op, int flags, char *protocol,
         * filesystem.
         */
        switch (op) {
-       case OP_SHARE:
-
-               shared_nfs = zfs_is_shared_nfs(zhp, NULL);
-               shared_smb = zfs_is_shared_smb(zhp, NULL);
+       case OP_SHARE: {
+               enum sa_protocol prot[] = {SA_PROTOCOL_NFS, SA_NO_PROTOCOL};
+               shared_nfs = zfs_is_shared(zhp, NULL, prot);
+               *prot = SA_PROTOCOL_SMB;
+               shared_smb = zfs_is_shared(zhp, NULL, prot);
 
                if ((shared_nfs && shared_smb) ||
                    (shared_nfs && strcmp(shareopts, "on") == 0 &&
@@ -6868,23 +6869,11 @@ share_mount_one(zfs_handle_t *zhp, int op, int flags, char *protocol,
                    zfs_mount(zhp, NULL, flags) != 0)
                        return (1);
 
-               if (protocol == NULL) {
-                       if (zfs_shareall(zhp) != 0)
-                               return (1);
-               } else if (strcmp(protocol, "nfs") == 0) {
-                       if (zfs_share_nfs(zhp))
-                               return (1);
-               } else if (strcmp(protocol, "smb") == 0) {
-                       if (zfs_share_smb(zhp))
-                               return (1);
-               } else {
-                       (void) fprintf(stderr, gettext("cannot share "
-                           "'%s': invalid share type '%s' "
-                           "specified\n"),
-                           zfs_get_name(zhp), protocol);
+               *prot = protocol;
+               if (zfs_share(zhp, protocol == SA_NO_PROTOCOL ? NULL : prot))
                        return (1);
-               }
 
+       }
                break;
 
        case OP_MOUNT:
@@ -6982,6 +6971,22 @@ append_options(char *mntopts, char *newopts)
        (void) strcpy(&mntopts[len], newopts);
 }
 
+static enum sa_protocol
+sa_protocol_decode(const char *protocol)
+{
+       for (enum sa_protocol i = 0; i < ARRAY_SIZE(sa_protocol_names); ++i)
+               if (strcmp(protocol, sa_protocol_names[i]) == 0)
+                       return (i);
+
+       (void) fputs(gettext("share type must be one of: "), stderr);
+       for (enum sa_protocol i = 0;
+           i < ARRAY_SIZE(sa_protocol_names); ++i)
+               (void) fprintf(stderr, "%s%s",
+                   i != 0 ? ", " : "", sa_protocol_names[i]);
+       (void) fputc('\n', stderr);
+       usage(B_FALSE);
+}
+
 static int
 share_mount(int op, int argc, char **argv)
 {
@@ -7040,16 +7045,10 @@ share_mount(int op, int argc, char **argv)
 
        /* check number of arguments */
        if (do_all) {
-               char *protocol = NULL;
+               enum sa_protocol protocol = SA_NO_PROTOCOL;
 
                if (op == OP_SHARE && argc > 0) {
-                       if (strcmp(argv[0], "nfs") != 0 &&
-                           strcmp(argv[0], "smb") != 0) {
-                               (void) fprintf(stderr, gettext("share type "
-                                   "must be 'nfs' or 'smb'\n"));
-                               usage(B_FALSE);
-                       }
-                       protocol = argv[0];
+                       protocol = sa_protocol_decode(argv[0]);
                        argc--;
                        argv++;
                }
@@ -7086,7 +7085,7 @@ share_mount(int op, int argc, char **argv)
                zfs_foreach_mountpoint(g_zfs, cb.cb_handles, cb.cb_used,
                    share_mount_one_cb, &share_mount_state,
                    op == OP_MOUNT && !(flags & MS_CRYPT));
-               zfs_commit_all_shares();
+               zfs_commit_shares(NULL);
 
                ret = share_mount_state.sm_status;
 
@@ -7138,9 +7137,9 @@ share_mount(int op, int argc, char **argv)
                    ZFS_TYPE_FILESYSTEM)) == NULL) {
                        ret = 1;
                } else {
-                       ret = share_mount_one(zhp, op, flags, NULL, B_TRUE,
-                           options);
-                       zfs_commit_all_shares();
+                       ret = share_mount_one(zhp, op, flags, SA_NO_PROTOCOL,
+                           B_TRUE, options);
+                       zfs_commit_shares(NULL);
                        zfs_close(zhp);
                }
        }
@@ -7150,7 +7149,7 @@ share_mount(int op, int argc, char **argv)
 }
 
 /*
- * zfs mount -a [nfs]
+ * zfs mount -a
  * zfs mount filesystem
  *
  * Mount all filesystems, or mount the given filesystem.
@@ -7259,12 +7258,12 @@ unshare_unmount_path(int op, char *path, int flags, boolean_t is_manual)
                            "'%s': legacy share\n"), path);
                        (void) fprintf(stderr, gettext("use exportfs(8) "
                            "or smbcontrol(1) to unshare this filesystem\n"));
-               } else if (!zfs_is_shared(zhp)) {
+               } else if (!zfs_is_shared(zhp, NULL, NULL)) {
                        (void) fprintf(stderr, gettext("cannot unshare '%s': "
                            "not currently shared\n"), path);
                } else {
-                       ret = zfs_unshareall_bypath(zhp, path);
-                       zfs_commit_all_shares();
+                       ret = zfs_unshare(zhp, path, NULL);
+                       zfs_commit_shares(NULL);
                }
        } else {
                char mtpt_prop[ZFS_MAXPROPLEN];
@@ -7354,16 +7353,12 @@ unshare_unmount(int op, int argc, char **argv)
                unshare_unmount_node_t *node;
                uu_avl_index_t idx;
                uu_avl_walk_t *walk;
-               char *protocol = NULL;
+               enum sa_protocol *protocol = NULL,
+                   single_protocol[] = {SA_NO_PROTOCOL, SA_NO_PROTOCOL};
 
                if (op == OP_SHARE && argc > 0) {
-                       if (strcmp(argv[0], "nfs") != 0 &&
-                           strcmp(argv[0], "smb") != 0) {
-                               (void) fprintf(stderr, gettext("share type "
-                                   "must be 'nfs' or 'smb'\n"));
-                               usage(B_FALSE);
-                       }
-                       protocol = argv[0];
+                       *single_protocol = sa_protocol_decode(argv[0]);
+                       protocol = single_protocol;
                        argc--;
                        argv++;
                }
@@ -7470,7 +7465,7 @@ unshare_unmount(int op, int argc, char **argv)
                        uu_avl_remove(tree, node);
                        switch (op) {
                        case OP_SHARE:
-                               if (zfs_unshareall_bytype(node->un_zhp,
+                               if (zfs_unshare(node->un_zhp,
                                    node->un_mountp, protocol) != 0)
                                        ret = 1;
                                break;
@@ -7543,12 +7538,12 @@ unshare_unmount(int op, int argc, char **argv)
                                    "exports(5) or smb.conf(5) to unshare "
                                    "this filesystem\n"));
                                ret = 1;
-                       } else if (!zfs_is_shared(zhp)) {
+                       } else if (!zfs_is_shared(zhp, NULL, NULL)) {
                                (void) fprintf(stderr, gettext("cannot "
                                    "unshare '%s': not currently "
                                    "shared\n"), zfs_get_name(zhp));
                                ret = 1;
-                       } else if (zfs_unshareall(zhp) != 0) {
+                       } else if (zfs_unshareall(zhp, NULL) != 0) {
                                ret = 1;
                        }
                        break;
index aa61ff7c94244530412fca1b102a3c8d30b8bdc8..bfe798ffe4cdb58eefefab55c5fda18607a4be23 100644 (file)
@@ -1790,8 +1790,8 @@ zpool_do_create(int argc, char **argv)
                            tname ? tname : poolname, ZFS_TYPE_FILESYSTEM);
                        if (pool != NULL) {
                                if (zfs_mount(pool, NULL, 0) == 0) {
-                                       ret = zfs_shareall(pool);
-                                       zfs_commit_all_shares();
+                                       ret = zfs_share(pool, NULL);
+                                       zfs_commit_shares(NULL);
                                }
                                zfs_close(pool);
                        }
index c0e53b88a636cf9198721d040cae9580d3ed9004..04f464d12faf790b895bcf97d6e0b8e83c094fc7 100644 (file)
@@ -35,6 +35,7 @@
 #define        _LIBZFS_H extern __attribute__((visibility("default")))
 
 #include <assert.h>
+#include <libshare.h>
 #include <libnvpair.h>
 #include <sys/mnttab.h>
 #include <sys/param.h>
@@ -878,37 +879,25 @@ _LIBZFS_H void zfs_adjust_mount_options(zfs_handle_t *zhp, const char *mntpoint,
 
 /*
  * Share support functions.
+ *
+ * enum sa_protocol * lists are terminated with SA_NO_PROTOCOL,
+ * NULL means "all/any known to this libzfs".
  */
-_LIBZFS_H boolean_t zfs_is_shared(zfs_handle_t *);
-_LIBZFS_H int zfs_share(zfs_handle_t *);
-_LIBZFS_H int zfs_unshare(zfs_handle_t *);
-
-/*
- * Protocol-specific share support functions.
- */
-_LIBZFS_H boolean_t zfs_is_shared_nfs(zfs_handle_t *, char **);
-_LIBZFS_H boolean_t zfs_is_shared_smb(zfs_handle_t *, char **);
-_LIBZFS_H int zfs_share_nfs(zfs_handle_t *);
-_LIBZFS_H int zfs_share_smb(zfs_handle_t *);
-_LIBZFS_H int zfs_shareall(zfs_handle_t *);
-_LIBZFS_H int zfs_unshare_nfs(zfs_handle_t *, const char *);
-_LIBZFS_H int zfs_unshare_smb(zfs_handle_t *, const char *);
-_LIBZFS_H int zfs_unshareall_nfs(zfs_handle_t *);
-_LIBZFS_H int zfs_unshareall_smb(zfs_handle_t *);
-_LIBZFS_H int zfs_unshareall_bypath(zfs_handle_t *, const char *);
-_LIBZFS_H int zfs_unshareall_bytype(zfs_handle_t *, const char *, const char *);
-_LIBZFS_H int zfs_unshareall(zfs_handle_t *);
-_LIBZFS_H int zfs_deleg_share_nfs(libzfs_handle_t *, char *, char *, char *,
-    void *, void *, int, zfs_share_op_t);
-_LIBZFS_H void zfs_commit_nfs_shares(void);
-_LIBZFS_H void zfs_commit_smb_shares(void);
-_LIBZFS_H void zfs_commit_all_shares(void);
-_LIBZFS_H void zfs_commit_shares(const char *);
+#define        SA_NO_PROTOCOL -1
+
+_LIBZFS_H boolean_t zfs_is_shared(zfs_handle_t *zhp, char **where,
+    const enum sa_protocol *proto);
+_LIBZFS_H int zfs_share(zfs_handle_t *zhp, const enum sa_protocol *proto);
+_LIBZFS_H int zfs_unshare(zfs_handle_t *zhp, const char *mountpoint,
+    const enum sa_protocol *proto);
+_LIBZFS_H int zfs_unshareall(zfs_handle_t *zhp,
+    const enum sa_protocol *proto);
+_LIBZFS_H void zfs_commit_shares(const enum sa_protocol *proto);
 
 _LIBZFS_H int zfs_nicestrtonum(libzfs_handle_t *, const char *, uint64_t *);
 
 /*
- * Utility functions to run an _LIBZFS_Hal process.
+ * Utility functions to run an external process.
  */
 #define        STDOUT_VERBOSE  0x01
 #define        STDERR_VERBOSE  0x02
index 298cfbd9fb56bc5b577d7d3d1b2e6e63d0396fa1..40bd6a5574c804469f6bdf1a206f92e56dc8ad7a 100644 (file)
     <elf-symbol name='zfs_bookmark_exists' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_clone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_close' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_commit_all_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_commit_nfs_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_commit_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_commit_smb_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_component_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_create_ancestors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_is_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_is_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_is_shared_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_is_shared_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_isnumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_children' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_send_saved' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_set_fsacl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_share' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_share_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_share_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_shareall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_show_diffs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_smb_acl_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_smb_acl_purge' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_unmount' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_unmountall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_unshare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_unshare_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_unshare_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_unshareall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_unshareall_bypath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_unshareall_bytype' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_unshareall_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='zfs_unshareall_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_userspace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_valid_proplist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_version_kernel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='fletcher_4_superscalar4_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='fletcher_4_superscalar_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='libzfs_config_ops' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='sa_protocol_names' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='spa_feature_table' size='2016' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfeature_checks_disable' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_deleg_perm_tab' size='512' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/>
   </abi-instr>
   <abi-instr address-size='64' path='libshare.c' language='LANG_C99'>
+    <array-type-def dimensions='1' type-id='b99c00c9' size-in-bits='128' id='2d6895a3'>
+      <subrange length='2' type-id='7359adad' id='52efc4ef'/>
+    </array-type-def>
+    <var-decl name='sa_protocol_names' type-id='2d6895a3' mangled-name='sa_protocol_names' visibility='default' elf-symbol-id='sa_protocol_names'/>
     <function-decl name='sa_enable_share' mangled-name='sa_enable_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_enable_share'>
       <parameter type-id='80f4b756' name='zfsname'/>
       <parameter type-id='80f4b756' name='mountpoint'/>
       <parameter type-id='80f4b756' name='shareopts'/>
-      <parameter type-id='26a90f95' name='protocol'/>
+      <parameter type-id='9155d4b5' name='protocol'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='sa_disable_share' mangled-name='sa_disable_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_disable_share'>
       <parameter type-id='80f4b756' name='mountpoint'/>
-      <parameter type-id='26a90f95' name='protocol'/>
+      <parameter type-id='9155d4b5' name='protocol'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='sa_is_shared' mangled-name='sa_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_is_shared'>
       <parameter type-id='80f4b756' name='mountpoint'/>
-      <parameter type-id='26a90f95' name='protocol'/>
+      <parameter type-id='9155d4b5' name='protocol'/>
       <return type-id='c19b74c3'/>
     </function-decl>
     <function-decl name='sa_commit_shares' mangled-name='sa_commit_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_commit_shares'>
-      <parameter type-id='80f4b756' name='protocol'/>
+      <parameter type-id='9155d4b5' name='protocol'/>
       <return type-id='48b5725f'/>
     </function-decl>
-    <function-decl name='sa_errorstr' mangled-name='sa_errorstr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_errorstr'>
-      <parameter type-id='95e97e5e' name='err'/>
-      <return type-id='26a90f95'/>
-    </function-decl>
     <function-decl name='sa_validate_shareopts' mangled-name='sa_validate_shareopts' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_validate_shareopts'>
-      <parameter type-id='26a90f95' name='options'/>
-      <parameter type-id='26a90f95' name='proto'/>
+      <parameter type-id='80f4b756' name='options'/>
+      <parameter type-id='9155d4b5' name='protocol'/>
       <return type-id='95e97e5e'/>
     </function-decl>
+    <function-decl name='sa_errorstr' mangled-name='sa_errorstr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_errorstr'>
+      <parameter type-id='95e97e5e' name='err'/>
+      <return type-id='80f4b756'/>
+    </function-decl>
+    <enum-decl name='sa_protocol' id='9155d4b5'>
+      <underlying-type type-id='9cac1fee'/>
+      <enumerator name='SA_PROTOCOL_NFS' value='0'/>
+      <enumerator name='SA_PROTOCOL_SMB' value='1'/>
+      <enumerator name='SA_PROTOCOL_COUNT' value='2'/>
+    </enum-decl>
   </abi-instr>
-  <abi-instr address-size='64' path='os/linux/smb.c' language='LANG_C99'>
-    <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='2040' id='11641789'>
-      <subrange length='255' type-id='7359adad' id='36e7f891'/>
-    </array-type-def>
-    <class-decl name='smb_share_s' size-in-bits='36992' is-struct='yes' visibility='default' id='a75bc907'>
+  <abi-instr address-size='64' path='os/linux/nfs.c' language='LANG_C99'>
+    <class-decl name='sa_share_impl' size-in-bits='192' is-struct='yes' visibility='default' id='72b09bf8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='sa_zfsname' type-id='80f4b756' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='sa_mountpoint' type-id='80f4b756' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='sa_shareopts' type-id='80f4b756' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='sa_share_impl_t' type-id='946a2c6b' id='a48b47d0'/>
+    <class-decl name='sa_fstype_t' size-in-bits='320' is-struct='yes' naming-typedef-id='639af739' visibility='default' id='944afa86'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='name' type-id='11641789' visibility='default'/>
+        <var-decl name='enable_share' type-id='2f78a9c1' visibility='default'/>
       </data-member>
-      <data-member access='public' layout-offset-in-bits='2040'>
-        <var-decl name='path' type-id='d16c6df4' visibility='default'/>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='disable_share' type-id='2f78a9c1' visibility='default'/>
       </data-member>
-      <data-member access='public' layout-offset-in-bits='34808'>
-        <var-decl name='comment' type-id='11641789' visibility='default'/>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='is_shared' type-id='81020bc2' visibility='default'/>
       </data-member>
-      <data-member access='public' layout-offset-in-bits='36864'>
-        <var-decl name='guest_ok' type-id='c19b74c3' visibility='default'/>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='validate_shareopts' type-id='f194a8fb' visibility='default'/>
       </data-member>
-      <data-member access='public' layout-offset-in-bits='36928'>
-        <var-decl name='next' type-id='05ed1c5f' visibility='default'/>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='commit_shares' type-id='797ee7da' visibility='default'/>
       </data-member>
     </class-decl>
-    <typedef-decl name='smb_share_t' type-id='a75bc907' id='2d05afd9'/>
-    <pointer-type-def type-id='a75bc907' size-in-bits='64' id='05ed1c5f'/>
-    <pointer-type-def type-id='2d05afd9' size-in-bits='64' id='a3e5c654'/>
-    <var-decl name='smb_shares' type-id='a3e5c654' visibility='default'/>
+    <typedef-decl name='sa_fstype_t' type-id='944afa86' id='639af739'/>
+    <qualified-type-def type-id='639af739' const='yes' id='d19dbca9'/>
+    <qualified-type-def type-id='72b09bf8' const='yes' id='484950e3'/>
+    <pointer-type-def type-id='484950e3' size-in-bits='64' id='946a2c6b'/>
+    <pointer-type-def type-id='276427e1' size-in-bits='64' id='1db260e5'/>
+    <qualified-type-def type-id='1db260e5' const='yes' id='797ee7da'/>
+    <pointer-type-def type-id='5113b296' size-in-bits='64' id='70487b28'/>
+    <qualified-type-def type-id='70487b28' const='yes' id='f194a8fb'/>
+    <pointer-type-def type-id='c13578bc' size-in-bits='64' id='fa1f29ce'/>
+    <qualified-type-def type-id='fa1f29ce' const='yes' id='2f78a9c1'/>
+    <pointer-type-def type-id='86373eb1' size-in-bits='64' id='f337456d'/>
+    <qualified-type-def type-id='f337456d' const='yes' id='81020bc2'/>
+    <var-decl name='libshare_nfs_type' type-id='d19dbca9' visibility='default'/>
+    <function-type size-in-bits='64' id='276427e1'>
+      <return type-id='95e97e5e'/>
+    </function-type>
+    <function-type size-in-bits='64' id='5113b296'>
+      <parameter type-id='80f4b756'/>
+      <return type-id='95e97e5e'/>
+    </function-type>
+    <function-type size-in-bits='64' id='c13578bc'>
+      <parameter type-id='a48b47d0'/>
+      <return type-id='95e97e5e'/>
+    </function-type>
+    <function-type size-in-bits='64' id='86373eb1'>
+      <parameter type-id='a48b47d0'/>
+      <return type-id='c19b74c3'/>
+    </function-type>
+  </abi-instr>
+  <abi-instr address-size='64' path='os/linux/smb.c' language='LANG_C99'>
+    <var-decl name='libshare_smb_type' type-id='d19dbca9' visibility='default'/>
   </abi-instr>
   <abi-instr address-size='64' path='assert.c' language='LANG_C99'>
     <function-decl name='libspl_set_assert_ok' mangled-name='libspl_set_assert_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_set_assert_ok'>
       </data-member>
     </class-decl>
     <typedef-decl name='get_all_cb_t' type-id='803dac95' id='9b293607'/>
+    <enum-decl name='sa_protocol' id='9155d4b5'>
+      <underlying-type type-id='9cac1fee'/>
+      <enumerator name='SA_PROTOCOL_NFS' value='0'/>
+      <enumerator name='SA_PROTOCOL_SMB' value='1'/>
+      <enumerator name='SA_PROTOCOL_COUNT' value='2'/>
+    </enum-decl>
+    <qualified-type-def type-id='9155d4b5' const='yes' id='9f2c1699'/>
+    <pointer-type-def type-id='9f2c1699' size-in-bits='64' id='4567bbc9'/>
     <pointer-type-def type-id='9b293607' size-in-bits='64' id='77bf1784'/>
     <pointer-type-def type-id='9200a744' size-in-bits='64' id='4507922a'/>
     <function-decl name='is_mounted' mangled-name='is_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='is_mounted'>
       <parameter type-id='95e97e5e' name='flags'/>
       <return type-id='95e97e5e'/>
     </function-decl>
-    <function-decl name='zfs_is_shared' mangled-name='zfs_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <return type-id='c19b74c3'/>
-    </function-decl>
     <function-decl name='zfs_share' mangled-name='zfs_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share'>
       <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='4567bbc9' name='proto'/>
       <return type-id='95e97e5e'/>
     </function-decl>
-    <function-decl name='zfs_unshare' mangled-name='zfs_unshare' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_is_shared_nfs' mangled-name='zfs_is_shared_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared_nfs'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <parameter type-id='9b23c9ad' name='where'/>
-      <return type-id='c19b74c3'/>
-    </function-decl>
-    <function-decl name='zfs_is_shared_smb' mangled-name='zfs_is_shared_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared_smb'>
+    <function-decl name='zfs_is_shared' mangled-name='zfs_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared'>
       <parameter type-id='9200a744' name='zhp'/>
       <parameter type-id='9b23c9ad' name='where'/>
+      <parameter type-id='4567bbc9' name='proto'/>
       <return type-id='c19b74c3'/>
     </function-decl>
-    <function-decl name='zfs_commit_nfs_shares' mangled-name='zfs_commit_nfs_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_nfs_shares'>
-      <return type-id='48b5725f'/>
-    </function-decl>
-    <function-decl name='zfs_commit_smb_shares' mangled-name='zfs_commit_smb_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_smb_shares'>
-      <return type-id='48b5725f'/>
-    </function-decl>
-    <function-decl name='zfs_commit_all_shares' mangled-name='zfs_commit_all_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_all_shares'>
-      <return type-id='48b5725f'/>
-    </function-decl>
     <function-decl name='zfs_commit_shares' mangled-name='zfs_commit_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_shares'>
-      <parameter type-id='80f4b756' name='proto'/>
+      <parameter type-id='4567bbc9' name='proto'/>
       <return type-id='48b5725f'/>
     </function-decl>
-    <function-decl name='zfs_share_nfs' mangled-name='zfs_share_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share_nfs'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_share_smb' mangled-name='zfs_share_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share_smb'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_unshare_nfs' mangled-name='zfs_unshare_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare_nfs'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <parameter type-id='80f4b756' name='mountpoint'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_unshare_smb' mangled-name='zfs_unshare_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare_smb'>
+    <function-decl name='zfs_unshare' mangled-name='zfs_unshare' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare'>
       <parameter type-id='9200a744' name='zhp'/>
       <parameter type-id='80f4b756' name='mountpoint'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_unshareall_nfs' mangled-name='zfs_unshareall_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_nfs'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_unshareall_smb' mangled-name='zfs_unshareall_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_smb'>
-      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='4567bbc9' name='proto'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_unshareall' mangled-name='zfs_unshareall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall'>
       <parameter type-id='9200a744' name='zhp'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_unshareall_bypath' mangled-name='zfs_unshareall_bypath' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_bypath'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <parameter type-id='80f4b756' name='mountpoint'/>
-      <return type-id='95e97e5e'/>
-    </function-decl>
-    <function-decl name='zfs_unshareall_bytype' mangled-name='zfs_unshareall_bytype' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_bytype'>
-      <parameter type-id='9200a744' name='zhp'/>
-      <parameter type-id='80f4b756' name='mountpoint'/>
-      <parameter type-id='80f4b756' name='proto'/>
+      <parameter type-id='4567bbc9' name='proto'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='libzfs_add_handle' mangled-name='libzfs_add_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_add_handle'>
index a70c7424b997a10682d6796e24fde038dec088b3..d31bbc4a3b42119d5b6949454842f51425f88d57 100644 (file)
@@ -98,6 +98,7 @@ changelist_prefix(prop_changelist_t *clp)
        prop_changenode_t *cn;
        uu_avl_walk_t *walk;
        int ret = 0;
+       const enum sa_protocol smb[] = {SA_PROTOCOL_SMB, SA_NO_PROTOCOL};
        boolean_t commit_smb_shares = B_FALSE;
 
        if (clp->cl_prop != ZFS_PROP_MOUNTPOINT &&
@@ -137,7 +138,8 @@ changelist_prefix(prop_changelist_t *clp)
                                }
                                break;
                        case ZFS_PROP_SHARESMB:
-                               (void) zfs_unshare_smb(cn->cn_handle, NULL);
+                               (void) zfs_unshare(cn->cn_handle, NULL,
+                                   smb);
                                commit_smb_shares = B_TRUE;
                                break;
 
@@ -148,7 +150,7 @@ changelist_prefix(prop_changelist_t *clp)
        }
 
        if (commit_smb_shares)
-               zfs_commit_smb_shares();
+               zfs_commit_shares(smb);
        uu_avl_walk_end(walk);
 
        if (ret == -1)
@@ -257,25 +259,33 @@ changelist_postfix(prop_changelist_t *clp)
                 * if the filesystem is currently shared, so that we can
                 * adopt any new options.
                 */
+               const enum sa_protocol nfs[] =
+                   {SA_PROTOCOL_NFS, SA_NO_PROTOCOL};
                if (sharenfs && mounted) {
-                       errors += zfs_share_nfs(cn->cn_handle);
+                       errors += zfs_share(cn->cn_handle, nfs);
                        commit_nfs_shares = B_TRUE;
                } else if (cn->cn_shared || clp->cl_waslegacy) {
-                       errors += zfs_unshare_nfs(cn->cn_handle, NULL);
+                       errors += zfs_unshare(cn->cn_handle, NULL, nfs);
                        commit_nfs_shares = B_TRUE;
                }
+               const enum sa_protocol smb[] =
+                   {SA_PROTOCOL_SMB, SA_NO_PROTOCOL};
                if (sharesmb && mounted) {
-                       errors += zfs_share_smb(cn->cn_handle);
+                       errors += zfs_share(cn->cn_handle, smb);
                        commit_smb_shares = B_TRUE;
                } else if (cn->cn_shared || clp->cl_waslegacy) {
-                       errors += zfs_unshare_smb(cn->cn_handle, NULL);
+                       errors += zfs_unshare(cn->cn_handle, NULL, smb);
                        commit_smb_shares = B_TRUE;
                }
        }
+
+       enum sa_protocol proto[SA_PROTOCOL_COUNT + 1], *p = proto;
        if (commit_nfs_shares)
-               zfs_commit_nfs_shares();
+               *p++ = SA_PROTOCOL_NFS;
        if (commit_smb_shares)
-               zfs_commit_smb_shares();
+               *p++ = SA_PROTOCOL_SMB;
+       *p++ = SA_NO_PROTOCOL;
+       zfs_commit_shares(proto);
        uu_avl_walk_end(walk);
 
        return (errors ? -1 : 0);
@@ -359,7 +369,7 @@ changelist_unshare(prop_changelist_t *clp, const enum sa_protocol *proto)
                return (-1);
 
        while ((cn = uu_avl_walk_next(walk)) != NULL) {
-               if (zfs_unshare_proto(cn->cn_handle, NULL, proto) != 0)
+               if (zfs_unshare(cn->cn_handle, NULL, proto) != 0)
                        ret = -1;
        }
 
@@ -452,7 +462,7 @@ changelist_add_mounted(zfs_handle_t *zhp, void *data)
        cn->cn_handle = zhp;
        cn->cn_mounted = zfs_is_mounted(zhp, NULL);
        ASSERT3U(cn->cn_mounted, ==, B_TRUE);
-       cn->cn_shared = zfs_is_shared(zhp);
+       cn->cn_shared = zfs_is_shared(zhp, NULL, NULL);
        cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED);
        cn->cn_needpost = B_TRUE;
 
@@ -522,7 +532,7 @@ change_one(zfs_handle_t *zhp, void *data)
                cn->cn_handle = zhp;
                cn->cn_mounted = (clp->cl_gflags & CL_GATHER_MOUNT_ALWAYS) ||
                    zfs_is_mounted(zhp, NULL);
-               cn->cn_shared = zfs_is_shared(zhp);
+               cn->cn_shared = zfs_is_shared(zhp, NULL, NULL);
                cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED);
                cn->cn_needpost = B_TRUE;
 
@@ -738,7 +748,7 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags,
        cn->cn_handle = temp;
        cn->cn_mounted = (clp->cl_gflags & CL_GATHER_MOUNT_ALWAYS) ||
            zfs_is_mounted(temp, NULL);
-       cn->cn_shared = zfs_is_shared(temp);
+       cn->cn_shared = zfs_is_shared(temp, NULL, NULL);
        cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED);
        cn->cn_needpost = B_TRUE;
 
index e5c1bd62d5d1861b1e712aa32440fcff865ea722..50053e35f0d50c31b10d1150b2d7ccf79ced99e0 100644 (file)
@@ -3556,14 +3556,14 @@ create_parents(libzfs_handle_t *hdl, char *target, int prefixlen)
                        goto ancestorerr;
                }
 
-               if (zfs_share(h) != 0) {
+               if (zfs_share(h, NULL) != 0) {
                        opname = dgettext(TEXT_DOMAIN, "share");
                        goto ancestorerr;
                }
 
                zfs_close(h);
        }
-       zfs_commit_all_shares();
+       zfs_commit_shares(NULL);
 
        return (0);
 
index bf1a8359cef2800e39d0e7e0815b854281e267b6..926e14a3716ceb8e31550c3ad1d6e1cd1af47f24 100644 (file)
@@ -105,15 +105,6 @@ struct zpool_handle {
        diskaddr_t zpool_start_block;
 };
 
-/*
- * Bitmask of shared types:
- * 0 means none, otherwise | (1 << (enum sa_protocol + 1)).
- */
-typedef unsigned zfs_share_type_t;
-#define        SHARED_NOT_SHARED 0
-
-#define        SA_NO_PROTOCOL -1
-
 typedef int (*zfs_uri_handler_fn_t)(struct libzfs_handle *, const char *,
     const char *, zfs_keyformat_t, boolean_t, uint8_t **, size_t *);
 
@@ -233,16 +224,6 @@ typedef struct differ_info {
 extern int do_mount(zfs_handle_t *zhp, const char *mntpt, char *opts,
     int flags);
 extern int do_unmount(zfs_handle_t *zhp, const char *mntpt, int flags);
-extern int zfs_mount_delegation_check(void);
-extern int zfs_share_proto(zfs_handle_t *zhp, const enum sa_protocol *proto);
-extern int zfs_unshare_proto(zfs_handle_t *, const char *,
-    const enum sa_protocol *);
-extern int unshare_one(libzfs_handle_t *hdl, const char *name,
-    const char *mountpoint, enum sa_protocol proto);
-extern boolean_t zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen,
-    zprop_source_t *source, int flags);
-extern zfs_share_type_t is_shared(const char *mountpoint,
-    enum sa_protocol proto);
 extern int libzfs_load_module(void);
 extern int zpool_relabel_disk(libzfs_handle_t *hdl, const char *path,
     const char *msg);
index ea7e97c2932f9c808a69acafe303403324b1c938..77837a3b0f36d20c2cad1f3e625071bf712d42c4 100644 (file)
  *     zfs_unmount()
  *     zfs_unmountall()
  *
- * This file also contains the functions used to manage sharing filesystems via
- * NFS and iSCSI:
+ * This file also contains the functions used to manage sharing filesystems:
  *
  *     zfs_is_shared()
  *     zfs_share()
  *     zfs_unshare()
- *
- *     zfs_is_shared_nfs()
- *     zfs_is_shared_smb()
- *     zfs_share_proto()
- *     zfs_shareall();
- *     zfs_unshare_nfs()
- *     zfs_unshare_smb()
- *     zfs_unshareall_nfs()
- *     zfs_unshareall_smb()
  *     zfs_unshareall()
- *     zfs_unshareall_bypath()
+ *     zfs_commit_shares()
  *
  * The following functions are available for pool consumers, and will
  * mount/unmount and share/unshare all datasets within pool:
@@ -95,8 +85,6 @@
 static int mount_tp_nthr = 512;        /* tpool threads for multi-threaded mounting */
 
 static void zfs_mount_task(void *);
-static zfs_share_type_t zfs_is_shared_proto(zfs_handle_t *, char **,
-    enum sa_protocol);
 
 static const proto_table_t proto_table[SA_PROTOCOL_COUNT] = {
        [SA_PROTOCOL_NFS] =
@@ -249,7 +237,7 @@ zfs_is_mountable_internal(zfs_handle_t *zhp)
  * Returns true if the given dataset is mountable, false otherwise.  Returns the
  * mountpoint in 'buf'.
  */
-boolean_t
+static boolean_t
 zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen,
     zprop_source_t *source, int flags)
 {
@@ -623,16 +611,16 @@ zfs_unmount(zfs_handle_t *zhp, const char *mountpoint, int flags)
                /*
                 * Unshare and unmount the filesystem
                 */
-               if (zfs_unshare_proto(zhp, mntpt, share_all_proto) != 0) {
+               if (zfs_unshare(zhp, mntpt, share_all_proto) != 0) {
                        free(mntpt);
                        return (-1);
                }
-               zfs_commit_all_shares();
+               zfs_commit_shares(NULL);
 
                if (unmount_one(zhp, mntpt, flags) != 0) {
                        free(mntpt);
-                       (void) zfs_shareall(zhp);
-                       zfs_commit_all_shares();
+                       (void) zfs_share(zhp, NULL);
+                       zfs_commit_shares(NULL);
                        return (-1);
                }
 
@@ -691,23 +679,10 @@ zfs_unmountall(zfs_handle_t *zhp, int flags)
        return (ret);
 }
 
-boolean_t
-zfs_is_shared(zfs_handle_t *zhp)
-{
-       if (ZFS_IS_VOLUME(zhp))
-               return (B_FALSE);
-
-       for (enum sa_protocol i = 0; i < SA_PROTOCOL_COUNT; ++i)
-               if (zfs_is_shared_proto(zhp, NULL, i))
-                       return (B_TRUE);
-
-       return (B_FALSE);
-}
-
 /*
  * Unshare a filesystem by mountpoint.
  */
-int
+static int
 unshare_one(libzfs_handle_t *hdl, const char *name, const char *mountpoint,
     enum sa_protocol proto)
 {
@@ -720,26 +695,13 @@ unshare_one(libzfs_handle_t *hdl, const char *name, const char *mountpoint,
        return (0);
 }
 
-/*
- * Query libshare for the given mountpoint and protocol, returning
- * a zfs_share_type_t value.
- */
-zfs_share_type_t
-is_shared(const char *mountpoint, enum sa_protocol proto)
-{
-       if (sa_is_shared(mountpoint, proto))
-               return (1 << (proto + 1));
-       else
-               return (SHARED_NOT_SHARED);
-}
-
 /*
  * Share the given filesystem according to the options in the specified
  * protocol specific properties (sharenfs, sharesmb).  We rely
  * on "libshare" to do the dirty work for us.
  */
 int
-zfs_share_proto(zfs_handle_t *zhp, const enum sa_protocol *proto)
+zfs_share(zfs_handle_t *zhp, const enum sa_protocol *proto)
 {
        char mountpoint[ZFS_MAXPROPLEN];
        char shareopts[ZFS_MAXPROPLEN];
@@ -748,6 +710,9 @@ zfs_share_proto(zfs_handle_t *zhp, const enum sa_protocol *proto)
        zprop_source_t sourcetype;
        int err = 0;
 
+       if (proto == NULL)
+               proto = share_all_proto;
+
        if (!zfs_is_mountable(zhp, mountpoint, sizeof (mountpoint), NULL, 0))
                return (0);
 
@@ -783,138 +748,74 @@ zfs_share_proto(zfs_handle_t *zhp, const enum sa_protocol *proto)
        return (0);
 }
 
-int
-zfs_share(zfs_handle_t *zhp)
-{
-       assert(!ZFS_IS_VOLUME(zhp));
-       return (zfs_share_proto(zhp, share_all_proto));
-}
-
-int
-zfs_unshare(zfs_handle_t *zhp)
-{
-       assert(!ZFS_IS_VOLUME(zhp));
-       return (zfs_unshareall(zhp));
-}
-
 /*
  * Check to see if the filesystem is currently shared.
  */
-static zfs_share_type_t
-zfs_is_shared_proto(zfs_handle_t *zhp, char **where, enum sa_protocol proto)
-{
-       char *mountpoint;
-       zfs_share_type_t rc;
-
-       if (!zfs_is_mounted(zhp, &mountpoint))
-               return (SHARED_NOT_SHARED);
-
-       if ((rc = is_shared(mountpoint, proto))
-           != SHARED_NOT_SHARED) {
-               if (where != NULL)
-                       *where = mountpoint;
-               else
-                       free(mountpoint);
-               return (rc);
-       } else {
-               free(mountpoint);
-               return (SHARED_NOT_SHARED);
-       }
-}
-
 boolean_t
-zfs_is_shared_nfs(zfs_handle_t *zhp, char **where)
+zfs_is_shared(zfs_handle_t *zhp, char **where,
+    const enum sa_protocol *proto)
 {
-       return (zfs_is_shared_proto(zhp, where,
-           SA_PROTOCOL_NFS) != SHARED_NOT_SHARED);
-}
+       char *mountpoint;
+       if (proto == NULL)
+               proto = share_all_proto;
 
-boolean_t
-zfs_is_shared_smb(zfs_handle_t *zhp, char **where)
-{
-       return (zfs_is_shared_proto(zhp, where,
-           SA_PROTOCOL_SMB) != SHARED_NOT_SHARED);
-}
+       if (ZFS_IS_VOLUME(zhp))
+               return (B_FALSE);
 
-void
-zfs_commit_nfs_shares(void)
-{
-       sa_commit_shares(SA_PROTOCOL_NFS);
-}
+       if (!zfs_is_mounted(zhp, &mountpoint))
+               return (B_FALSE);
 
-void
-zfs_commit_smb_shares(void)
-{
-       sa_commit_shares(SA_PROTOCOL_SMB);
-}
+       for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p)
+               if (sa_is_shared(mountpoint, *p)) {
+                       if (where != NULL)
+                               *where = mountpoint;
+                       else
+                               free(mountpoint);
+                       return (B_TRUE);
+               }
 
-void
-zfs_commit_all_shares(void)
-{
-       for (enum sa_protocol i = 0; i < SA_PROTOCOL_COUNT; ++i)
-               sa_commit_shares(i);
+       free(mountpoint);
+       return (B_FALSE);
 }
 
 void
-zfs_commit_shares(const char *proto)
+zfs_commit_shares(const enum sa_protocol *proto)
 {
        if (proto == NULL)
-               zfs_commit_all_shares();
-       else
-               for (enum sa_protocol i = 0; i < ARRAY_SIZE(sa_protocol_names);
-                   ++i)
-                       if (strcmp(proto, sa_protocol_names[i]) == 0) {
-                               sa_commit_shares(i);
-                               return;
-                       }
-}
+               proto = share_all_proto;
 
-int
-zfs_share_nfs(zfs_handle_t *zhp)
-{
-       const enum sa_protocol nfs_only[] = {SA_PROTOCOL_NFS, SA_NO_PROTOCOL};
-       return (zfs_share_proto(zhp, nfs_only));
-}
-
-int
-zfs_share_smb(zfs_handle_t *zhp)
-{
-       const enum sa_protocol smb_only[] = {SA_PROTOCOL_SMB, SA_NO_PROTOCOL};
-       return (zfs_share_proto(zhp, smb_only));
-}
-
-int
-zfs_shareall(zfs_handle_t *zhp)
-{
-       return (zfs_share_proto(zhp, share_all_proto));
+       for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p)
+               sa_commit_shares(*p);
 }
 
 /*
  * Unshare the given filesystem.
  */
 int
-zfs_unshare_proto(zfs_handle_t *zhp, const char *mountpoint,
+zfs_unshare(zfs_handle_t *zhp, const char *mountpoint,
     const enum sa_protocol *proto)
 {
        libzfs_handle_t *hdl = zhp->zfs_hdl;
        struct mnttab entry;
        char *mntpt = NULL;
 
+       if (proto == NULL)
+               proto = share_all_proto;
+
        /* check to see if need to unmount the filesystem */
        if (mountpoint != NULL)
                mntpt = zfs_strdup(hdl, mountpoint);
 
        if (mountpoint != NULL || ((zfs_get_type(zhp) == ZFS_TYPE_FILESYSTEM) &&
            libzfs_mnttab_find(hdl, zfs_get_name(zhp), &entry) == 0)) {
-               const enum sa_protocol *curr_proto;
 
                if (mountpoint == NULL)
                        mntpt = zfs_strdup(zhp->zfs_hdl, entry.mnt_mountp);
 
-               for (curr_proto = proto; *curr_proto != SA_NO_PROTOCOL;
-                   curr_proto++) {
+               for (const enum sa_protocol *curr_proto = proto;
+                   *curr_proto != SA_NO_PROTOCOL; curr_proto++) {
 
-                       if (is_shared(mntpt, *curr_proto)) {
+                       if (sa_is_shared(mntpt, *curr_proto)) {
                                if (unshare_one(hdl, zhp->zfs_name,
                                    mntpt, *curr_proto) != 0) {
                                        if (mntpt != NULL)
@@ -930,29 +831,18 @@ zfs_unshare_proto(zfs_handle_t *zhp, const char *mountpoint,
        return (0);
 }
 
-int
-zfs_unshare_nfs(zfs_handle_t *zhp, const char *mountpoint)
-{
-       const enum sa_protocol nfs_only[] = {SA_PROTOCOL_NFS, SA_NO_PROTOCOL};
-       return (zfs_unshare_proto(zhp, mountpoint, nfs_only));
-}
-
-int
-zfs_unshare_smb(zfs_handle_t *zhp, const char *mountpoint)
-{
-       const enum sa_protocol smb_only[] = {SA_PROTOCOL_SMB, SA_NO_PROTOCOL};
-       return (zfs_unshare_proto(zhp, mountpoint, smb_only));
-}
-
 /*
  * Same as zfs_unmountall(), but for NFS and SMB unshares.
  */
-static int
-zfs_unshareall_proto(zfs_handle_t *zhp, const enum sa_protocol *proto)
+int
+zfs_unshareall(zfs_handle_t *zhp, const enum sa_protocol *proto)
 {
        prop_changelist_t *clp;
        int ret;
 
+       if (proto == NULL)
+               proto = share_all_proto;
+
        clp = changelist_gather(zhp, ZFS_PROP_SHARENFS, 0, 0);
        if (clp == NULL)
                return (-1);
@@ -963,48 +853,6 @@ zfs_unshareall_proto(zfs_handle_t *zhp, const enum sa_protocol *proto)
        return (ret);
 }
 
-int
-zfs_unshareall_nfs(zfs_handle_t *zhp)
-{
-       const enum sa_protocol nfs_only[] = {SA_PROTOCOL_NFS, SA_NO_PROTOCOL};
-       return (zfs_unshareall_proto(zhp, nfs_only));
-}
-
-int
-zfs_unshareall_smb(zfs_handle_t *zhp)
-{
-       const enum sa_protocol smb_only[] = {SA_PROTOCOL_SMB, SA_NO_PROTOCOL};
-       return (zfs_unshareall_proto(zhp, smb_only));
-}
-
-int
-zfs_unshareall(zfs_handle_t *zhp)
-{
-       return (zfs_unshareall_proto(zhp, share_all_proto));
-}
-
-int
-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));
-
-       for (enum sa_protocol i = 0; i < ARRAY_SIZE(sa_protocol_names); ++i)
-               if (strcmp(proto, sa_protocol_names[i]) == 0) {
-                       enum sa_protocol protocols[] = {i, SA_NO_PROTOCOL};
-                       return (zfs_unshare_proto(zhp, mountpoint, protocols));
-               }
-
-       return (1);
-}
-
 /*
  * Remove the mountpoint associated with the current dataset, if necessary.
  * We only remove the underlying directory if:
@@ -1295,7 +1143,7 @@ zfs_share_one(zfs_handle_t *zhp, void *arg)
        mount_state_t *ms = arg;
        int ret = 0;
 
-       if (zfs_share(zhp) != 0)
+       if (zfs_share(zhp, NULL) != 0)
                ret = ms->ms_mntstatus = -1;
        return (ret);
 }
@@ -1468,7 +1316,7 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags)
        if (ms.ms_mntstatus != 0)
                ret = ms.ms_mntstatus;
        else
-               zfs_commit_all_shares();
+               zfs_commit_shares(NULL);
 
 out:
        for (int i = 0; i < cb.cb_used; i++)
@@ -1578,13 +1426,13 @@ zpool_disable_datasets(zpool_handle_t *zhp, boolean_t force)
         */
        for (i = 0; i < used; i++) {
                for (enum sa_protocol i = 0; i < SA_PROTOCOL_COUNT; ++i) {
-                       if (is_shared(sets[i].mountpoint, i) &&
+                       if (sa_is_shared(sets[i].mountpoint, i) &&
                            unshare_one(hdl, sets[i].mountpoint,
                            sets[i].mountpoint, i) != 0)
                                goto out;
                }
        }
-       zfs_commit_all_shares();
+       zfs_commit_shares(NULL);
 
        /*
         * Now unmount everything, removing the underlying directories as