diff options
| author | Doug McCallum <Doug.McCallum@Sun.COM> | 2008-09-03 15:19:36 -0600 |
|---|---|---|
| committer | Doug McCallum <Doug.McCallum@Sun.COM> | 2008-09-03 15:19:36 -0600 |
| commit | 1f713840d3b0fdc1eb54245ec133d1c87df73d13 (patch) | |
| tree | d5b22ca977d485aa4d68b04fa304e5a1497b9863 /usr/src | |
| parent | 22de10488e332d0fe098537ac4c2d4c04772719d (diff) | |
| download | illumos-joyent-1f713840d3b0fdc1eb54245ec133d1c87df73d13.tar.gz | |
6683493 Get error message "cannot unshare 'mypool': unknown -1: unshare(1M) failed" when unset sharesmb
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/lib/libshare/common/libshare.c | 33 | ||||
| -rw-r--r-- | usr/src/lib/libshare/common/libshare_zfs.c | 10 | ||||
| -rw-r--r-- | usr/src/lib/libshare/smb/libshare_smb.c | 14 |
3 files changed, 41 insertions, 16 deletions
diff --git a/usr/src/lib/libshare/common/libshare.c b/usr/src/lib/libshare/common/libshare.c index cbe5aae3bb..4333566a47 100644 --- a/usr/src/lib/libshare/common/libshare.c +++ b/usr/src/lib/libshare/common/libshare.c @@ -24,8 +24,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Share control API */ @@ -3747,10 +3745,14 @@ sa_add_resource(sa_share_t share, char *resource, int persist, int *error) index); (void) xmlSetProp(node, (xmlChar *)"id", (xmlChar *)istring); - if (!sa_group_is_zfs(group) && - sa_is_persistent((sa_group_t)share)) { + + if (!sa_is_persistent((sa_group_t)share)) + goto done; + + if (!sa_group_is_zfs(group)) { /* ZFS doesn't use resource names */ sa_handle_impl_t ihandle; + ihandle = (sa_handle_impl_t) sa_find_group_handle( group); @@ -3760,10 +3762,13 @@ sa_add_resource(sa_share_t share, char *resource, int persist, int *error) share); else err = SA_SYSTEM_ERR; + } else { + err = sa_zfs_update((sa_share_t)group); } } } } +done: if (error != NULL) *error = err; return ((sa_resource_t)node); @@ -3782,7 +3787,7 @@ sa_remove_resource(sa_resource_t resource) sa_group_t group; char *type; int ret = SA_OK; - int transient = 0; + boolean_t transient = B_FALSE; sa_optionset_t opt; share = sa_get_resource_parent(resource); @@ -3792,7 +3797,7 @@ sa_remove_resource(sa_resource_t resource) if (type != NULL) { if (strcmp(type, "persist") != 0) - transient = 1; + transient = B_TRUE; sa_free_attr_string(type); } @@ -3810,13 +3815,18 @@ sa_remove_resource(sa_resource_t resource) xmlFreeNode((xmlNode *)resource); /* only do SMF action if permanent and not ZFS */ - if (!transient && !sa_group_is_zfs(group)) { + if (transient) + return (ret); + + if (!sa_group_is_zfs(group)) { sa_handle_impl_t ihandle; ihandle = (sa_handle_impl_t)sa_find_group_handle(group); if (ihandle != NULL) ret = sa_commit_share(ihandle->scfhandle, group, share); else ret = SA_SYSTEM_ERR; + } else { + ret = sa_zfs_update((sa_share_t)group); } return (ret); } @@ -3889,11 +3899,16 @@ sa_rename_resource(sa_resource_t resource, char *newname) */ ret = proto_rename_resource(handle, group, resource, newname); set_node_attr(resource, "name", newname); - if (!sa_group_is_zfs(group) && - sa_is_persistent((sa_group_t)share)) { + + if (!sa_is_persistent((sa_group_t)share)) + return (ret); + + if (!sa_group_is_zfs(group)) { sa_handle_impl_t ihandle = (sa_handle_impl_t)handle; ret = sa_commit_share(ihandle->scfhandle, group, share); + } else { + ret = sa_zfs_update((sa_share_t)group); } } return (ret); diff --git a/usr/src/lib/libshare/common/libshare_zfs.c b/usr/src/lib/libshare/common/libshare_zfs.c index 43bfc0ed5a..ce9580908f 100644 --- a/usr/src/lib/libshare/common/libshare_zfs.c +++ b/usr/src/lib/libshare/common/libshare_zfs.c @@ -24,8 +24,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include <libzfs.h> #include <string.h> @@ -1141,14 +1139,14 @@ sa_zfs_update(sa_group_t group) strlen(optstring) > 0) { (void) snprintf(command, ZFS_MAXPROPLEN * 2, - "%s set sharenfs=%s %s", - COMMAND, + "%s set share%s=%s %s", + COMMAND, proto, optstring, dataset); } else { (void) snprintf(command, ZFS_MAXPROPLEN * 2, - "%s set sharenfs=on %s", - COMMAND, + "%s set share%s=on %s", + COMMAND, proto, dataset); } pfile = popen(command, "r"); diff --git a/usr/src/lib/libshare/smb/libshare_smb.c b/usr/src/lib/libshare/smb/libshare_smb.c index 383a839f5d..bc0cbff1b9 100644 --- a/usr/src/lib/libshare/smb/libshare_smb.c +++ b/usr/src/lib/libshare/smb/libshare_smb.c @@ -607,6 +607,7 @@ smb_disable_share(sa_share_t share, char *path) boolean_t iszfs; int err = SA_OK; sa_handle_t handle; + boolean_t first = B_TRUE; /* work around sharetab issue */ if (path == NULL) return (err); @@ -623,7 +624,7 @@ smb_disable_share(sa_share_t share, char *path) goto done; for (resource = sa_get_share_resource(share, NULL); - resource != NULL; + resource != NULL || err != SA_OK; resource = sa_get_next_resource(resource)) { rname = sa_get_resource_attr(resource, "name"); if (rname == NULL) { @@ -646,6 +647,17 @@ smb_disable_share(sa_share_t share, char *path) sa_sharetab_fill_zfs(share, &sh, "smb"); err = sa_share_zfs(share, (char *)path, &sh, rname, ZFS_UNSHARE_SMB); + /* + * If we are no longer the first case, we + * don't care about the sa_share_zfs err if it + * is -1. This works around a problem in + * sharefs and should be removed when sharefs + * supports multiple entries per path. + */ + if (!first && err == -1) + err = SA_OK; + first = B_FALSE; + sa_emptyshare(&sh); } sa_free_attr_string(rname); |
