summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorDoug McCallum <Doug.McCallum@Sun.COM>2008-09-03 15:19:36 -0600
committerDoug McCallum <Doug.McCallum@Sun.COM>2008-09-03 15:19:36 -0600
commit1f713840d3b0fdc1eb54245ec133d1c87df73d13 (patch)
treed5b22ca977d485aa4d68b04fa304e5a1497b9863 /usr/src
parent22de10488e332d0fe098537ac4c2d4c04772719d (diff)
downloadillumos-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.c33
-rw-r--r--usr/src/lib/libshare/common/libshare_zfs.c10
-rw-r--r--usr/src/lib/libshare/smb/libshare_smb.c14
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);