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 | |
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')
-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 | ||||
-rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_main.c | 13 | ||||
-rw-r--r-- | usr/src/lib/libzfs_jni/common/libzfs_jni_property.c | 57 |
5 files changed, 72 insertions, 126 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); } diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c index 04f46bd982..c7973e9979 100644 --- a/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c +++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_main.c @@ -176,14 +176,13 @@ Java_com_sun_zfs_common_model_SystemDataModel_getPool(JNIEnv *env, /* Verify that object is Pool, not some other Dataset */ if (pool != NULL) { - jclass class = (*env)->FindClass( - env, ZFSJNI_PACKAGE_DATA "Pool"); + jclass class = (*env)->FindClass( + env, ZFSJNI_PACKAGE_DATA "Pool"); - jboolean is_pool = (*env)->IsInstanceOf(env, pool, class); + jboolean is_pool = (*env)->IsInstanceOf(env, pool, class); - if (is_pool != JNI_TRUE) { - pool = NULL; - } + if (is_pool != JNI_TRUE) + pool = NULL; } return (pool); @@ -570,7 +569,7 @@ Java_com_sun_zfs_common_model_SystemDataModel_getValidPropertyNames(JNIEnv *env, map_data.env = env; map_data.type = mappings[i].type; map_data.list = list; - (void) zfs_prop_iter(mapping_cb, &map_data, B_FALSE); + (void) zfs_prop_iter(mapping_cb, &map_data); break; } } diff --git a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c index 0247e92469..95114aa9fb 100644 --- a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c +++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c @@ -172,21 +172,19 @@ create_BasicProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop, jobject propValue = NULL; if (convert_str != NULL) { - char propbuf[ZFS_MAXPROPLEN]; - int result = zfs_prop_get(zhp, prop, propbuf, - sizeof (propbuf), &srctype, source, sizeof (source), 1); + char propbuf[ZFS_MAXPROPLEN]; + int result = zfs_prop_get(zhp, prop, propbuf, + sizeof (propbuf), &srctype, source, sizeof (source), 1); - if (result == 0) { - propValue = convert_str(env, propbuf); - } + if (result == 0) + propValue = convert_str(env, propbuf); } else { - uint64_t value; - int result = zfs_prop_get_numeric( - zhp, prop, &value, &srctype, source, sizeof (source)); + uint64_t value; + int result = zfs_prop_get_numeric( + zhp, prop, &value, &srctype, source, sizeof (source)); - if (result == 0) { - propValue = convert_uint64(env, value); - } + if (result == 0) + propValue = convert_uint64(env, value); } if (propValue != NULL) { @@ -267,21 +265,19 @@ create_ObjectProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop, jobject propValue = NULL; if (convert_str != NULL) { - char propbuf[ZFS_MAXPROPLEN]; - int result = zfs_prop_get(zhp, prop, propbuf, - sizeof (propbuf), &srctype, source, sizeof (source), 1); + char propbuf[ZFS_MAXPROPLEN]; + int result = zfs_prop_get(zhp, prop, propbuf, + sizeof (propbuf), &srctype, source, sizeof (source), 1); - if (result == 0) { - propValue = convert_str(env, propbuf); - } + if (result == 0) + propValue = convert_str(env, propbuf); } else { - uint64_t value; - int result = zfs_prop_get_numeric( - zhp, prop, &value, &srctype, source, sizeof (source)); + uint64_t value; + int result = zfs_prop_get_numeric( + zhp, prop, &value, &srctype, source, sizeof (source)); - if (result == 0) { - propValue = convert_uint64(env, value); - } + if (result == 0) + propValue = convert_uint64(env, value); } if (propValue != NULL) { @@ -520,10 +516,12 @@ zjni_get_default_property(JNIEnv *env, zfs_prop_t prop) for (i = 0; props_custom[i].prop != ZFS_PROP_INVAL; i++) { if (prop == props_custom[i].prop) { - return create_default_ObjectProperty(env, - props_custom[i].prop, props_custom[i].convert_str, - props_custom[i].convert_uint64, - props_custom[i].propClass, props_custom[i].valueClass); + return create_default_ObjectProperty(env, + props_custom[i].prop, + props_custom[i].convert_str, + props_custom[i].convert_uint64, + props_custom[i].propClass, + props_custom[i].valueClass); } } @@ -546,8 +544,7 @@ zjni_get_property_from_name(const char *name) { zfs_prop_t prop; - prop = zfs_prop_iter(zjni_get_property_from_name_cb, (void *)name, - B_FALSE); + prop = zfs_prop_iter(zjni_get_property_from_name_cb, (void *)name); return (prop == ZFS_PROP_CONT ? ZFS_PROP_INVAL : prop); } |