Mercurial > illumos > illumos-gate
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 |
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 } |