diff options
author | ahrens <none@none> | 2007-08-02 21:23:46 -0700 |
---|---|---|
committer | ahrens <none@none> | 2007-08-02 21:23:46 -0700 |
commit | 91ebeef555ce7f899b6270a3c2df47b51f7ad59a (patch) | |
tree | 7c2ea33b8ecbb85fdd82366244cb0850dbba3287 /usr/src/lib/libzfs | |
parent | 03509b53a806cb39ca94c9a1c00f1c6405321554 (diff) | |
download | illumos-joyent-91ebeef555ce7f899b6270a3c2df47b51f7ad59a.tar.gz |
6393351 unique_* could be improved
6553348 assertion failed: ab->b_flags & (1 << 3) at line 2572 of arc.c
6582408 ::arc should accept -k/-m/-g to print in kilo/mega/giga-bytes
6582438 should have generic reader-priority rwlock for spa_config locks
6582441 zfs_cmd_t should only be used to pass arguments to/from userland
6582456 property code is overdue for some spring cleaning
6588564 zpl unmount lock should use regular rwlock
Diffstat (limited to 'usr/src/lib/libzfs')
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs.h | 1 | ||||
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs_dataset.c | 121 | ||||
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs_util.c | 6 |
3 files changed, 39 insertions, 89 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h index c7c2726fa6..c444062fa1 100644 --- a/usr/src/lib/libzfs/common/libzfs.h +++ b/usr/src/lib/libzfs/common/libzfs.h @@ -107,7 +107,6 @@ enum { EZFS_BADWHO, /* invalid permission who */ EZFS_BADPERM, /* invalid permission */ EZFS_BADPERMSET, /* invalid permission set name */ - EZFS_PERMSET_CIRCULAR, /* circular dependency on permset */ EZFS_NODELEGATION, /* delegated administration is disabled */ EZFS_PERMRDONLY, /* pemissions are readonly */ EZFS_UNKNOWN diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c index 383b63169e..05c074437c 100644 --- a/usr/src/lib/libzfs/common/libzfs_dataset.c +++ b/usr/src/lib/libzfs/common/libzfs_dataset.c @@ -839,14 +839,14 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, char *pool_name, */ strval = NULL; switch (zfs_prop_get_type(prop)) { - case prop_type_boolean: + case PROP_TYPE_BOOLEAN: if (prop_parse_boolean(hdl, elem, &intval) != 0) { (void) zfs_error(hdl, EZFS_BADPROP, errbuf); goto error; } break; - case prop_type_string: + case PROP_TYPE_STRING: if (nvpair_type(elem) != DATA_TYPE_STRING) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' must be a string"), @@ -863,14 +863,14 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, char *pool_name, } break; - case prop_type_number: + case PROP_TYPE_NUMBER: if (prop_parse_number(hdl, elem, prop, &intval) != 0) { (void) zfs_error(hdl, EZFS_BADPROP, errbuf); goto error; } break; - case prop_type_index: + case PROP_TYPE_INDEX: if (prop_parse_index(hdl, elem, prop, &intval) != 0) { (void) zfs_error(hdl, EZFS_BADPROP, errbuf); goto error; @@ -1312,21 +1312,12 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms, nvlist_t *perms_nvp = NULL; nvlist_t *sets_nvp = NULL; char errbuf[1024]; - char *who_tok; + char *who_tok, *perm; int error; *nvp = NULL; if (perms) { - /* Make sure permission string doesn't have an '=' sign in it */ - if (strchr(perms, '=') != NULL) { - (void) snprintf(errbuf, sizeof (errbuf), - dgettext(TEXT_DOMAIN, - "permissions can't contain equal sign : '%s'"), - perms); - return (zfs_error(zhp->zfs_hdl, EZFS_BADPERM, errbuf)); - } - if ((error = nvlist_alloc(&perms_nvp, NV_UNIQUE_NAME, 0)) != 0) { return (1); @@ -1351,6 +1342,12 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms, char what; if ((error = permset_namecheck(whostr, &why, &what)) != 0) { + nvlist_free(who_nvp); + if (perms_nvp) + nvlist_free(perms_nvp); + if (sets_nvp) + nvlist_free(sets_nvp); + switch (why) { case NAME_ERR_NO_AT: zfs_error_aux(zhp->zfs_hdl, @@ -1368,74 +1365,28 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms, * The first nvlist perms_nvp will have normal permissions and the * other sets_nvp will have only permssion set names in it. */ - - - while (perms && *perms != '\0') { - char *value; - char *perm_name; - nvlist_t *update_nvp; - int perm_num; - char canonical_name[64]; - char *canonicalp = canonical_name; - - - update_nvp = perms_nvp; - - perm_num = getsubopt(&perms, zfs_deleg_perm_tab, &value); - if (perm_num == -1) { - zfs_prop_t prop; - - prop = zfs_name_to_prop(value); - if (prop != ZFS_PROP_INVAL) { - (void) snprintf(canonical_name, - sizeof (canonical_name), "%s", - zfs_prop_to_name(prop)); - perm_num = getsubopt(&canonicalp, - zfs_deleg_perm_tab, &value); - } - } - if (perm_num != -1) { - perm_name = zfs_deleg_perm_tab[perm_num]; - } else { /* check and see if permission is a named set */ - if (value[0] == '@') { - - /* - * make sure permssion set isn't defined - * in terms of itself. ie. - * @set1 = create,destroy,@set1 - */ - if (who_type == ZFS_DELEG_NAMED_SET && - strcmp(value, whostr) == 0) { - nvlist_free(who_nvp); - nvlist_free(perms_nvp); - if (sets_nvp) - nvlist_free(sets_nvp); - (void) snprintf(errbuf, - sizeof (errbuf), - dgettext(TEXT_DOMAIN, - "Invalid permission %s"), value); - return (zfs_error(zhp->zfs_hdl, - EZFS_PERMSET_CIRCULAR, errbuf)); - } - update_nvp = sets_nvp; - perm_name = value; - } else { - nvlist_free(who_nvp); - nvlist_free(perms_nvp); - if (sets_nvp) - nvlist_free(sets_nvp); - return (zfs_error(zhp->zfs_hdl, - EZFS_BADPERM, value)); - } + for (perm = strtok(perms, ","); perm; perm = strtok(NULL, ",")) { + const char *perm_canonical = zfs_deleg_canonicalize_perm(perm); + + if (perm_canonical) { + verify(nvlist_add_boolean(perms_nvp, + perm_canonical) == 0); + } else if (perm[0] == '@') { + verify(nvlist_add_boolean(sets_nvp, perm) == 0); + } else { + nvlist_free(who_nvp); + nvlist_free(perms_nvp); + nvlist_free(sets_nvp); + return (zfs_error(zhp->zfs_hdl, EZFS_BADPERM, perm)); } - verify(nvlist_add_boolean(update_nvp, perm_name) == 0); } if (whostr && who_type != ZFS_DELEG_CREATE) { who_tok = strtok(whostr, ","); if (who_tok == NULL) { nvlist_free(who_nvp); - nvlist_free(perms_nvp); + if (perms_nvp) + nvlist_free(perms_nvp); if (sets_nvp) nvlist_free(sets_nvp); (void) snprintf(errbuf, sizeof (errbuf), @@ -1455,7 +1406,8 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms, &who_id); if (error) { nvlist_free(who_nvp); - nvlist_free(perms_nvp); + if (perms_nvp) + nvlist_free(perms_nvp); if (sets_nvp) nvlist_free(sets_nvp); (void) snprintf(errbuf, sizeof (errbuf), @@ -1468,7 +1420,6 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms, /* * add entries for both local and descendent when required */ - zfs_perms_add_who_nvlist(who_nvp, who_id, who_tok, perms_nvp, sets_nvp, who_type, inherit); @@ -2321,13 +2272,13 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zfs_source_t *src, default: switch (zfs_prop_get_type(prop)) { - case prop_type_number: - case prop_type_boolean: - case prop_type_index: + case PROP_TYPE_NUMBER: + case PROP_TYPE_BOOLEAN: + case PROP_TYPE_INDEX: *val = getprop_uint64(zhp, prop, source); break; - case prop_type_string: + case PROP_TYPE_STRING: default: zfs_error_aux(zhp->zfs_hdl, dgettext(TEXT_DOMAIN, "cannot get non-numeric property")); @@ -2536,7 +2487,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, default: switch (zfs_prop_get_type(prop)) { - case prop_type_number: + case PROP_TYPE_NUMBER: if (get_numeric_property(zhp, prop, src, &source, &val) != 0) return (-1); @@ -2547,12 +2498,12 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, zfs_nicenum(val, propbuf, proplen); break; - case prop_type_string: + case PROP_TYPE_STRING: (void) strlcpy(propbuf, getprop_string(zhp, prop, &source), proplen); break; - case prop_type_boolean: + case PROP_TYPE_BOOLEAN: if (get_numeric_property(zhp, prop, src, &source, &val) != 0) return (-1); @@ -2560,7 +2511,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, break; - case prop_type_index: + case PROP_TYPE_INDEX: val = getprop_uint64(zhp, prop, &source); if (zfs_prop_index_to_string(prop, val, &strval) != 0) diff --git a/usr/src/lib/libzfs/common/libzfs_util.c b/usr/src/lib/libzfs/common/libzfs_util.c index 26c4422b82..7c45ef727e 100644 --- a/usr/src/lib/libzfs/common/libzfs_util.c +++ b/usr/src/lib/libzfs/common/libzfs_util.c @@ -44,6 +44,7 @@ #include <libzfs.h> #include "libzfs_impl.h" +#include "zfs_prop.h" int libzfs_errno(libzfs_handle_t *hdl) @@ -186,9 +187,6 @@ libzfs_error_description(libzfs_handle_t *hdl) return (dgettext(TEXT_DOMAIN, "invalid permission")); case EZFS_BADPERMSET: return (dgettext(TEXT_DOMAIN, "invalid permission set name")); - case EZFS_PERMSET_CIRCULAR: - return (dgettext(TEXT_DOMAIN, - "Cannot define a permission set in terms of itself")); case EZFS_NODELEGATION: return (dgettext(TEXT_DOMAIN, "delegated administration is " "disabled on pool")); @@ -556,6 +554,8 @@ libzfs_init(void) hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r"); + zfs_prop_init(); + return (hdl); } |