diff options
| author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-10-13 11:45:01 +0000 | 
|---|---|---|
| committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2015-10-13 11:45:01 +0000 | 
| commit | ac0a0c16e96b64cdfdc17638bb31a18b68feb90e (patch) | |
| tree | e883c35dbba6a3411f78ec84d295857da273ead8 /usr/src/lib/libzfs | |
| parent | 40de0c8e2114b07dd8bd8e05ad3c199f84f96b41 (diff) | |
| parent | e9316f7696401f3e5e263a5939031cb8d5641a88 (diff) | |
| download | illumos-joyent-ac0a0c16e96b64cdfdc17638bb31a18b68feb90e.tar.gz | |
	[illumos-gate merge]
commit e9316f7696401f3e5e263a5939031cb8d5641a88
    6298 zfs_create_008_neg and zpool_create_023_neg need to be updated for large block support
commit 28c4d110d9dd87af1d9dcf1bf503cea2e7c03b91
    6128 tar should check prefix field when detecting EOT
    6129 tar debug output should be available in all builds
commit d94527b3280cbf89d5360b28aff9e822cd79d0e6
    6294 GRUB should try all DVAs
	Conflicts:
	usr/src/cmd/tar/tar.c
Diffstat (limited to 'usr/src/lib/libzfs')
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs.h | 4 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs_dataset.c | 51 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs_pool.c | 19 | 
3 files changed, 55 insertions, 19 deletions
| diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h index 543e91a2fe..d4970e38c1 100644 --- a/usr/src/lib/libzfs/common/libzfs.h +++ b/usr/src/lib/libzfs/common/libzfs.h @@ -21,7 +21,7 @@  /*   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011, 2014 by Delphix. All rights reserved. + * Copyright (c) 2011, 2015 by Delphix. All rights reserved.   * Copyright (c) 2012, Joyent, Inc. All rights reserved.   * Copyright (c) 2013 Steven Hartland. All rights reserved.   * Copyright 2013 Nexenta Systems, Inc.  All rights reserved. @@ -423,7 +423,7 @@ extern const char *zfs_prop_column_name(zfs_prop_t);  extern boolean_t zfs_prop_align_right(zfs_prop_t);  extern nvlist_t *zfs_valid_proplist(libzfs_handle_t *, zfs_type_t, -    nvlist_t *, uint64_t, zfs_handle_t *, const char *); +    nvlist_t *, uint64_t, zfs_handle_t *, zpool_handle_t *, const char *);  extern const char *zfs_prop_to_name(zfs_prop_t);  extern int zfs_prop_set(zfs_handle_t *, const char *, const char *); diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c index 8d33d1b3cb..d282b0d9a5 100644 --- a/usr/src/lib/libzfs/common/libzfs_dataset.c +++ b/usr/src/lib/libzfs/common/libzfs_dataset.c @@ -22,7 +22,7 @@  /*   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.   * Copyright (c) 2013, Joyent, Inc. All rights reserved. - * Copyright (c) 2011, 2014 by Delphix. All rights reserved. + * Copyright (c) 2011, 2015 by Delphix. All rights reserved.   * Copyright (c) 2012 DEY Storage Systems, Inc.  All rights reserved.   * Copyright (c) 2013 Martin Matuska. All rights reserved.   * Copyright (c) 2013 Steven Hartland. All rights reserved. @@ -862,7 +862,8 @@ zfs_which_resv_prop(zfs_handle_t *zhp, zfs_prop_t *resv_prop)   */  nvlist_t *  zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, -    uint64_t zoned, zfs_handle_t *zhp, const char *errbuf) +    uint64_t zoned, zfs_handle_t *zhp, zpool_handle_t *zpool_hdl, +    const char *errbuf)  {  	nvpair_t *elem;  	uint64_t intval; @@ -1056,8 +1057,8 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,  		case ZFS_PROP_RECORDSIZE:  		{  			int maxbs = SPA_MAXBLOCKSIZE; -			if (zhp != NULL) { -				maxbs = zpool_get_prop_int(zhp->zpool_hdl, +			if (zpool_hdl != NULL) { +				maxbs = zpool_get_prop_int(zpool_hdl,  				    ZPOOL_PROP_MAXBLOCKSIZE, NULL);  			}  			/* @@ -1555,7 +1556,8 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props)  	    zhp->zfs_name);  	if ((nvl = zfs_valid_proplist(hdl, zhp->zfs_type, props, -	    zfs_prop_get_int(zhp, ZFS_PROP_ZONED), zhp, errbuf)) == NULL) +	    zfs_prop_get_int(zhp, ZFS_PROP_ZONED), zhp, zhp->zpool_hdl, +	    errbuf)) == NULL)  		goto error;  	/* @@ -3207,9 +3209,23 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,  	else  		ost = DMU_OST_ZFS; +	/* open zpool handle for prop validation */ +	char pool_path[MAXNAMELEN]; +	(void) strlcpy(pool_path, path, sizeof (pool_path)); + +	/* truncate pool_path at first slash */ +	char *p = strchr(pool_path, '/'); +	if (p != NULL) +		*p = '\0'; + +	zpool_handle_t *zpool_handle = zpool_open(hdl, pool_path); +  	if (props && (props = zfs_valid_proplist(hdl, type, props, -	    zoned, NULL, errbuf)) == 0) +	    zoned, NULL, zpool_handle, errbuf)) == 0) { +		zpool_close(zpool_handle);  		return (-1); +	} +	zpool_close(zpool_handle);  	if (type == ZFS_TYPE_VOLUME) {  		/* @@ -3277,13 +3293,6 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,  			    "parent '%s' is not a filesystem"), parent);  			return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); -		case EDOM: -			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, -			    "volume block size must be power of 2 from " -			    "512B to 128KB")); - -			return (zfs_error(hdl, EZFS_BADPROP, errbuf)); -  		case ENOTSUP:  			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,  			    "pool must be upgraded to set this " @@ -3478,7 +3487,7 @@ zfs_clone(zfs_handle_t *zhp, const char *target, nvlist_t *props)  			type = ZFS_TYPE_FILESYSTEM;  		}  		if ((props = zfs_valid_proplist(hdl, type, props, zoned, -		    zhp, errbuf)) == NULL) +		    zhp, zhp->zpool_hdl, errbuf)) == NULL)  			return (-1);  	} @@ -3622,11 +3631,23 @@ zfs_snapshot_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, nvlist_t *props)  		}  	} +	/* +	 * get pool handle for prop validation. assumes all snaps are in the +	 * same pool, as does lzc_snapshot (below). +	 */ +	char pool[MAXNAMELEN]; +	elem = nvlist_next_nvpair(snaps, NULL); +	(void) strlcpy(pool, nvpair_name(elem), sizeof (pool)); +	pool[strcspn(pool, "/@")] = '\0'; +	zpool_handle_t *zpool_hdl = zpool_open(hdl, pool); +  	if (props != NULL &&  	    (props = zfs_valid_proplist(hdl, ZFS_TYPE_SNAPSHOT, -	    props, B_FALSE, NULL, errbuf)) == NULL) { +	    props, B_FALSE, NULL, zpool_hdl, errbuf)) == NULL) { +		zpool_close(zpool_hdl);  		return (-1);  	} +	zpool_close(zpool_hdl);  	ret = lzc_snapshot(snaps, props, &errors); diff --git a/usr/src/lib/libzfs/common/libzfs_pool.c b/usr/src/lib/libzfs/common/libzfs_pool.c index 26223d2790..a93a46b938 100644 --- a/usr/src/lib/libzfs/common/libzfs_pool.c +++ b/usr/src/lib/libzfs/common/libzfs_pool.c @@ -1101,8 +1101,8 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot,  		    zfs_prop_to_name(ZFS_PROP_ZONED), &zonestr) == 0) &&  		    strcmp(zonestr, "on") == 0); -		if ((zc_fsprops = zfs_valid_proplist(hdl, -		    ZFS_TYPE_FILESYSTEM, fsprops, zoned, NULL, msg)) == NULL) { +		if ((zc_fsprops = zfs_valid_proplist(hdl, ZFS_TYPE_FILESYSTEM, +		    fsprops, zoned, NULL, NULL, msg)) == NULL) {  			goto create_failed;  		}  		if (!zc_props && @@ -1138,6 +1138,21 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot,  			    "one or more vdevs refer to the same device"));  			return (zfs_error(hdl, EZFS_BADDEV, msg)); +		case ERANGE: +			/* +			 * This happens if the record size is smaller or larger +			 * than the allowed size range, or not a power of 2. +			 * +			 * NOTE: although zfs_valid_proplist is called earlier, +			 * this case may have slipped through since the +			 * pool does not exist yet and it is therefore +			 * impossible to read properties e.g. max blocksize +			 * from the pool. +			 */ +			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, +			    "record size invalid")); +			return (zfs_error(hdl, EZFS_BADPROP, msg)); +  		case EOVERFLOW:  			/*  			 * This occurs when one of the devices is below | 
