usr/src/uts/common/fs/zfs/dsl_prop.c
author maybee
Thu, 22 May 2008 11:13:47 -0700
changeset 6689 47572a2f5e73
parent 6047 235fee4665e7
child 7046 361307ae060d
permissions -rw-r--r--
6610506 Eliminate or improve retry logic from callers of dmu_objset_open() 6695465 divide by zero in txg_sync_thread() under heavy load
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
6047
235fee4665e7 6598604 BAD TRAP while set property to multiple filesystems
ahrens
parents: 5569
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/dmu.h>
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
    29
#include <sys/dmu_objset.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/dsl_prop.h>
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
    34
#include <sys/dsl_synctask.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/zio_checksum.h> /* for the default checksum value */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include "zfs_prop.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
dodefault(const char *propname, int intsz, int numint, void *buf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
	zfs_prop_t prop;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
    47
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
    48
	 * The setonce properties are read-only, BUT they still
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
    49
	 * have a default value that can be used as the initial
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
    50
	 * value.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
    51
	 */
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
    52
	if ((prop = zfs_name_to_prop(propname)) == ZPROP_INVAL ||
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
    53
	    (zfs_prop_readonly(prop) && !zfs_prop_setonce(prop)))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
		return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4543
diff changeset
    56
	if (zfs_prop_get_type(prop) == PROP_TYPE_STRING) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
		if (intsz != 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
			return (EOVERFLOW);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
    59
		(void) strncpy(buf, zfs_prop_default_string(prop),
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
    60
		    numint);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
		if (intsz != 8 || numint < 1)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
			return (EOVERFLOW);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
		*(uint64_t *)buf = zfs_prop_default_numeric(prop);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
static int
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    72
dsl_prop_get_impl(dsl_dir_t *dd, const char *propname,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
    int intsz, int numint, void *buf, char *setpoint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    75
	int err = ENOENT;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
    76
	zfs_prop_t prop;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
	if (setpoint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
		setpoint[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
    81
	prop = zfs_name_to_prop(propname);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
    82
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    83
	/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    84
	 * Note: dd may be NULL, therefore we shouldn't dereference it
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    85
	 * ouside this loop.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    86
	 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    87
	for (; dd != NULL; dd = dd->dd_parent) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    88
		objset_t *mos = dd->dd_pool->dp_meta_objset;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
    89
		ASSERT(RW_LOCK_HELD(&dd->dd_pool->dp_config_rwlock));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
		err = zap_lookup(mos, dd->dd_phys->dd_props_zapobj,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
		    propname, intsz, numint, buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
		if (err != ENOENT) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
			if (setpoint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
				dsl_dir_name(dd, setpoint);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
		}
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
    97
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
    98
		/*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
    99
		 * Break out of this loop for non-inheritable properties.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   100
		 */
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   101
		if (prop != ZPROP_INVAL && !zfs_prop_inheritable(prop))
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   102
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
	if (err == ENOENT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
		err = dodefault(propname, intsz, numint, buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
 * Register interest in the named property.  We'll call the callback
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
 * once to notify it of the current property value, and again each time
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
 * the property changes, until this callback is unregistered.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
 * Return 0 on success, errno if the prop is not an integer value.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
dsl_prop_register(dsl_dataset_t *ds, const char *propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
    dsl_prop_changed_cb_t *callback, void *cbarg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   121
	dsl_dir_t *dd = ds->ds_dir;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
	uint64_t value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
	dsl_prop_cb_record_t *cbr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
	int err;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   125
	int need_rwlock;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   127
	need_rwlock = !RW_WRITE_HELD(&dd->dd_pool->dp_config_rwlock);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   128
	if (need_rwlock)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   129
		rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   131
	err = dsl_prop_get_impl(dd, propname, 8, 1, &value, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	if (err != 0) {
5569
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5378
diff changeset
   133
		if (need_rwlock)
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5378
diff changeset
   134
			rw_exit(&dd->dd_pool->dp_config_rwlock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
		return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	cbr = kmem_alloc(sizeof (dsl_prop_cb_record_t), KM_SLEEP);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   139
	cbr->cbr_ds = ds;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
	cbr->cbr_propname = kmem_alloc(strlen(propname)+1, KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
	(void) strcpy((char *)cbr->cbr_propname, propname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
	cbr->cbr_func = callback;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
	cbr->cbr_arg = cbarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
	mutex_enter(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
	list_insert_head(&dd->dd_prop_cbs, cbr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
	mutex_exit(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
	cbr->cbr_func(cbr->cbr_arg, value);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   150
	VERIFY(0 == dsl_dir_open_obj(dd->dd_pool, dd->dd_object,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   151
	    NULL, cbr, &dd));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   152
	if (need_rwlock)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   153
		rw_exit(&dd->dd_pool->dp_config_rwlock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
	/* Leave dataset open until this callback is unregistered */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
dsl_prop_get_ds(dsl_dir_t *dd, const char *propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
    int intsz, int numints, void *buf, char *setpoint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
	rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   165
	err = dsl_prop_get_impl(dd, propname, intsz, numints, buf, setpoint);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
	rw_exit(&dd->dd_pool->dp_config_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   171
/*
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   172
 * Get property when config lock is already held.
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   173
 */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   174
int dsl_prop_get_ds_locked(dsl_dir_t *dd, const char *propname,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   175
    int intsz, int numints, void *buf, char *setpoint)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   176
{
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   177
	ASSERT(RW_LOCK_HELD(&dd->dd_pool->dp_config_rwlock));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   178
	return (dsl_prop_get_impl(dd, propname, intsz, numints, buf, setpoint));
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   179
}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   180
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
dsl_prop_get(const char *ddname, const char *propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
    int intsz, int numints, void *buf, char *setpoint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
	dsl_dir_t *dd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
	const char *tail;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   189
	err = dsl_dir_open(ddname, FTAG, &dd, &tail);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   190
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   191
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
	if (tail && tail[0] != '@') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
		dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
		return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
	err = dsl_prop_get_ds(dd, propname, intsz, numints, buf, setpoint);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
	dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
 * Get the current property value.  It may have changed by the time this
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
 * function returns, so it is NOT safe to follow up with
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
 * dsl_prop_register() and assume that the value has not changed in
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
 * between.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
 * Return 0 on success, ENOENT if ddname is invalid.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
dsl_prop_get_integer(const char *ddname, const char *propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
    uint64_t *valuep, char *setpoint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
	return (dsl_prop_get(ddname, propname, 8, 1, valuep, setpoint));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
 * Unregister this callback.  Return 0 on success, ENOENT if ddname is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
 * invalid, ENOMSG if no matching callback registered.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
dsl_prop_unregister(dsl_dataset_t *ds, const char *propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
    dsl_prop_changed_cb_t *callback, void *cbarg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
{
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   226
	dsl_dir_t *dd = ds->ds_dir;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
	dsl_prop_cb_record_t *cbr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
	mutex_enter(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
	for (cbr = list_head(&dd->dd_prop_cbs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
	    cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   232
		if (cbr->cbr_ds == ds &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
		    cbr->cbr_func == callback &&
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   234
		    cbr->cbr_arg == cbarg &&
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   235
		    strcmp(cbr->cbr_propname, propname) == 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
	if (cbr == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
		mutex_exit(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
		return (ENOMSG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
	list_remove(&dd->dd_prop_cbs, cbr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	mutex_exit(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	kmem_free((void*)cbr->cbr_propname, strlen(cbr->cbr_propname)+1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
	kmem_free(cbr, sizeof (dsl_prop_cb_record_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
	/* Clean up from dsl_prop_register */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
	dsl_dir_close(dd, cbr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   254
/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   255
 * Return the number of callbacks that are registered for this dataset.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   256
 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   257
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   258
dsl_prop_numcb(dsl_dataset_t *ds)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   259
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   260
	dsl_dir_t *dd = ds->ds_dir;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   261
	dsl_prop_cb_record_t *cbr;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   262
	int num = 0;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   263
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   264
	mutex_enter(&dd->dd_lock);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   265
	for (cbr = list_head(&dd->dd_prop_cbs);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   266
	    cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   267
		if (cbr->cbr_ds == ds)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   268
			num++;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   269
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   270
	mutex_exit(&dd->dd_lock);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   271
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   272
	return (num);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   273
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   274
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
dsl_prop_changed_notify(dsl_pool_t *dp, uint64_t ddobj,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
    const char *propname, uint64_t value, int first)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
	dsl_dir_t *dd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
	dsl_prop_cb_record_t *cbr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
	objset_t *mos = dp->dp_meta_objset;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   282
	zap_cursor_t zc;
6047
235fee4665e7 6598604 BAD TRAP while set property to multiple filesystems
ahrens
parents: 5569
diff changeset
   283
	zap_attribute_t *za;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
	ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   287
	err = dsl_dir_open_obj(dp, ddobj, NULL, FTAG, &dd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   288
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   289
		return;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
	if (!first) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
		 * If the prop is set here, then this change is not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
		 * being inherited here or below; stop the recursion.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
		err = zap_lookup(mos, dd->dd_phys->dd_props_zapobj, propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
		    8, 1, &value);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
		if (err == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
			dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
			return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
		ASSERT3U(err, ==, ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
	mutex_enter(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
	for (cbr = list_head(&dd->dd_prop_cbs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
	    cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
		if (strcmp(cbr->cbr_propname, propname) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
			cbr->cbr_func(cbr->cbr_arg, value);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
	mutex_exit(&dd->dd_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
6047
235fee4665e7 6598604 BAD TRAP while set property to multiple filesystems
ahrens
parents: 5569
diff changeset
   314
	za = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   315
	for (zap_cursor_init(&zc, mos,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   316
	    dd->dd_phys->dd_child_dir_zapobj);
6047
235fee4665e7 6598604 BAD TRAP while set property to multiple filesystems
ahrens
parents: 5569
diff changeset
   317
	    zap_cursor_retrieve(&zc, za) == 0;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   318
	    zap_cursor_advance(&zc)) {
6047
235fee4665e7 6598604 BAD TRAP while set property to multiple filesystems
ahrens
parents: 5569
diff changeset
   319
		dsl_prop_changed_notify(dp, za->za_first_integer,
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   320
		    propname, value, FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
	}
6047
235fee4665e7 6598604 BAD TRAP while set property to multiple filesystems
ahrens
parents: 5569
diff changeset
   322
	kmem_free(za, sizeof (zap_attribute_t));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   323
	zap_cursor_fini(&zc);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
	dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
struct prop_set_arg {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
	const char *name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
	int intsz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
	int numints;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
	const void *buf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   334
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   335
static void
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   336
dsl_prop_set_sync(void *arg1, void *arg2, cred_t *cr, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
{
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   338
	dsl_dir_t *dd = arg1;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   339
	struct prop_set_arg *psa = arg2;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
	objset_t *mos = dd->dd_pool->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
	uint64_t zapobj = dd->dd_phys->dd_props_zapobj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
	uint64_t intval;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   343
	int isint;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   344
	char valbuf[32];
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   345
	char *valstr;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   347
	isint = (dodefault(psa->name, 8, 1, &intval) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
	if (psa->numints == 0) {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   350
		int err = zap_remove(mos, zapobj, psa->name, tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   351
		ASSERT(err == 0 || err == ENOENT);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   352
		if (isint) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   353
			VERIFY(0 == dsl_prop_get_impl(dd->dd_parent,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   354
			    psa->name, 8, 1, &intval, NULL));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
	} else {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   357
		VERIFY(0 == zap_update(mos, zapobj, psa->name,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   358
		    psa->intsz, psa->numints, psa->buf, tx));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
		if (isint)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
			intval = *(uint64_t *)psa->buf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
   363
	if (isint) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
		dsl_prop_changed_notify(dd->dd_pool,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
		    dd->dd_object, psa->name, intval, TRUE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   366
	}
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   367
	if (isint) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   368
		(void) snprintf(valbuf, sizeof (valbuf),
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   369
		    "%lld", (longlong_t)intval);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   370
		valstr = valbuf;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   371
	} else {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   372
		valstr = (char *)psa->buf;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   373
	}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   374
	spa_history_internal_log((psa->numints == 0) ? LOG_DS_INHERIT :
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   375
	    LOG_DS_PROPSET, dd->dd_pool->dp_spa, tx, cr,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   376
	    "%s=%s dataset = %llu", psa->name, valstr,
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2885
diff changeset
   377
	    dd->dd_phys->dd_head_dataset_obj);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   380
void
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   381
dsl_prop_set_uint64_sync(dsl_dir_t *dd, const char *name, uint64_t val,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   382
    cred_t *cr, dmu_tx_t *tx)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   383
{
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   384
	objset_t *mos = dd->dd_pool->dp_meta_objset;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   385
	uint64_t zapobj = dd->dd_phys->dd_props_zapobj;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   386
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   387
	ASSERT(dmu_tx_is_syncing(tx));
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   388
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   389
	VERIFY(0 == zap_update(mos, zapobj, name, sizeof (val), 1, &val, tx));
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   390
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   391
	dsl_prop_changed_notify(dd->dd_pool, dd->dd_object, name, val, TRUE);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   392
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   393
	spa_history_internal_log(LOG_DS_PROPSET, dd->dd_pool->dp_spa, tx, cr,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   394
	    "%s=%llu dataset = %llu", name, (u_longlong_t)val,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   395
	    dd->dd_phys->dd_head_dataset_obj);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   396
}
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5331
diff changeset
   397
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
int
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   399
dsl_prop_set_dd(dsl_dir_t *dd, const char *propname,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   400
    int intsz, int numints, const void *buf)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   401
{
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   402
	struct prop_set_arg psa;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   403
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   404
	psa.name = propname;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   405
	psa.intsz = intsz;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   406
	psa.numints = numints;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   407
	psa.buf = buf;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   408
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   409
	return (dsl_sync_task_do(dd->dd_pool,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   410
	    NULL, dsl_prop_set_sync, dd, &psa, 2));
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   411
}
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   412
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   413
int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
dsl_prop_set(const char *ddname, const char *propname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
    int intsz, int numints, const void *buf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
	dsl_dir_t *dd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
	int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
2641
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   420
	/*
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   421
	 * We must do these checks before we get to the syncfunc, since
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   422
	 * it can't fail.
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   423
	 */
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   424
	if (strlen(propname) >= ZAP_MAXNAMELEN)
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   425
		return (ENAMETOOLONG);
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   426
	if (intsz * numints >= ZAP_MAXVALUELEN)
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   427
		return (E2BIG);
967ea438b194 6462174 zap_update() likes to return 0
ahrens
parents: 2199
diff changeset
   428
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   429
	err = dsl_dir_open(ddname, FTAG, &dd, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   430
	if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1356
diff changeset
   431
		return (err);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   432
	err = dsl_prop_set_dd(dd, propname, intsz, numints, buf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
	dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   435
}
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   436
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   437
/*
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   438
 * Iterate over all properties for this dataset and return them in an nvlist.
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   439
 */
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   440
int
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   441
dsl_prop_get_all(objset_t *os, nvlist_t **nvp, boolean_t local)
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   442
{
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   443
	dsl_dataset_t *ds = os->os->os_dsl_dataset;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   444
	dsl_dir_t *dd = ds->ds_dir;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   445
	boolean_t snapshot;
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   446
	int err = 0;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   447
	dsl_pool_t *dp;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   448
	objset_t *mos;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   449
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   450
	snapshot = dsl_dataset_is_snapshot(ds);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   451
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   452
	VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   453
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   454
	dp = dd->dd_pool;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   455
	mos = dp->dp_meta_objset;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   456
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   457
	rw_enter(&dp->dp_config_rwlock, RW_READER);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   458
	for (; dd != NULL; dd = dd->dd_parent) {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   459
		char setpoint[MAXNAMELEN];
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   460
		zap_cursor_t zc;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   461
		zap_attribute_t za;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   462
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   463
		dsl_dir_name(dd, setpoint);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   464
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   465
		for (zap_cursor_init(&zc, mos, dd->dd_phys->dd_props_zapobj);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   466
		    (err = zap_cursor_retrieve(&zc, &za)) == 0;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   467
		    zap_cursor_advance(&zc)) {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   468
			nvlist_t *propval;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   469
			zfs_prop_t prop;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   470
			/*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   471
			 * Skip non-inheritable properties.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   472
			 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   473
			if ((prop = zfs_name_to_prop(za.za_name)) !=
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   474
			    ZPROP_INVAL && !zfs_prop_inheritable(prop) &&
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   475
			    dd != ds->ds_dir)
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   476
				continue;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   477
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   478
			if (snapshot &&
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   479
			    !zfs_prop_valid_for_type(prop, ZFS_TYPE_SNAPSHOT))
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   480
				continue;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5094
diff changeset
   481
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   482
			if (nvlist_lookup_nvlist(*nvp, za.za_name,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   483
			    &propval) == 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   484
				continue;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   485
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   486
			VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME,
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   487
			    KM_SLEEP) == 0);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   488
			if (za.za_integer_length == 1) {
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   489
				/*
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   490
				 * String property
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   491
				 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   492
				char *tmp = kmem_alloc(za.za_num_integers,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   493
				    KM_SLEEP);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   494
				err = zap_lookup(mos,
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   495
				    dd->dd_phys->dd_props_zapobj,
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   496
				    za.za_name, 1, za.za_num_integers,
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   497
				    tmp);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   498
				if (err != 0) {
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   499
					kmem_free(tmp, za.za_num_integers);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   500
					break;
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   501
				}
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   502
				VERIFY(nvlist_add_string(propval, ZPROP_VALUE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   503
				    tmp) == 0);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   504
				kmem_free(tmp, za.za_num_integers);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   505
			} else {
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   506
				/*
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   507
				 * Integer property
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   508
				 */
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   509
				ASSERT(za.za_integer_length == 8);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   510
				(void) nvlist_add_uint64(propval, ZPROP_VALUE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   511
				    za.za_first_integer);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   512
			}
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   513
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   514
			VERIFY(nvlist_add_string(propval, ZPROP_SOURCE,
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   515
			    setpoint) == 0);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   516
			VERIFY(nvlist_add_nvlist(*nvp, za.za_name,
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   517
			    propval) == 0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2641
diff changeset
   518
			nvlist_free(propval);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   519
		}
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   520
		zap_cursor_fini(&zc);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   521
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   522
		if (err != ENOENT)
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   523
			break;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1544
diff changeset
   524
		err = 0;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   525
		/*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   526
		 * If we are just after the props that have been set
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   527
		 * locally, then we are done after the first iteration.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   528
		 */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   529
		if (local)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6047
diff changeset
   530
			break;
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   531
	}
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   532
	rw_exit(&dp->dp_config_rwlock);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   533
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   534
	return (err);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 885
diff changeset
   535
}
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   536
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   537
void
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   538
dsl_prop_nvlist_add_uint64(nvlist_t *nv, zfs_prop_t prop, uint64_t value)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   539
{
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   540
	nvlist_t *propval;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   541
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   542
	VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   543
	VERIFY(nvlist_add_uint64(propval, ZPROP_VALUE, value) == 0);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   544
	VERIFY(nvlist_add_nvlist(nv, zfs_prop_to_name(prop), propval) == 0);
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   545
	nvlist_free(propval);
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   546
}
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   547
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   548
void
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   549
dsl_prop_nvlist_add_string(nvlist_t *nv, zfs_prop_t prop, const char *value)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   550
{
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   551
	nvlist_t *propval;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   552
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   553
	VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4787
diff changeset
   554
	VERIFY(nvlist_add_string(propval, ZPROP_VALUE, value) == 0);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   555
	VERIFY(nvlist_add_nvlist(nv, zfs_prop_to_name(prop), propval) == 0);
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   556
	nvlist_free(propval);
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
   557
}