annotate usr/src/uts/common/fs/zfs/dsl_userhold.c @ 14060:aeb4e8fef072

3829 fix for 3740 changed behavior of zfs destroy/hold/release ioctl Reviewed by: Matt Amdur <matt.amdur@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Approved by: Richard Lowe <richlowe@richlowe.net>
author Matthew Ahrens <mahrens@delphix.com>
date Thu, 20 Jun 2013 14:43:17 -0800
parents 1a272fe1337b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
1 /*
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
2 * CDDL HEADER START
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
3 *
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
7 *
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
10 * See the License for the specific language governing permissions
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
11 * and limitations under the License.
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
12 *
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
18 *
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
19 * CDDL HEADER END
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
20 */
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
21 /*
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
13980
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 13973
diff changeset
23 * Copyright (c) 2013 by Delphix. All rights reserved.
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
24 * Copyright (c) 2013 Steven Hartland. All rights reserved.
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
25 */
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
26
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
27 #include <sys/zfs_context.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
28 #include <sys/dsl_userhold.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
29 #include <sys/dsl_dataset.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
30 #include <sys/dsl_destroy.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
31 #include <sys/dsl_synctask.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
32 #include <sys/dmu_tx.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
33 #include <sys/zfs_onexit.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
34 #include <sys/dsl_pool.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
35 #include <sys/dsl_dir.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
36 #include <sys/zfs_ioctl.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
37 #include <sys/zap.h>
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
38
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
39 typedef struct dsl_dataset_user_hold_arg {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
40 nvlist_t *dduha_holds;
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
41 nvlist_t *dduha_chkholds;
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
42 nvlist_t *dduha_errlist;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
43 minor_t dduha_minor;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
44 } dsl_dataset_user_hold_arg_t;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
45
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
46 /*
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
47 * If you add new checks here, you may need to add additional checks to the
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
48 * "temporary" case in snapshot_check() in dmu_objset.c.
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
49 */
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
50 int
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
51 dsl_dataset_user_hold_check_one(dsl_dataset_t *ds, const char *htag,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
52 boolean_t temphold, dmu_tx_t *tx)
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
53 {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
54 dsl_pool_t *dp = dmu_tx_pool(tx);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
55 objset_t *mos = dp->dp_meta_objset;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
56 int error = 0;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
57
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
58 ASSERT(dsl_pool_config_held(dp));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
59
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
60 if (strlen(htag) > MAXNAMELEN)
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
61 return (SET_ERROR(E2BIG));
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
62 /* Tempholds have a more restricted length */
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
63 if (temphold && strlen(htag) + MAX_TAG_PREFIX_LEN >= MAXNAMELEN)
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
64 return (SET_ERROR(E2BIG));
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
65
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
66 /* tags must be unique (if ds already exists) */
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
67 if (ds != NULL && ds->ds_phys->ds_userrefs_obj != 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
68 uint64_t value;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
69
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
70 error = zap_lookup(mos, ds->ds_phys->ds_userrefs_obj,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
71 htag, 8, 1, &value);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
72 if (error == 0)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
73 error = SET_ERROR(EEXIST);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
74 else if (error == ENOENT)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
75 error = 0;
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
76 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
77
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
78 return (error);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
79 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
80
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
81 static int
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
82 dsl_dataset_user_hold_check(void *arg, dmu_tx_t *tx)
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
83 {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
84 dsl_dataset_user_hold_arg_t *dduha = arg;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
85 dsl_pool_t *dp = dmu_tx_pool(tx);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
86
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
87 if (spa_version(dp->dp_spa) < SPA_VERSION_USERREFS)
13980
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 13973
diff changeset
88 return (SET_ERROR(ENOTSUP));
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
89
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
90 if (!dmu_tx_is_syncing(tx))
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
91 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
92
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
93 for (nvpair_t *pair = nvlist_next_nvpair(dduha->dduha_holds, NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
94 pair != NULL; pair = nvlist_next_nvpair(dduha->dduha_holds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
95 dsl_dataset_t *ds;
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
96 int error = 0;
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
97 char *htag, *name;
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
98
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
99 /* must be a snapshot */
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
100 name = nvpair_name(pair);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
101 if (strchr(name, '@') == NULL)
13980
d7059eb1884c 3598 want to dtrace when errors are generated in zfs
Matthew Ahrens <mahrens@delphix.com>
parents: 13973
diff changeset
102 error = SET_ERROR(EINVAL);
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
103
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
104 if (error == 0)
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
105 error = nvpair_value_string(pair, &htag);
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
106
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
107 if (error == 0)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
108 error = dsl_dataset_hold(dp, name, FTAG, &ds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
109
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
110 if (error == 0) {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
111 error = dsl_dataset_user_hold_check_one(ds, htag,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
112 dduha->dduha_minor != 0, tx);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
113 dsl_dataset_rele(ds, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
114 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
115
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
116 if (error == 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
117 fnvlist_add_string(dduha->dduha_chkholds, name, htag);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
118 } else {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
119 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
120 * We register ENOENT errors so they can be correctly
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
121 * reported if needed, such as when all holds fail.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
122 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
123 fnvlist_add_int32(dduha->dduha_errlist, name, error);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
124 if (error != ENOENT)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
125 return (error);
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
126 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
127 }
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
128
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
129 return (0);
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
130 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
131
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
132
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
133 static void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
134 dsl_dataset_user_hold_sync_one_impl(nvlist_t *tmpholds, dsl_dataset_t *ds,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
135 const char *htag, minor_t minor, uint64_t now, dmu_tx_t *tx)
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
136 {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
137 dsl_pool_t *dp = ds->ds_dir->dd_pool;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
138 objset_t *mos = dp->dp_meta_objset;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
139 uint64_t zapobj;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
140
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
141 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
142
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
143 if (ds->ds_phys->ds_userrefs_obj == 0) {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
144 /*
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
145 * This is the first user hold for this dataset. Create
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
146 * the userrefs zap object.
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
147 */
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
148 dmu_buf_will_dirty(ds->ds_dbuf, tx);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
149 zapobj = ds->ds_phys->ds_userrefs_obj =
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
150 zap_create(mos, DMU_OT_USERREFS, DMU_OT_NONE, 0, tx);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
151 } else {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
152 zapobj = ds->ds_phys->ds_userrefs_obj;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
153 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
154 ds->ds_userrefs++;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
155
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
156 VERIFY0(zap_add(mos, zapobj, htag, 8, 1, &now, tx));
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
157
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
158 if (minor != 0) {
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
159 char name[MAXNAMELEN];
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
160 nvlist_t *tags;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
161
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
162 VERIFY0(dsl_pool_user_hold(dp, ds->ds_object,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
163 htag, now, tx));
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
164 (void) snprintf(name, sizeof (name), "%llx",
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
165 (u_longlong_t)ds->ds_object);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
166
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
167 if (nvlist_lookup_nvlist(tmpholds, name, &tags) != 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
168 tags = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
169 fnvlist_add_boolean(tags, htag);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
170 fnvlist_add_nvlist(tmpholds, name, tags);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
171 fnvlist_free(tags);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
172 } else {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
173 fnvlist_add_boolean(tags, htag);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
174 }
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
175 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
176
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
177 spa_history_log_internal_ds(ds, "hold", tx,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
178 "tag=%s temp=%d refs=%llu",
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
179 htag, minor != 0, ds->ds_userrefs);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
180 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
181
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
182 typedef struct zfs_hold_cleanup_arg {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
183 char zhca_spaname[MAXNAMELEN];
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
184 uint64_t zhca_spa_load_guid;
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
185 nvlist_t *zhca_holds;
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
186 } zfs_hold_cleanup_arg_t;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
187
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
188 static void
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
189 dsl_dataset_user_release_onexit(void *arg)
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
190 {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
191 zfs_hold_cleanup_arg_t *ca = arg;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
192 spa_t *spa;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
193 int error;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
194
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
195 error = spa_open(ca->zhca_spaname, &spa, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
196 if (error != 0) {
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
197 zfs_dbgmsg("couldn't release holds on pool=%s "
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
198 "because pool is no longer loaded",
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
199 ca->zhca_spaname);
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
200 return;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
201 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
202 if (spa_load_guid(spa) != ca->zhca_spa_load_guid) {
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
203 zfs_dbgmsg("couldn't release holds on pool=%s "
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
204 "because pool is no longer loaded (guid doesn't match)",
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
205 ca->zhca_spaname);
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
206 spa_close(spa, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
207 return;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
208 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
209
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
210 (void) dsl_dataset_user_release_tmp(spa_get_dsl(spa), ca->zhca_holds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
211 fnvlist_free(ca->zhca_holds);
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
212 kmem_free(ca, sizeof (zfs_hold_cleanup_arg_t));
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
213 spa_close(spa, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
214 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
215
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
216 static void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
217 dsl_onexit_hold_cleanup(spa_t *spa, nvlist_t *holds, minor_t minor)
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
218 {
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
219 zfs_hold_cleanup_arg_t *ca;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
220
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
221 if (minor == 0 || nvlist_empty(holds)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
222 fnvlist_free(holds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
223 return;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
224 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
225
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
226 ASSERT(spa != NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
227 ca = kmem_alloc(sizeof (*ca), KM_SLEEP);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
228
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
229 (void) strlcpy(ca->zhca_spaname, spa_name(spa),
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
230 sizeof (ca->zhca_spaname));
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
231 ca->zhca_spa_load_guid = spa_load_guid(spa);
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
232 ca->zhca_holds = holds;
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
233 VERIFY0(zfs_onexit_add_cb(minor,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
234 dsl_dataset_user_release_onexit, ca, NULL));
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
235 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
236
14052
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
237 void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
238 dsl_dataset_user_hold_sync_one(dsl_dataset_t *ds, const char *htag,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
239 minor_t minor, uint64_t now, dmu_tx_t *tx)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
240 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
241 nvlist_t *tmpholds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
242
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
243 if (minor != 0)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
244 tmpholds = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
245 else
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
246 tmpholds = NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
247 dsl_dataset_user_hold_sync_one_impl(tmpholds, ds, htag, minor, now, tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
248 dsl_onexit_hold_cleanup(dsl_dataset_get_spa(ds), tmpholds, minor);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
249 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
250
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
251 static void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
252 dsl_dataset_user_hold_sync(void *arg, dmu_tx_t *tx)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
253 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
254 dsl_dataset_user_hold_arg_t *dduha = arg;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
255 dsl_pool_t *dp = dmu_tx_pool(tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
256 nvlist_t *tmpholds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
257 uint64_t now = gethrestime_sec();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
258
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
259 if (dduha->dduha_minor != 0)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
260 tmpholds = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
261 else
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
262 tmpholds = NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
263 for (nvpair_t *pair = nvlist_next_nvpair(dduha->dduha_chkholds, NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
264 pair != NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
265 pair = nvlist_next_nvpair(dduha->dduha_chkholds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
266 dsl_dataset_t *ds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
267
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
268 VERIFY0(dsl_dataset_hold(dp, nvpair_name(pair), FTAG, &ds));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
269 dsl_dataset_user_hold_sync_one_impl(tmpholds, ds,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
270 fnvpair_value_string(pair), dduha->dduha_minor, now, tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
271 dsl_dataset_rele(ds, FTAG);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
272 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
273 dsl_onexit_hold_cleanup(dp->dp_spa, tmpholds, dduha->dduha_minor);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
274 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
275
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
276 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
277 * The full semantics of this function are described in the comment above
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
278 * lzc_hold().
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
279 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
280 * To summarize:
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
281 * holds is nvl of snapname -> holdname
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
282 * errlist will be filled in with snapname -> error
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
283 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
284 * The snaphosts must all be in the same pool.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
285 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
286 * Holds for snapshots that don't exist will be skipped.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
287 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
288 * If none of the snapshots for requested holds exist then ENOENT will be
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
289 * returned.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
290 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
291 * If cleanup_minor is not 0, the holds will be temporary, which will be cleaned
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
292 * up when the process exits.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
293 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
294 * On success all the holds, for snapshots that existed, will be created and 0
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
295 * will be returned.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
296 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
297 * On failure no holds will be created, the errlist will be filled in,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
298 * and an errno will returned.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
299 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
300 * In all cases the errlist will contain entries for holds where the snapshot
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
301 * didn't exist.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
302 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
303 int
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
304 dsl_dataset_user_hold(nvlist_t *holds, minor_t cleanup_minor, nvlist_t *errlist)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
305 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
306 dsl_dataset_user_hold_arg_t dduha;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
307 nvpair_t *pair;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
308 int ret;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
309
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
310 pair = nvlist_next_nvpair(holds, NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
311 if (pair == NULL)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
312 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
313
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
314 dduha.dduha_holds = holds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
315 dduha.dduha_chkholds = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
316 dduha.dduha_errlist = errlist;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
317 dduha.dduha_minor = cleanup_minor;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
318
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
319 ret = dsl_sync_task(nvpair_name(pair), dsl_dataset_user_hold_check,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
320 dsl_dataset_user_hold_sync, &dduha, fnvlist_num_pairs(holds));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
321 fnvlist_free(dduha.dduha_chkholds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
322
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
323 return (ret);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
324 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
325
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
326 typedef int (dsl_holdfunc_t)(dsl_pool_t *dp, const char *name, void *tag,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
327 dsl_dataset_t **dsp);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
328
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
329 typedef struct dsl_dataset_user_release_arg {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
330 dsl_holdfunc_t *ddura_holdfunc;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
331 nvlist_t *ddura_holds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
332 nvlist_t *ddura_todelete;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
333 nvlist_t *ddura_errlist;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
334 nvlist_t *ddura_chkholds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
335 } dsl_dataset_user_release_arg_t;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
336
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
337 /* Place a dataset hold on the snapshot identified by passed dsobj string */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
338 static int
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
339 dsl_dataset_hold_obj_string(dsl_pool_t *dp, const char *dsobj, void *tag,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
340 dsl_dataset_t **dsp)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
341 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
342 return (dsl_dataset_hold_obj(dp, strtonum(dsobj, NULL), tag, dsp));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
343 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
344
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
345 static int
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
346 dsl_dataset_user_release_check_one(dsl_dataset_user_release_arg_t *ddura,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
347 dsl_dataset_t *ds, nvlist_t *holds, const char *snapname)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
348 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
349 uint64_t zapobj;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
350 nvlist_t *holds_found;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
351 objset_t *mos;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
352 int numholds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
353
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
354 if (!dsl_dataset_is_snapshot(ds))
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
355 return (SET_ERROR(EINVAL));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
356
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
357 if (nvlist_empty(holds))
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
358 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
359
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
360 numholds = 0;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
361 mos = ds->ds_dir->dd_pool->dp_meta_objset;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
362 zapobj = ds->ds_phys->ds_userrefs_obj;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
363 holds_found = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
364
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
365 for (nvpair_t *pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
366 pair = nvlist_next_nvpair(holds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
367 uint64_t tmp;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
368 int error;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
369 const char *holdname = nvpair_name(pair);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
370
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
371 if (zapobj != 0)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
372 error = zap_lookup(mos, zapobj, holdname, 8, 1, &tmp);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
373 else
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
374 error = SET_ERROR(ENOENT);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
375
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
376 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
377 * Non-existent holds are put on the errlist, but don't
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
378 * cause an overall failure.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
379 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
380 if (error == ENOENT) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
381 if (ddura->ddura_errlist != NULL) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
382 char *errtag = kmem_asprintf("%s#%s",
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
383 snapname, holdname);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
384 fnvlist_add_int32(ddura->ddura_errlist, errtag,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
385 ENOENT);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
386 strfree(errtag);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
387 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
388 continue;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
389 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
390
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
391 if (error != 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
392 fnvlist_free(holds_found);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
393 return (error);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
394 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
395
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
396 fnvlist_add_boolean(holds_found, holdname);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
397 numholds++;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
398 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
399
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
400 if (DS_IS_DEFER_DESTROY(ds) && ds->ds_phys->ds_num_children == 1 &&
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
401 ds->ds_userrefs == numholds) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
402 /* we need to destroy the snapshot as well */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
403 if (dsl_dataset_long_held(ds)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
404 fnvlist_free(holds_found);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
405 return (SET_ERROR(EBUSY));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
406 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
407 fnvlist_add_boolean(ddura->ddura_todelete, snapname);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
408 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
409
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
410 if (numholds != 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
411 fnvlist_add_nvlist(ddura->ddura_chkholds, snapname,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
412 holds_found);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
413 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
414 fnvlist_free(holds_found);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
415
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
416 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
417 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
418
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
419 static int
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
420 dsl_dataset_user_release_check(void *arg, dmu_tx_t *tx)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
421 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
422 dsl_dataset_user_release_arg_t *ddura;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
423 dsl_holdfunc_t *holdfunc;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
424 dsl_pool_t *dp;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
425
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
426 if (!dmu_tx_is_syncing(tx))
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
427 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
428
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
429 dp = dmu_tx_pool(tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
430
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
431 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
432
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
433 ddura = arg;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
434 holdfunc = ddura->ddura_holdfunc;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
435
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
436 for (nvpair_t *pair = nvlist_next_nvpair(ddura->ddura_holds, NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
437 pair != NULL; pair = nvlist_next_nvpair(ddura->ddura_holds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
438 int error;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
439 dsl_dataset_t *ds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
440 nvlist_t *holds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
441 const char *snapname = nvpair_name(pair);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
442
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
443 error = nvpair_value_nvlist(pair, &holds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
444 if (error != 0)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
445 error = (SET_ERROR(EINVAL));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
446 else
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
447 error = holdfunc(dp, snapname, FTAG, &ds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
448 if (error == 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
449 error = dsl_dataset_user_release_check_one(ddura, ds,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
450 holds, snapname);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
451 dsl_dataset_rele(ds, FTAG);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
452 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
453 if (error != 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
454 if (ddura->ddura_errlist != NULL) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
455 fnvlist_add_int32(ddura->ddura_errlist,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
456 snapname, error);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
457 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
458 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
459 * Non-existent snapshots are put on the errlist,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
460 * but don't cause an overall failure.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
461 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
462 if (error != ENOENT)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
463 return (error);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
464 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
465 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
466
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
467 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
468 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
469
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
470 static void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
471 dsl_dataset_user_release_sync_one(dsl_dataset_t *ds, nvlist_t *holds,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
472 dmu_tx_t *tx)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
473 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
474 dsl_pool_t *dp = ds->ds_dir->dd_pool;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
475 objset_t *mos = dp->dp_meta_objset;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
476
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
477 for (nvpair_t *pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
478 pair = nvlist_next_nvpair(holds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
479 int error;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
480 const char *holdname = nvpair_name(pair);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
481
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
482 /* Remove temporary hold if one exists. */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
483 error = dsl_pool_user_release(dp, ds->ds_object, holdname, tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
484 VERIFY(error == 0 || error == ENOENT);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
485
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
486 VERIFY0(zap_remove(mos, ds->ds_phys->ds_userrefs_obj, holdname,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
487 tx));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
488 ds->ds_userrefs--;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
489
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
490 spa_history_log_internal_ds(ds, "release", tx,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
491 "tag=%s refs=%lld", holdname, (longlong_t)ds->ds_userrefs);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
492 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
493 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
494
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
495 static void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
496 dsl_dataset_user_release_sync(void *arg, dmu_tx_t *tx)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
497 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
498 dsl_dataset_user_release_arg_t *ddura = arg;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
499 dsl_holdfunc_t *holdfunc = ddura->ddura_holdfunc;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
500 dsl_pool_t *dp = dmu_tx_pool(tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
501
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
502 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
503
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
504 for (nvpair_t *pair = nvlist_next_nvpair(ddura->ddura_chkholds, NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
505 pair != NULL; pair = nvlist_next_nvpair(ddura->ddura_chkholds,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
506 pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
507 dsl_dataset_t *ds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
508 const char *name = nvpair_name(pair);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
509
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
510 VERIFY0(holdfunc(dp, name, FTAG, &ds));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
511
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
512 dsl_dataset_user_release_sync_one(ds,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
513 fnvpair_value_nvlist(pair), tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
514 if (nvlist_exists(ddura->ddura_todelete, name)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
515 ASSERT(ds->ds_userrefs == 0 &&
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
516 ds->ds_phys->ds_num_children == 1 &&
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
517 DS_IS_DEFER_DESTROY(ds));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
518 dsl_destroy_snapshot_sync_impl(ds, B_FALSE, tx);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
519 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
520 dsl_dataset_rele(ds, FTAG);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
521 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
522 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
523
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
524 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
525 * The full semantics of this function are described in the comment above
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
526 * lzc_release().
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
527 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
528 * To summarize:
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
529 * Releases holds specified in the nvl holds.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
530 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
531 * holds is nvl of snapname -> { holdname, ... }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
532 * errlist will be filled in with snapname -> error
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
533 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
534 * If tmpdp is not NULL the names for holds should be the dsobj's of snapshots,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
535 * otherwise they should be the names of shapshots.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
536 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
537 * As a release may cause snapshots to be destroyed this trys to ensure they
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
538 * aren't mounted.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
539 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
540 * The release of non-existent holds are skipped.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
541 *
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
542 * At least one hold must have been released for the this function to succeed
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
543 * and return 0.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
544 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
545 static int
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
546 dsl_dataset_user_release_impl(nvlist_t *holds, nvlist_t *errlist,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
547 dsl_pool_t *tmpdp)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
548 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
549 dsl_dataset_user_release_arg_t ddura;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
550 nvpair_t *pair;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
551 char *pool;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
552 int error;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
553
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
554 pair = nvlist_next_nvpair(holds, NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
555 if (pair == NULL)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
556 return (0);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
557
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
558 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
559 * The release may cause snapshots to be destroyed; make sure they
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
560 * are not mounted.
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
561 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
562 if (tmpdp != NULL) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
563 /* Temporary holds are specified by dsobj string. */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
564 ddura.ddura_holdfunc = dsl_dataset_hold_obj_string;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
565 pool = spa_name(tmpdp->dp_spa);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
566 #ifdef _KERNEL
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
567 dsl_pool_config_enter(tmpdp, FTAG);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
568 for (pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
569 pair = nvlist_next_nvpair(holds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
570 dsl_dataset_t *ds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
571
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
572 error = dsl_dataset_hold_obj_string(tmpdp,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
573 nvpair_name(pair), FTAG, &ds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
574 if (error == 0) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
575 char name[MAXNAMELEN];
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
576 dsl_dataset_name(ds, name);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
577 dsl_dataset_rele(ds, FTAG);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
578 (void) zfs_unmount_snap(name);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
579 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
580 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
581 dsl_pool_config_exit(tmpdp, FTAG);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
582 #endif
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
583 } else {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
584 /* Non-temporary holds are specified by name. */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
585 ddura.ddura_holdfunc = dsl_dataset_hold;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
586 pool = nvpair_name(pair);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
587 #ifdef _KERNEL
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
588 for (pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
589 pair = nvlist_next_nvpair(holds, pair)) {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
590 (void) zfs_unmount_snap(nvpair_name(pair));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
591 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
592 #endif
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
593 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
594
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
595 ddura.ddura_holds = holds;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
596 ddura.ddura_errlist = errlist;
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
597 ddura.ddura_todelete = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
598 ddura.ddura_chkholds = fnvlist_alloc();
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
599
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
600 error = dsl_sync_task(pool, dsl_dataset_user_release_check,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
601 dsl_dataset_user_release_sync, &ddura,
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
602 fnvlist_num_pairs(holds));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
603 fnvlist_free(ddura.ddura_todelete);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
604 fnvlist_free(ddura.ddura_chkholds);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
605
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
606 return (error);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
607 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
608
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
609 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
610 * holds is nvl of snapname -> { holdname, ... }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
611 * errlist will be filled in with snapname -> error
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
612 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
613 int
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
614 dsl_dataset_user_release(nvlist_t *holds, nvlist_t *errlist)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
615 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
616 return (dsl_dataset_user_release_impl(holds, errlist, NULL));
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
617 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
618
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
619 /*
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
620 * holds is nvl of snapdsobj -> { holdname, ... }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
621 */
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
622 void
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
623 dsl_dataset_user_release_tmp(struct dsl_pool *dp, nvlist_t *holds)
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
624 {
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
625 ASSERT(dp != NULL);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
626 (void) dsl_dataset_user_release_impl(holds, NULL, dp);
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
627 }
1a272fe1337b 3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Steven Hartland <smh@freebsd.org>
parents: 14048
diff changeset
628
13973
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
629 int
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
630 dsl_dataset_get_holds(const char *dsname, nvlist_t *nvl)
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
631 {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
632 dsl_pool_t *dp;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
633 dsl_dataset_t *ds;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
634 int err;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
635
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
636 err = dsl_pool_hold(dsname, FTAG, &dp);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
637 if (err != 0)
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
638 return (err);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
639 err = dsl_dataset_hold(dp, dsname, FTAG, &ds);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
640 if (err != 0) {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
641 dsl_pool_rele(dp, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
642 return (err);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
643 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
644
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
645 if (ds->ds_phys->ds_userrefs_obj != 0) {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
646 zap_attribute_t *za;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
647 zap_cursor_t zc;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
648
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
649 za = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
650 for (zap_cursor_init(&zc, ds->ds_dir->dd_pool->dp_meta_objset,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
651 ds->ds_phys->ds_userrefs_obj);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
652 zap_cursor_retrieve(&zc, za) == 0;
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
653 zap_cursor_advance(&zc)) {
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
654 fnvlist_add_uint64(nvl, za->za_name,
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
655 za->za_first_integer);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
656 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
657 zap_cursor_fini(&zc);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
658 kmem_free(za, sizeof (zap_attribute_t));
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
659 }
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
660 dsl_dataset_rele(ds, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
661 dsl_pool_rele(dp, FTAG);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
662 return (0);
4972ab336f54 3464 zfs synctask code needs restructuring
Matthew Ahrens <mahrens@delphix.com>
parents:
diff changeset
663 }