annotate usr/src/uts/common/fs/zfs/dsl_dataset.c @ 12470:54258108784b

6948890 snapshot deletion can induce pathologically long spa_sync() times
author Matthew Ahrens <Matthew.Ahrens@Sun.COM>
date Fri, 21 May 2010 17:29:22 -0700
parents c77e20e4e046
children 693dd2cad55f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
5 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
6 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
7 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
10 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
11 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
12 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
18 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
19 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
20 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
21 /*
12115
3655f38d3bea 6942295 use-after-free panic in dsl_dataset_user_release_one
Chris Kirby <Chris.Kirby@oracle.com>
parents: 11823
diff changeset
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
23 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
24
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
25 #include <sys/dmu_objset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
26 #include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
27 #include <sys/dsl_dir.h>
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
28 #include <sys/dsl_prop.h>
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
29 #include <sys/dsl_synctask.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
30 #include <sys/dmu_traverse.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
31 #include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
32 #include <sys/arc.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
33 #include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
34 #include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
35 #include <sys/unique.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
36 #include <sys/zfs_context.h>
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
37 #include <sys/zfs_ioctl.h>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
38 #include <sys/spa.h>
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
39 #include <sys/zfs_znode.h>
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
40 #include <sys/zvol.h>
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
41 #include <sys/dsl_scan.h>
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
42 #include <sys/dsl_deadlist.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
43
12450
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
44 /*
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
45 * Enable/disable prefetching of dedup-ed blocks which are going to be freed.
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
46 */
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
47 int zfs_dedup_prefetch = 1;
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
48
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
49 static char *dsl_reaper = "the grim reaper";
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
50
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
51 static dsl_checkfunc_t dsl_dataset_destroy_begin_check;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
52 static dsl_syncfunc_t dsl_dataset_destroy_begin_sync;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
53 static dsl_syncfunc_t dsl_dataset_set_reservation_sync;
1731
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
54
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
55 #define SWITCH64(x, y) \
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
56 { \
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
57 uint64_t __tmp = (x); \
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
58 (x) = (y); \
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
59 (y) = __tmp; \
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
60 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
61
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3025
diff changeset
62 #define DS_REF_MAX (1ULL << 62)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
63
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
64 #define DSL_DEADLIST_BLOCKSIZE SPA_MAXBLOCKSIZE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
65
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
66 #define DSL_DATASET_IS_DESTROYED(ds) ((ds)->ds_owner == dsl_reaper)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
67
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
68
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
69 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
70 * Figure out how much of this delta should be propogated to the dsl_dir
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
71 * layer. If there's a refreservation, that space has already been
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
72 * partially accounted for in our ancestors.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
73 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
74 static int64_t
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
75 parent_delta(dsl_dataset_t *ds, int64_t delta)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
76 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
77 uint64_t old_bytes, new_bytes;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
78
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
79 if (ds->ds_reserved == 0)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
80 return (delta);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
81
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
82 old_bytes = MAX(ds->ds_phys->ds_unique_bytes, ds->ds_reserved);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
83 new_bytes = MAX(ds->ds_phys->ds_unique_bytes + delta, ds->ds_reserved);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
84
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
85 ASSERT3U(ABS((int64_t)(new_bytes - old_bytes)), <=, ABS(delta));
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
86 return (new_bytes - old_bytes);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
87 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
88
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
89 void
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
90 dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
91 {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
92 int used = bp_get_dsize_sync(tx->tx_pool->dp_spa, bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
93 int compressed = BP_GET_PSIZE(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
94 int uncompressed = BP_GET_UCSIZE(bp);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
95 int64_t delta;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
96
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
97 dprintf_bp(bp, "ds=%p", ds);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
98
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
99 ASSERT(dmu_tx_is_syncing(tx));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
100 /* It could have been compressed away to nothing */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
101 if (BP_IS_HOLE(bp))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
102 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
103 ASSERT(BP_GET_TYPE(bp) != DMU_OT_NONE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
104 ASSERT3U(BP_GET_TYPE(bp), <, DMU_OT_NUMTYPES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
105 if (ds == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
106 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
107 * Account for the meta-objset space in its placeholder
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
108 * dsl_dir.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
109 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
110 ASSERT3U(compressed, ==, uncompressed); /* it's all metadata */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
111 dsl_dir_diduse_space(tx->tx_pool->dp_mos_dir, DD_USED_HEAD,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
112 used, compressed, uncompressed, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
113 dsl_dir_dirty(tx->tx_pool->dp_mos_dir, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
114 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
115 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
116 dmu_buf_will_dirty(ds->ds_dbuf, tx);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
117
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
118 mutex_enter(&ds->ds_dir->dd_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
119 mutex_enter(&ds->ds_lock);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
120 delta = parent_delta(ds, used);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
121 ds->ds_phys->ds_used_bytes += used;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
122 ds->ds_phys->ds_compressed_bytes += compressed;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
123 ds->ds_phys->ds_uncompressed_bytes += uncompressed;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
124 ds->ds_phys->ds_unique_bytes += used;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
125 mutex_exit(&ds->ds_lock);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
126 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, delta,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
127 compressed, uncompressed, tx);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
128 dsl_dir_transfer_space(ds->ds_dir, used - delta,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
129 DD_USED_REFRSRV, DD_USED_HEAD, tx);
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
130 mutex_exit(&ds->ds_dir->dd_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
131 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
132
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
133 int
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
134 dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
135 boolean_t async)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
136 {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
137 if (BP_IS_HOLE(bp))
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
138 return (0);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
139
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
140 ASSERT(dmu_tx_is_syncing(tx));
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
141 ASSERT(bp->blk_birth <= tx->tx_txg);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
142
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
143 int used = bp_get_dsize_sync(tx->tx_pool->dp_spa, bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
144 int compressed = BP_GET_PSIZE(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
145 int uncompressed = BP_GET_UCSIZE(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
146
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
147 ASSERT(used > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
148 if (ds == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
149 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
150 * Account for the meta-objset space in its placeholder
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
151 * dataset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
152 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
153 dsl_free(tx->tx_pool, tx->tx_txg, bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
154
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
155 dsl_dir_diduse_space(tx->tx_pool->dp_mos_dir, DD_USED_HEAD,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
156 -used, -compressed, -uncompressed, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
157 dsl_dir_dirty(tx->tx_pool->dp_mos_dir, tx);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
158 return (used);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
159 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
160 ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
161
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
162 ASSERT(!dsl_dataset_is_snapshot(ds));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
163 dmu_buf_will_dirty(ds->ds_dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
164
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
165 if (bp->blk_birth > ds->ds_phys->ds_prev_snap_txg) {
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
166 int64_t delta;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
167
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
168 dprintf_bp(bp, "freeing ds=%llu", ds->ds_object);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
169 dsl_free(tx->tx_pool, tx->tx_txg, bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
170
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
171 mutex_enter(&ds->ds_dir->dd_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
172 mutex_enter(&ds->ds_lock);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
173 ASSERT(ds->ds_phys->ds_unique_bytes >= used ||
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
174 !DS_UNIQUE_IS_ACCURATE(ds));
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
175 delta = parent_delta(ds, -used);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
176 ds->ds_phys->ds_unique_bytes -= used;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
177 mutex_exit(&ds->ds_lock);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
178 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD,
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
179 delta, -compressed, -uncompressed, tx);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
180 dsl_dir_transfer_space(ds->ds_dir, -used - delta,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
181 DD_USED_REFRSRV, DD_USED_HEAD, tx);
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
182 mutex_exit(&ds->ds_dir->dd_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
183 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
184 dprintf_bp(bp, "putting on dead list: %s", "");
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
185 if (async) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
186 /*
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
187 * We are here as part of zio's write done callback,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
188 * which means we're a zio interrupt thread. We can't
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
189 * call dsl_deadlist_insert() now because it may block
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
190 * waiting for I/O. Instead, put bp on the deferred
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
191 * queue and let dsl_pool_sync() finish the job.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
192 */
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
193 bplist_append(&ds->ds_pending_deadlist, bp);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
194 } else {
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
195 dsl_deadlist_insert(&ds->ds_deadlist, bp, tx);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
196 }
5712
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
197 ASSERT3U(ds->ds_prev->ds_object, ==,
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
198 ds->ds_phys->ds_prev_snap_obj);
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
199 ASSERT(ds->ds_prev->ds_phys->ds_num_children > 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
200 /* if (bp->blk_birth > prev prev snap txg) prev unique += bs */
5712
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
201 if (ds->ds_prev->ds_phys->ds_next_snap_obj ==
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
202 ds->ds_object && bp->blk_birth >
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
203 ds->ds_prev->ds_phys->ds_prev_snap_txg) {
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
204 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
205 mutex_enter(&ds->ds_prev->ds_lock);
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
206 ds->ds_prev->ds_phys->ds_unique_bytes += used;
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
207 mutex_exit(&ds->ds_prev->ds_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
208 }
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
209 if (bp->blk_birth > ds->ds_dir->dd_origin_txg) {
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
210 dsl_dir_transfer_space(ds->ds_dir, used,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
211 DD_USED_HEAD, DD_USED_SNAP, tx);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
212 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
213 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
214 mutex_enter(&ds->ds_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
215 ASSERT3U(ds->ds_phys->ds_used_bytes, >=, used);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
216 ds->ds_phys->ds_used_bytes -= used;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
217 ASSERT3U(ds->ds_phys->ds_compressed_bytes, >=, compressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
218 ds->ds_phys->ds_compressed_bytes -= compressed;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
219 ASSERT3U(ds->ds_phys->ds_uncompressed_bytes, >=, uncompressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
220 ds->ds_phys->ds_uncompressed_bytes -= uncompressed;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
221 mutex_exit(&ds->ds_lock);
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
222
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
223 return (used);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
224 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
225
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
226 uint64_t
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
227 dsl_dataset_prev_snap_txg(dsl_dataset_t *ds)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
228 {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
229 uint64_t trysnap = 0;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
230
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
231 if (ds == NULL)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
232 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
233 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
234 * The snapshot creation could fail, but that would cause an
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
235 * incorrect FALSE return, which would only result in an
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
236 * overestimation of the amount of space that an operation would
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
237 * consume, which is OK.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
238 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
239 * There's also a small window where we could miss a pending
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
240 * snapshot, because we could set the sync task in the quiescing
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
241 * phase. So this should only be used as a guess.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
242 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
243 if (ds->ds_trysnap_txg >
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
244 spa_last_synced_txg(ds->ds_dir->dd_pool->dp_spa))
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
245 trysnap = ds->ds_trysnap_txg;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
246 return (MAX(ds->ds_phys->ds_prev_snap_txg, trysnap));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
247 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
248
9653
a70048a304d1 6664765 Unable to remove files when using fat-zap and quota exceeded on ZFS filesystem
Sanjeev Bagewadi <Sanjeev.Bagewadi@Sun.COM>
parents: 9396
diff changeset
249 boolean_t
12450
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
250 dsl_dataset_block_freeable(dsl_dataset_t *ds, const blkptr_t *bp,
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
251 uint64_t blk_birth)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
252 {
12450
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
253 if (blk_birth <= dsl_dataset_prev_snap_txg(ds))
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
254 return (B_FALSE);
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
255
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
256 if (zfs_dedup_prefetch && bp && BP_GET_DEDUP(bp))
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
257 ddt_prefetch(dsl_dataset_get_spa(ds), bp);
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
258
c77e20e4e046 6938089 dedup-induced latency causes FC initiator logouts/FC port resets
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
259 return (B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
260 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
261
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
262 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
263 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
264 dsl_dataset_evict(dmu_buf_t *db, void *dsv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
265 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
266 dsl_dataset_t *ds = dsv;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
267
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
268 ASSERT(ds->ds_owner == NULL || DSL_DATASET_IS_DESTROYED(ds));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
269
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
270 unique_remove(ds->ds_fsid_guid);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
271
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
272 if (ds->ds_objset != NULL)
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
273 dmu_objset_evict(ds->ds_objset);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
274
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
275 if (ds->ds_prev) {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
276 dsl_dataset_drop_ref(ds->ds_prev, ds);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
277 ds->ds_prev = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
278 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
279
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
280 bplist_destroy(&ds->ds_pending_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
281 if (db != NULL) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
282 dsl_deadlist_close(&ds->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
283 } else {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
284 ASSERT(ds->ds_deadlist.dl_dbuf == NULL);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
285 ASSERT(!ds->ds_deadlist.dl_oldfmt);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
286 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
287 if (ds->ds_dir)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
288 dsl_dir_close(ds->ds_dir, ds);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
289
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
290 ASSERT(!list_link_active(&ds->ds_synced_link));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
291
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2532
diff changeset
292 mutex_destroy(&ds->ds_lock);
10204
83c3a84aecef 6760420 zfs unmount -f causes recv to fail
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10002
diff changeset
293 mutex_destroy(&ds->ds_recvlock);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
294 mutex_destroy(&ds->ds_opening_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
295 rw_destroy(&ds->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
296 cv_destroy(&ds->ds_exclusive_cv);
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2532
diff changeset
297
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
298 kmem_free(ds, sizeof (dsl_dataset_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
299 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
300
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
301 static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
302 dsl_dataset_get_snapname(dsl_dataset_t *ds)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
303 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
304 dsl_dataset_phys_t *headphys;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
305 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
306 dmu_buf_t *headdbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
307 dsl_pool_t *dp = ds->ds_dir->dd_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
308 objset_t *mos = dp->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
309
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
310 if (ds->ds_snapname[0])
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
311 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
312 if (ds->ds_phys->ds_next_snap_obj == 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
313 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
314
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
315 err = dmu_bonus_hold(mos, ds->ds_dir->dd_phys->dd_head_dataset_obj,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
316 FTAG, &headdbuf);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
317 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
318 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
319 headphys = headdbuf->db_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
320 err = zap_value_search(dp->dp_meta_objset,
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4569
diff changeset
321 headphys->ds_snapnames_zapobj, ds->ds_object, 0, ds->ds_snapname);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
322 dmu_buf_rele(headdbuf, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
323 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
324 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
325
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
326 static int
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
327 dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name, uint64_t *value)
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
328 {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
329 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
330 uint64_t snapobj = ds->ds_phys->ds_snapnames_zapobj;
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
331 matchtype_t mt;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
332 int err;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
333
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
334 if (ds->ds_phys->ds_flags & DS_FLAG_CI_DATASET)
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
335 mt = MT_FIRST;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
336 else
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
337 mt = MT_EXACT;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
338
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
339 err = zap_lookup_norm(mos, snapobj, name, 8, 1,
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
340 value, mt, NULL, 0, NULL);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
341 if (err == ENOTSUP && mt == MT_FIRST)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
342 err = zap_lookup(mos, snapobj, name, 8, 1, value);
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
343 return (err);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
344 }
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
345
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
346 static int
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
347 dsl_dataset_snap_remove(dsl_dataset_t *ds, char *name, dmu_tx_t *tx)
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
348 {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
349 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
350 uint64_t snapobj = ds->ds_phys->ds_snapnames_zapobj;
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
351 matchtype_t mt;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
352 int err;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
353
10373
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10342
diff changeset
354 dsl_dir_snap_cmtime_update(ds->ds_dir);
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10342
diff changeset
355
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
356 if (ds->ds_phys->ds_flags & DS_FLAG_CI_DATASET)
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
357 mt = MT_FIRST;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
358 else
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
359 mt = MT_EXACT;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
360
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
361 err = zap_remove_norm(mos, snapobj, name, mt, tx);
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
362 if (err == ENOTSUP && mt == MT_FIRST)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
363 err = zap_remove(mos, snapobj, name, tx);
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
364 return (err);
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
365 }
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
366
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
367 static int
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
368 dsl_dataset_get_ref(dsl_pool_t *dp, uint64_t dsobj, void *tag,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
369 dsl_dataset_t **dsp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
370 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
371 objset_t *mos = dp->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
372 dmu_buf_t *dbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
373 dsl_dataset_t *ds;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
374 int err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
375
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
376 ASSERT(RW_LOCK_HELD(&dp->dp_config_rwlock) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
377 dsl_pool_sync_context(dp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
378
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
379 err = dmu_bonus_hold(mos, dsobj, tag, &dbuf);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
380 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
381 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
382 ds = dmu_buf_get_user(dbuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
383 if (ds == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
384 dsl_dataset_t *winner;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
385
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
386 ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
387 ds->ds_dbuf = dbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
388 ds->ds_object = dsobj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
389 ds->ds_phys = dbuf->db_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
390
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2532
diff changeset
391 mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL);
10204
83c3a84aecef 6760420 zfs unmount -f causes recv to fail
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10002
diff changeset
392 mutex_init(&ds->ds_recvlock, NULL, MUTEX_DEFAULT, NULL);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
393 mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
394 rw_init(&ds->ds_rwlock, 0, 0, 0);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
395 cv_init(&ds->ds_exclusive_cv, NULL, CV_DEFAULT, NULL);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
396
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
397 bplist_create(&ds->ds_pending_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
398 dsl_deadlist_open(&ds->ds_deadlist,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
399 mos, ds->ds_phys->ds_deadlist_obj);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
400
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
401 if (err == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
402 err = dsl_dir_open_obj(dp,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
403 ds->ds_phys->ds_dir_obj, NULL, ds, &ds->ds_dir);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
404 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
405 if (err) {
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2532
diff changeset
406 mutex_destroy(&ds->ds_lock);
10204
83c3a84aecef 6760420 zfs unmount -f causes recv to fail
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10002
diff changeset
407 mutex_destroy(&ds->ds_recvlock);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
408 mutex_destroy(&ds->ds_opening_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
409 rw_destroy(&ds->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
410 cv_destroy(&ds->ds_exclusive_cv);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
411 bplist_destroy(&ds->ds_pending_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
412 dsl_deadlist_close(&ds->ds_deadlist);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
413 kmem_free(ds, sizeof (dsl_dataset_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
414 dmu_buf_rele(dbuf, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
415 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
416 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
417
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
418 if (!dsl_dataset_is_snapshot(ds)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
419 ds->ds_snapname[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
420 if (ds->ds_phys->ds_prev_snap_obj) {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
421 err = dsl_dataset_get_ref(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
422 ds->ds_phys->ds_prev_snap_obj,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
423 ds, &ds->ds_prev);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
424 }
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
425 } else {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
426 if (zfs_flags & ZFS_DEBUG_SNAPNAMES)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
427 err = dsl_dataset_get_snapname(ds);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
428 if (err == 0 && ds->ds_phys->ds_userrefs_obj != 0) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
429 err = zap_count(
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
430 ds->ds_dir->dd_pool->dp_meta_objset,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
431 ds->ds_phys->ds_userrefs_obj,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
432 &ds->ds_userrefs);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
433 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
434 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
435
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
436 if (err == 0 && !dsl_dataset_is_snapshot(ds)) {
5569
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
437 /*
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
438 * In sync context, we're called with either no lock
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
439 * or with the write lock. If we're not syncing,
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
440 * we're always called with the read lock held.
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
441 */
5475
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
442 boolean_t need_lock =
5569
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
443 !RW_WRITE_HELD(&dp->dp_config_rwlock) &&
d3caac36d311 6634062 dsl_dataset_open_obj misuses RW_LOCK_HELD
ck153898
parents: 5518
diff changeset
444 dsl_pool_sync_context(dp);
5475
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
445
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
446 if (need_lock)
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
447 rw_enter(&dp->dp_config_rwlock, RW_READER);
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
448
7265
cc18862247da PSARC/2008/483 ZFS clone -o
ahrens
parents: 7237
diff changeset
449 err = dsl_prop_get_ds(ds,
5475
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
450 "refreservation", sizeof (uint64_t), 1,
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
451 &ds->ds_reserved, NULL);
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
452 if (err == 0) {
7265
cc18862247da PSARC/2008/483 ZFS clone -o
ahrens
parents: 7237
diff changeset
453 err = dsl_prop_get_ds(ds,
5475
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
454 "refquota", sizeof (uint64_t), 1,
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
455 &ds->ds_quota, NULL);
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
456 }
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
457
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
458 if (need_lock)
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
459 rw_exit(&dp->dp_config_rwlock);
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
460 } else {
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
461 ds->ds_reserved = ds->ds_quota = 0;
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
462 }
e140313199cc 6626338 assertion failed: 0 == dsl_prop_get_ds_locked(ds->ds_dir, "refreservation", sizeof (uint64_t), 1, &d
ck153898
parents: 5446
diff changeset
463
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
464 if (err == 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
465 winner = dmu_buf_set_user_ie(dbuf, ds, &ds->ds_phys,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
466 dsl_dataset_evict);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
467 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
468 if (err || winner) {
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
469 bplist_destroy(&ds->ds_pending_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
470 dsl_deadlist_close(&ds->ds_deadlist);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
471 if (ds->ds_prev)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
472 dsl_dataset_drop_ref(ds->ds_prev, ds);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
473 dsl_dir_close(ds->ds_dir, ds);
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2532
diff changeset
474 mutex_destroy(&ds->ds_lock);
10204
83c3a84aecef 6760420 zfs unmount -f causes recv to fail
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10002
diff changeset
475 mutex_destroy(&ds->ds_recvlock);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
476 mutex_destroy(&ds->ds_opening_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
477 rw_destroy(&ds->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
478 cv_destroy(&ds->ds_exclusive_cv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
479 kmem_free(ds, sizeof (dsl_dataset_t));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
480 if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
481 dmu_buf_rele(dbuf, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
482 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
483 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
484 ds = winner;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
485 } else {
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
486 ds->ds_fsid_guid =
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
487 unique_insert(ds->ds_phys->ds_fsid_guid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
488 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
489 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
490 ASSERT3P(ds->ds_dbuf, ==, dbuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
491 ASSERT3P(ds->ds_phys, ==, dbuf->db_data);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
492 ASSERT(ds->ds_phys->ds_prev_snap_obj != 0 ||
7061
524fec1acf1c 6723703 zpool upgrade -> assertion failed: ds->ds_phys->ds_prev_snap_obj != 0 || ...
ahrens
parents: 7046
diff changeset
493 spa_version(dp->dp_spa) < SPA_VERSION_ORIGIN ||
7077
a63bdc0b8352 6724675 assertion failed in dsl_dataset_get_ref(): ds->ds_phys->ds_prev_snap_obj != 0 ...
ahrens
parents: 7061
diff changeset
494 dp->dp_origin_snap == NULL || ds == dp->dp_origin_snap);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
495 mutex_enter(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
496 if (!dsl_pool_sync_context(dp) && DSL_DATASET_IS_DESTROYED(ds)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
497 mutex_exit(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
498 dmu_buf_rele(ds->ds_dbuf, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
499 return (ENOENT);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
500 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
501 mutex_exit(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
502 *dsp = ds;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
503 return (0);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
504 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
505
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
506 static int
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
507 dsl_dataset_hold_ref(dsl_dataset_t *ds, void *tag)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
508 {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
509 dsl_pool_t *dp = ds->ds_dir->dd_pool;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
510
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
511 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
512 * In syncing context we don't want the rwlock lock: there
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
513 * may be an existing writer waiting for sync phase to
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
514 * finish. We don't need to worry about such writers, since
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
515 * sync phase is single-threaded, so the writer can't be
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
516 * doing anything while we are active.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
517 */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
518 if (dsl_pool_sync_context(dp)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
519 ASSERT(!DSL_DATASET_IS_DESTROYED(ds));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
520 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
521 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
522
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
523 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
524 * Normal users will hold the ds_rwlock as a READER until they
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
525 * are finished (i.e., call dsl_dataset_rele()). "Owners" will
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
526 * drop their READER lock after they set the ds_owner field.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
527 *
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
528 * If the dataset is being destroyed, the destroy thread will
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
529 * obtain a WRITER lock for exclusive access after it's done its
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
530 * open-context work and then change the ds_owner to
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
531 * dsl_reaper once destruction is assured. So threads
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
532 * may block here temporarily, until the "destructability" of
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
533 * the dataset is determined.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
534 */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
535 ASSERT(!RW_WRITE_HELD(&dp->dp_config_rwlock));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
536 mutex_enter(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
537 while (!rw_tryenter(&ds->ds_rwlock, RW_READER)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
538 rw_exit(&dp->dp_config_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
539 cv_wait(&ds->ds_exclusive_cv, &ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
540 if (DSL_DATASET_IS_DESTROYED(ds)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
541 mutex_exit(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
542 dsl_dataset_drop_ref(ds, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
543 rw_enter(&dp->dp_config_rwlock, RW_READER);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
544 return (ENOENT);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
545 }
11546
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
546 /*
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
547 * The dp_config_rwlock lives above the ds_lock. And
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
548 * we need to check DSL_DATASET_IS_DESTROYED() while
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
549 * holding the ds_lock, so we have to drop and reacquire
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
550 * the ds_lock here.
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
551 */
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
552 mutex_exit(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
553 rw_enter(&dp->dp_config_rwlock, RW_READER);
11546
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
554 mutex_enter(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
555 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
556 mutex_exit(&ds->ds_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
557 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
558 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
559
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
560 int
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
561 dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
562 dsl_dataset_t **dsp)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
563 {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
564 int err = dsl_dataset_get_ref(dp, dsobj, tag, dsp);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
565
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
566 if (err)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
567 return (err);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
568 return (dsl_dataset_hold_ref(*dsp, tag));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
569 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
570
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
571 int
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
572 dsl_dataset_own_obj(dsl_pool_t *dp, uint64_t dsobj, boolean_t inconsistentok,
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
573 void *tag, dsl_dataset_t **dsp)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
574 {
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
575 int err = dsl_dataset_hold_obj(dp, dsobj, tag, dsp);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
576 if (err)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
577 return (err);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
578 if (!dsl_dataset_tryown(*dsp, inconsistentok, tag)) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
579 dsl_dataset_rele(*dsp, tag);
8779
f164e0e90508 6784924 panic while ludelete (zfs destroy)
Mark J Musante <Mark.Musante@Sun.COM>
parents: 8746
diff changeset
580 *dsp = NULL;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
581 return (EBUSY);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
582 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
583 return (0);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
584 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
585
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
586 int
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
587 dsl_dataset_hold(const char *name, void *tag, dsl_dataset_t **dsp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
588 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
589 dsl_dir_t *dd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
590 dsl_pool_t *dp;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
591 const char *snapname;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
592 uint64_t obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
593 int err = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
594
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
595 err = dsl_dir_open_spa(NULL, name, FTAG, &dd, &snapname);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
596 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
597 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
598
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
599 dp = dd->dd_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
600 obj = dd->dd_phys->dd_head_dataset_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
601 rw_enter(&dp->dp_config_rwlock, RW_READER);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
602 if (obj)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
603 err = dsl_dataset_get_ref(dp, obj, tag, dsp);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
604 else
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
605 err = ENOENT;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
606 if (err)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
607 goto out;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
608
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
609 err = dsl_dataset_hold_ref(*dsp, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
610
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
611 /* we may be looking for a snapshot */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
612 if (err == 0 && snapname != NULL) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
613 dsl_dataset_t *ds = NULL;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
614
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
615 if (*snapname++ != '@') {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
616 dsl_dataset_rele(*dsp, tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
617 err = ENOENT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
618 goto out;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
619 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
620
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
621 dprintf("looking for snapshot '%s'\n", snapname);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
622 err = dsl_dataset_snap_lookup(*dsp, snapname, &obj);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
623 if (err == 0)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
624 err = dsl_dataset_get_ref(dp, obj, tag, &ds);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
625 dsl_dataset_rele(*dsp, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
626
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
627 ASSERT3U((err == 0), ==, (ds != NULL));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
628
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
629 if (ds) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
630 mutex_enter(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
631 if (ds->ds_snapname[0] == 0)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
632 (void) strlcpy(ds->ds_snapname, snapname,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
633 sizeof (ds->ds_snapname));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
634 mutex_exit(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
635 err = dsl_dataset_hold_ref(ds, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
636 *dsp = err ? NULL : ds;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
637 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
638 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
639 out:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
640 rw_exit(&dp->dp_config_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
641 dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
642 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
643 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
644
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
645 int
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
646 dsl_dataset_own(const char *name, boolean_t inconsistentok,
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
647 void *tag, dsl_dataset_t **dsp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
648 {
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
649 int err = dsl_dataset_hold(name, tag, dsp);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
650 if (err)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
651 return (err);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
652 if (!dsl_dataset_tryown(*dsp, inconsistentok, tag)) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
653 dsl_dataset_rele(*dsp, tag);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
654 return (EBUSY);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
655 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
656 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
657 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
658
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
659 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
660 dsl_dataset_name(dsl_dataset_t *ds, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
661 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
662 if (ds == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
663 (void) strcpy(name, "mos");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
664 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
665 dsl_dir_name(ds->ds_dir, name);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
666 VERIFY(0 == dsl_dataset_get_snapname(ds));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
667 if (ds->ds_snapname[0]) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
668 (void) strcat(name, "@");
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
669 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
670 * We use a "recursive" mutex so that we
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
671 * can call dprintf_ds() with ds_lock held.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
672 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
673 if (!MUTEX_HELD(&ds->ds_lock)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
674 mutex_enter(&ds->ds_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
675 (void) strcat(name, ds->ds_snapname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
676 mutex_exit(&ds->ds_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
677 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
678 (void) strcat(name, ds->ds_snapname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
679 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
680 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
681 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
682 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
683
3978
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
684 static int
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
685 dsl_dataset_namelen(dsl_dataset_t *ds)
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
686 {
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
687 int result;
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
688
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
689 if (ds == NULL) {
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
690 result = 3; /* "mos" */
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
691 } else {
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
692 result = dsl_dir_namelen(ds->ds_dir);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
693 VERIFY(0 == dsl_dataset_get_snapname(ds));
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
694 if (ds->ds_snapname[0]) {
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
695 ++result; /* adding one for the @-sign */
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
696 if (!MUTEX_HELD(&ds->ds_lock)) {
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
697 mutex_enter(&ds->ds_lock);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
698 result += strlen(ds->ds_snapname);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
699 mutex_exit(&ds->ds_lock);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
700 } else {
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
701 result += strlen(ds->ds_snapname);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
702 }
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
703 }
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
704 }
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
705
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
706 return (result);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
707 }
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
708
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
709 void
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
710 dsl_dataset_drop_ref(dsl_dataset_t *ds, void *tag)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
711 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
712 dmu_buf_rele(ds->ds_dbuf, tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
713 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
714
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
715 void
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
716 dsl_dataset_rele(dsl_dataset_t *ds, void *tag)
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
717 {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
718 if (!dsl_pool_sync_context(ds->ds_dir->dd_pool)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
719 rw_exit(&ds->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
720 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
721 dsl_dataset_drop_ref(ds, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
722 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
723
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
724 void
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
725 dsl_dataset_disown(dsl_dataset_t *ds, void *tag)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
726 {
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
727 ASSERT((ds->ds_owner == tag && ds->ds_dbuf) ||
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
728 (DSL_DATASET_IS_DESTROYED(ds) && ds->ds_dbuf == NULL));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
729
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
730 mutex_enter(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
731 ds->ds_owner = NULL;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
732 if (RW_WRITE_HELD(&ds->ds_rwlock)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
733 rw_exit(&ds->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
734 cv_broadcast(&ds->ds_exclusive_cv);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
735 }
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
736 mutex_exit(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
737 if (ds->ds_dbuf)
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
738 dsl_dataset_drop_ref(ds, tag);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
739 else
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
740 dsl_dataset_evict(NULL, ds);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
741 }
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
742
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
743 boolean_t
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
744 dsl_dataset_tryown(dsl_dataset_t *ds, boolean_t inconsistentok, void *tag)
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
745 {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
746 boolean_t gotit = FALSE;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
747
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
748 mutex_enter(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
749 if (ds->ds_owner == NULL &&
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
750 (!DS_IS_INCONSISTENT(ds) || inconsistentok)) {
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
751 ds->ds_owner = tag;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
752 if (!dsl_pool_sync_context(ds->ds_dir->dd_pool))
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
753 rw_exit(&ds->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
754 gotit = TRUE;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
755 }
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
756 mutex_exit(&ds->ds_lock);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
757 return (gotit);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
758 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
759
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
760 void
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
761 dsl_dataset_make_exclusive(dsl_dataset_t *ds, void *owner)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
762 {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
763 ASSERT3P(owner, ==, ds->ds_owner);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
764 if (!RW_WRITE_HELD(&ds->ds_rwlock))
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
765 rw_enter(&ds->ds_rwlock, RW_WRITER);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
766 }
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
767
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
768 uint64_t
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
769 dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin,
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
770 uint64_t flags, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
771 {
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
772 dsl_pool_t *dp = dd->dd_pool;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
773 dmu_buf_t *dbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
774 dsl_dataset_phys_t *dsphys;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
775 uint64_t dsobj;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
776 objset_t *mos = dp->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
777
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
778 if (origin == NULL)
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
779 origin = dp->dp_origin_snap;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
780
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
781 ASSERT(origin == NULL || origin->ds_dir->dd_pool == dp);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
782 ASSERT(origin == NULL || origin->ds_phys->ds_num_children > 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
783 ASSERT(dmu_tx_is_syncing(tx));
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
784 ASSERT(dd->dd_phys->dd_head_dataset_obj == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
785
928
36d72fe4da29 6349314 dmu_object_type names incorrect for DSL Directories and DSL Datasets
tabriz
parents: 885
diff changeset
786 dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0,
36d72fe4da29 6349314 dmu_object_type names incorrect for DSL Directories and DSL Datasets
tabriz
parents: 885
diff changeset
787 DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
788 VERIFY(0 == dmu_bonus_hold(mos, dsobj, FTAG, &dbuf));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
789 dmu_buf_will_dirty(dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
790 dsphys = dbuf->db_data;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
791 bzero(dsphys, sizeof (dsl_dataset_phys_t));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
792 dsphys->ds_dir_obj = dd->dd_object;
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
793 dsphys->ds_flags = flags;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
794 dsphys->ds_fsid_guid = unique_create();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
795 (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
796 sizeof (dsphys->ds_guid));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
797 dsphys->ds_snapnames_zapobj =
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
798 zap_create_norm(mos, U8_TEXTPREP_TOUPPER, DMU_OT_DSL_DS_SNAP_MAP,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
799 DMU_OT_NONE, 0, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
800 dsphys->ds_creation_time = gethrestime_sec();
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
801 dsphys->ds_creation_txg = tx->tx_txg == TXG_INITIAL ? 1 : tx->tx_txg;
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
802
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
803 if (origin == NULL) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
804 dsphys->ds_deadlist_obj = dsl_deadlist_alloc(mos, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
805 } else {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
806 dsl_dataset_t *ohds;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
807
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
808 dsphys->ds_prev_snap_obj = origin->ds_object;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
809 dsphys->ds_prev_snap_txg =
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
810 origin->ds_phys->ds_creation_txg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
811 dsphys->ds_used_bytes =
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
812 origin->ds_phys->ds_used_bytes;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
813 dsphys->ds_compressed_bytes =
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
814 origin->ds_phys->ds_compressed_bytes;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
815 dsphys->ds_uncompressed_bytes =
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
816 origin->ds_phys->ds_uncompressed_bytes;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
817 dsphys->ds_bp = origin->ds_phys->ds_bp;
6502
66aef5f20377 6694731 drc->drc_real_ds->ds_phys->ds_flags & (1ULL<<0), file: ../../common/fs/zfs/dmu_send.c, line: 1069
timh
parents: 6492
diff changeset
818 dsphys->ds_flags |= origin->ds_phys->ds_flags;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
819
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
820 dmu_buf_will_dirty(origin->ds_dbuf, tx);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
821 origin->ds_phys->ds_num_children++;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
822
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
823 VERIFY3U(0, ==, dsl_dataset_hold_obj(dp,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
824 origin->ds_dir->dd_phys->dd_head_dataset_obj, FTAG, &ohds));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
825 dsphys->ds_deadlist_obj = dsl_deadlist_clone(&ohds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
826 dsphys->ds_prev_snap_txg, dsphys->ds_prev_snap_obj, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
827 dsl_dataset_rele(ohds, FTAG);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
828
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
829 if (spa_version(dp->dp_spa) >= SPA_VERSION_NEXT_CLONES) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
830 if (origin->ds_phys->ds_next_clones_obj == 0) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
831 origin->ds_phys->ds_next_clones_obj =
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
832 zap_create(mos,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
833 DMU_OT_NEXT_CLONES, DMU_OT_NONE, 0, tx);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
834 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
835 VERIFY(0 == zap_add_int(mos,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
836 origin->ds_phys->ds_next_clones_obj,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
837 dsobj, tx));
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
838 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
839
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
840 dmu_buf_will_dirty(dd->dd_dbuf, tx);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
841 dd->dd_phys->dd_origin_obj = origin->ds_object;
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
842 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
843 if (origin->ds_dir->dd_phys->dd_clones == 0) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
844 dmu_buf_will_dirty(origin->ds_dir->dd_dbuf, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
845 origin->ds_dir->dd_phys->dd_clones =
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
846 zap_create(mos,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
847 DMU_OT_DSL_CLONES, DMU_OT_NONE, 0, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
848 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
849 VERIFY3U(0, ==, zap_add_int(mos,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
850 origin->ds_dir->dd_phys->dd_clones, dsobj, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
851 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
852 }
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
853
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
854 if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE)
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
855 dsphys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE;
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
856
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
857 dmu_buf_rele(dbuf, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
858
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
859 dmu_buf_will_dirty(dd->dd_dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
860 dd->dd_phys->dd_head_dataset_obj = dsobj;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
861
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
862 return (dsobj);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
863 }
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
864
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
865 uint64_t
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
866 dsl_dataset_create_sync(dsl_dir_t *pdd, const char *lastname,
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
867 dsl_dataset_t *origin, uint64_t flags, cred_t *cr, dmu_tx_t *tx)
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
868 {
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
869 dsl_pool_t *dp = pdd->dd_pool;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
870 uint64_t dsobj, ddobj;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
871 dsl_dir_t *dd;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
872
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
873 ASSERT(lastname[0] != '@');
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
874
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
875 ddobj = dsl_dir_create_sync(dp, pdd, lastname, tx);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
876 VERIFY(0 == dsl_dir_open_obj(dp, ddobj, lastname, FTAG, &dd));
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
877
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
878 dsobj = dsl_dataset_create_sync_dd(dd, origin, flags, tx);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
879
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
880 dsl_deleg_set_create_perms(dd, tx, cr);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
881
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
882 dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
883
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
884 return (dsobj);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
885 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
886
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
887 struct destroyarg {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
888 dsl_sync_task_group_t *dstg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
889 char *snapname;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
890 char *failed;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
891 boolean_t defer;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
892 };
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
893
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
894 static int
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
895 dsl_snapshot_destroy_one(const char *name, void *arg)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
896 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
897 struct destroyarg *da = arg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
898 dsl_dataset_t *ds;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
899 int err;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
900 char *dsname;
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
901
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
902 dsname = kmem_asprintf("%s@%s", name, da->snapname);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
903 err = dsl_dataset_own(dsname, B_TRUE, da->dstg, &ds);
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
904 strfree(dsname);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
905 if (err == 0) {
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
906 struct dsl_ds_destroyarg *dsda;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
907
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
908 dsl_dataset_make_exclusive(ds, da->dstg);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
909 dsda = kmem_zalloc(sizeof (struct dsl_ds_destroyarg), KM_SLEEP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
910 dsda->ds = ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
911 dsda->defer = da->defer;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
912 dsl_sync_task_create(da->dstg, dsl_dataset_destroy_check,
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
913 dsl_dataset_destroy_sync, dsda, da->dstg, 0);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
914 } else if (err == ENOENT) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
915 err = 0;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
916 } else {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
917 (void) strcpy(da->failed, name);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
918 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
919 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
920 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
921
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
922 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
923 * Destroy 'snapname' in all descendants of 'fsname'.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
924 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
925 #pragma weak dmu_snapshots_destroy = dsl_snapshots_destroy
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
926 int
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
927 dsl_snapshots_destroy(char *fsname, char *snapname, boolean_t defer)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
928 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
929 int err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
930 struct destroyarg da;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
931 dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
932 spa_t *spa;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
933
4603
c7840c367d00 6494569 zfs recv -d pool/<doesn't exist> core dumps for top-level filesystem backups
ahrens
parents: 4577
diff changeset
934 err = spa_open(fsname, &spa, FTAG);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
935 if (err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
936 return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
937 da.dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
938 da.snapname = snapname;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
939 da.failed = fsname;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
940 da.defer = defer;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
941
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
942 err = dmu_objset_find(fsname,
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2207
diff changeset
943 dsl_snapshot_destroy_one, &da, DS_FIND_CHILDREN);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
944
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
945 if (err == 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
946 err = dsl_sync_task_group_wait(da.dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
947
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
948 for (dst = list_head(&da.dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
949 dst = list_next(&da.dstg->dstg_tasks, dst)) {
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
950 struct dsl_ds_destroyarg *dsda = dst->dst_arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
951 dsl_dataset_t *ds = dsda->ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
952
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
953 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
954 * Return the file system name that triggered the error
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
955 */
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
956 if (dst->dst_err) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
957 dsl_dataset_name(ds, fsname);
4603
c7840c367d00 6494569 zfs recv -d pool/<doesn't exist> core dumps for top-level filesystem backups
ahrens
parents: 4577
diff changeset
958 *strchr(fsname, '@') = '\0';
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
959 }
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
960 ASSERT3P(dsda->rm_origin, ==, NULL);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
961 dsl_dataset_disown(ds, da.dstg);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
962 kmem_free(dsda, sizeof (struct dsl_ds_destroyarg));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
963 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
964
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
965 dsl_sync_task_group_destroy(da.dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
966 spa_close(spa, FTAG);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
967 return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
968 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
969
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
970 static boolean_t
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
971 dsl_dataset_might_destroy_origin(dsl_dataset_t *ds)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
972 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
973 boolean_t might_destroy = B_FALSE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
974
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
975 mutex_enter(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
976 if (ds->ds_phys->ds_num_children == 2 && ds->ds_userrefs == 0 &&
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
977 DS_IS_DEFER_DESTROY(ds))
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
978 might_destroy = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
979 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
980
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
981 return (might_destroy);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
982 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
983
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
984 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
985 * If we're removing a clone, and these three conditions are true:
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
986 * 1) the clone's origin has no other children
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
987 * 2) the clone's origin has no user references
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
988 * 3) the clone's origin has been marked for deferred destruction
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
989 * Then, prepare to remove the origin as part of this sync task group.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
990 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
991 static int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
992 dsl_dataset_origin_rm_prep(struct dsl_ds_destroyarg *dsda, void *tag)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
993 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
994 dsl_dataset_t *ds = dsda->ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
995 dsl_dataset_t *origin = ds->ds_prev;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
996
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
997 if (dsl_dataset_might_destroy_origin(origin)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
998 char *name;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
999 int namelen;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1000 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1001
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1002 namelen = dsl_dataset_namelen(origin) + 1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1003 name = kmem_alloc(namelen, KM_SLEEP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1004 dsl_dataset_name(origin, name);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1005 #ifdef _KERNEL
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1006 error = zfs_unmount_snap(name, NULL);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1007 if (error) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1008 kmem_free(name, namelen);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1009 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1010 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1011 #endif
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
1012 error = dsl_dataset_own(name, B_TRUE, tag, &origin);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1013 kmem_free(name, namelen);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1014 if (error)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1015 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1016 dsda->rm_origin = origin;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1017 dsl_dataset_make_exclusive(origin, tag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1018 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1019
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1020 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1021 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1022
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1023 /*
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1024 * ds must be opened as OWNER. On return (whether successful or not),
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1025 * ds will be closed and caller can no longer dereference it.
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1026 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1027 int
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1028 dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1029 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1030 int err;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1031 dsl_sync_task_group_t *dstg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1032 objset_t *os;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1033 dsl_dir_t *dd;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1034 uint64_t obj;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1035 struct dsl_ds_destroyarg dsda = { 0 };
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1036 dsl_dataset_t dummy_ds = { 0 };
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1037
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1038 dsda.ds = ds;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1039
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1040 if (dsl_dataset_is_snapshot(ds)) {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1041 /* Destroying a snapshot is simpler */
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1042 dsl_dataset_make_exclusive(ds, tag);
7237
f47d41541b14 PSARC 2008/393 zfs primarycache and secondarycache properties
ek110237
parents: 7077
diff changeset
1043
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1044 dsda.defer = defer;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1045 err = dsl_sync_task_do(ds->ds_dir->dd_pool,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1046 dsl_dataset_destroy_check, dsl_dataset_destroy_sync,
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1047 &dsda, tag, 0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1048 ASSERT3P(dsda.rm_origin, ==, NULL);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1049 goto out;
10385
21cb6e67d108 6873727 zfs destroy -d <fs> should fail more gracefully when children are present
Chris Kirby <chris.kirby@sun.com>
parents: 10373
diff changeset
1050 } else if (defer) {
21cb6e67d108 6873727 zfs destroy -d <fs> should fail more gracefully when children are present
Chris Kirby <chris.kirby@sun.com>
parents: 10373
diff changeset
1051 err = EINVAL;
21cb6e67d108 6873727 zfs destroy -d <fs> should fail more gracefully when children are present
Chris Kirby <chris.kirby@sun.com>
parents: 10373
diff changeset
1052 goto out;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1053 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1054
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1055 dd = ds->ds_dir;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1056 dummy_ds.ds_dir = dd;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1057 dummy_ds.ds_object = ds->ds_object;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1058
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1059 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1060 * Check for errors and mark this ds as inconsistent, in
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1061 * case we crash while freeing the objects.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1062 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1063 err = dsl_sync_task_do(dd->dd_pool, dsl_dataset_destroy_begin_check,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1064 dsl_dataset_destroy_begin_sync, ds, NULL, 0);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1065 if (err)
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1066 goto out;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1067
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
1068 err = dmu_objset_from_ds(ds, &os);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1069 if (err)
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1070 goto out;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1071
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1072 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1073 * remove the objects in open context, so that we won't
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1074 * have too much to do in syncing context.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1075 */
3025
4e5ee8301d84 6424466 "panic: data after EOF" when unmounting abused pool
ahrens
parents: 2885
diff changeset
1076 for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE,
4e5ee8301d84 6424466 "panic: data after EOF" when unmounting abused pool
ahrens
parents: 2885
diff changeset
1077 ds->ds_phys->ds_prev_snap_txg)) {
6992
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
1078 /*
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
1079 * Ignore errors, if there is not enough disk space
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
1080 * we will deal with it in dsl_dataset_destroy_sync().
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
1081 */
20c04e18c58c 6573681 deleting a very large file can be slow
maybee
parents: 6975
diff changeset
1082 (void) dmu_free_object(os, obj);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1083 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1084
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1085 /*
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1086 * We need to sync out all in-flight IO before we try to evict
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1087 * (the dataset evict func is trying to clear the cached entries
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1088 * for this dataset in the ARC).
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1089 */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1090 txg_wait_synced(dd->dd_pool, 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1091
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1092 /*
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1093 * If we managed to free all the objects in open
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1094 * context, the user space accounting should be zero.
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1095 */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1096 if (ds->ds_phys->ds_bp.blk_fill == 0 &&
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
1097 dmu_objset_userused_enabled(os)) {
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1098 uint64_t count;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1099
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1100 ASSERT(zap_count(os, DMU_USERUSED_OBJECT, &count) != 0 ||
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1101 count == 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1102 ASSERT(zap_count(os, DMU_GROUPUSED_OBJECT, &count) != 0 ||
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1103 count == 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1104 }
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9390
diff changeset
1105
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1106 if (err != ESRCH)
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1107 goto out;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1108
6975
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1109 rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1110 err = dsl_dir_open_obj(dd->dd_pool, dd->dd_object, NULL, FTAG, &dd);
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1111 rw_exit(&dd->dd_pool->dp_config_rwlock);
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1112
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1113 if (err)
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1114 goto out;
c511f317869e 6717522 panic in dmu_objset_stats() due to freed objset_impl_t
maybee
parents: 6689
diff changeset
1115
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1116 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1117 * Blow away the dsl_dir + head dataset.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1118 */
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1119 dsl_dataset_make_exclusive(ds, tag);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1120 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1121 * If we're removing a clone, we might also need to remove its
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1122 * origin.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1123 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1124 do {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1125 dsda.need_prep = B_FALSE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1126 if (dsl_dir_is_clone(dd)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1127 err = dsl_dataset_origin_rm_prep(&dsda, tag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1128 if (err) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1129 dsl_dir_close(dd, FTAG);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1130 goto out;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1131 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1132 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1133
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1134 dstg = dsl_sync_task_group_create(ds->ds_dir->dd_pool);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1135 dsl_sync_task_create(dstg, dsl_dataset_destroy_check,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1136 dsl_dataset_destroy_sync, &dsda, tag, 0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1137 dsl_sync_task_create(dstg, dsl_dir_destroy_check,
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1138 dsl_dir_destroy_sync, &dummy_ds, FTAG, 0);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1139 err = dsl_sync_task_group_wait(dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1140 dsl_sync_task_group_destroy(dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1141
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1142 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1143 * We could be racing against 'zfs release' or 'zfs destroy -d'
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1144 * on the origin snap, in which case we can get EBUSY if we
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1145 * needed to destroy the origin snap but were not ready to
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1146 * do so.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1147 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1148 if (dsda.need_prep) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1149 ASSERT(err == EBUSY);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1150 ASSERT(dsl_dir_is_clone(dd));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1151 ASSERT(dsda.rm_origin == NULL);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1152 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1153 } while (dsda.need_prep);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1154
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1155 if (dsda.rm_origin != NULL)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1156 dsl_dataset_disown(dsda.rm_origin, tag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1157
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1158 /* if it is successful, dsl_dir_destroy_sync will close the dd */
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1159 if (err)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1160 dsl_dir_close(dd, FTAG);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1161 out:
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1162 dsl_dataset_disown(ds, tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1163 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1164 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1165
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
1166 blkptr_t *
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
1167 dsl_dataset_get_blkptr(dsl_dataset_t *ds)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1168 {
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
1169 return (&ds->ds_phys->ds_bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1170 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1171
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1172 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1173 dsl_dataset_set_blkptr(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1174 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1175 ASSERT(dmu_tx_is_syncing(tx));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1176 /* If it's the meta-objset, set dp_meta_rootbp */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1177 if (ds == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1178 tx->tx_pool->dp_meta_rootbp = *bp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1179 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1180 dmu_buf_will_dirty(ds->ds_dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1181 ds->ds_phys->ds_bp = *bp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1182 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1183 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1184
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1185 spa_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1186 dsl_dataset_get_spa(dsl_dataset_t *ds)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1187 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1188 return (ds->ds_dir->dd_pool->dp_spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1189 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1190
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1191 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1192 dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1193 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1194 dsl_pool_t *dp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1195
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1196 if (ds == NULL) /* this is the meta-objset */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1197 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1198
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
1199 ASSERT(ds->ds_objset != NULL);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1200
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1201 if (ds->ds_phys->ds_next_snap_obj != 0)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1202 panic("dirtying snapshot!");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1203
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1204 dp = ds->ds_dir->dd_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1205
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1206 if (txg_list_add(&dp->dp_dirty_datasets, ds, tx->tx_txg) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1207 /* up the hold count until we can be written out */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1208 dmu_buf_add_ref(ds->ds_dbuf, ds);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1209 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1210 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1211
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1212 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1213 * The unique space in the head dataset can be calculated by subtracting
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1214 * the space used in the most recent snapshot, that is still being used
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1215 * in this file system, from the space currently in use. To figure out
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1216 * the space in the most recent snapshot still in use, we need to take
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1217 * the total space used in the snapshot and subtract out the space that
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1218 * has been freed up since the snapshot was taken.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1219 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1220 static void
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1221 dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1222 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1223 uint64_t mrs_used;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1224 uint64_t dlused, dlcomp, dluncomp;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1225
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1226 ASSERT(!dsl_dataset_is_snapshot(ds));
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1227
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1228 if (ds->ds_phys->ds_prev_snap_obj != 0)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1229 mrs_used = ds->ds_prev->ds_phys->ds_used_bytes;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1230 else
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1231 mrs_used = 0;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1232
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1233 dsl_deadlist_space(&ds->ds_deadlist, &dlused, &dlcomp, &dluncomp);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1234
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1235 ASSERT3U(dlused, <=, mrs_used);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1236 ds->ds_phys->ds_unique_bytes =
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1237 ds->ds_phys->ds_used_bytes - (mrs_used - dlused);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1238
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1239 if (spa_version(ds->ds_dir->dd_pool->dp_spa) >=
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1240 SPA_VERSION_UNIQUE_ACCURATE)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1241 ds->ds_phys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1242 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1243
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1244 struct killarg {
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1245 dsl_dataset_t *ds;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1246 dmu_tx_t *tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1247 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1248
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1249 /* ARGSUSED */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1250 static int
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1251 kill_blkptr(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, arc_buf_t *pbuf,
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1252 const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1253 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1254 struct killarg *ka = arg;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1255 dmu_tx_t *tx = ka->tx;
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
1256
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
1257 if (bp == NULL)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
1258 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1259
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1260 if (zb->zb_level == ZB_ZIL_LEVEL) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1261 ASSERT(zilog != NULL);
8746
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1262 /*
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1263 * It's a block in the intent log. It has no
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1264 * accounting, so just free it.
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1265 */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1266 dsl_free(ka->tx->tx_pool, ka->tx->tx_txg, bp);
8746
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1267 } else {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1268 ASSERT(zilog == NULL);
8746
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1269 ASSERT3U(bp->blk_birth, >, ka->ds->ds_phys->ds_prev_snap_txg);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
1270 (void) dsl_dataset_block_kill(ka->ds, bp, tx, B_FALSE);
8746
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8525
diff changeset
1271 }
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1272
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1273 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1274 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1275
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1276 /* ARGSUSED */
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1277 static int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1278 dsl_dataset_destroy_begin_check(void *arg1, void *arg2, dmu_tx_t *tx)
1731
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1279 {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1280 dsl_dataset_t *ds = arg1;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1281 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1282 uint64_t count;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1283 int err;
1731
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1284
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1285 /*
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1286 * Can't delete a head dataset if there are snapshots of it.
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1287 * (Except if the only snapshots are from the branch we cloned
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1288 * from.)
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1289 */
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1290 if (ds->ds_prev != NULL &&
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1291 ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object)
10816
731471f04028 6482588 zfs destroy -r aborts and dumps core when destroying a file system (while snapshotting is going on)
vitezslav batrla - Sun Microsystems - Prague Czech Republic <Vitezslav.Batrla@Sun.COM>
parents: 10801
diff changeset
1292 return (EBUSY);
1731
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1293
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1294 /*
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1295 * This is really a dsl_dir thing, but check it here so that
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1296 * we'll be less likely to leave this dataset inconsistent &
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1297 * nearly destroyed.
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1298 */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1299 err = zap_count(mos, ds->ds_dir->dd_phys->dd_child_dir_zapobj, &count);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1300 if (err)
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1301 return (err);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1302 if (count != 0)
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1303 return (EEXIST);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1304
1731
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1305 return (0);
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1306 }
1efa8b3d1296 6402598 'zfs destroy <fs>' can take a long time, stopping up the txg train
bonwick
parents: 1544
diff changeset
1307
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1308 /* ARGSUSED */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1309 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1310 dsl_dataset_destroy_begin_sync(void *arg1, void *arg2, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1311 {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1312 dsl_dataset_t *ds = arg1;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
1313 dsl_pool_t *dp = ds->ds_dir->dd_pool;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1314
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1315 /* Mark it as inconsistent on-disk, in case we crash */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1316 dmu_buf_will_dirty(ds->ds_dbuf, tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1317 ds->ds_phys->ds_flags |= DS_FLAG_INCONSISTENT;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
1318
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1319 spa_history_log_internal(LOG_DS_DESTROY_BEGIN, dp->dp_spa, tx,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1320 "dataset = %llu", ds->ds_object);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1321 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1322
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1323 static int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1324 dsl_dataset_origin_check(struct dsl_ds_destroyarg *dsda, void *tag,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1325 dmu_tx_t *tx)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1326 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1327 dsl_dataset_t *ds = dsda->ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1328 dsl_dataset_t *ds_prev = ds->ds_prev;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1329
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1330 if (dsl_dataset_might_destroy_origin(ds_prev)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1331 struct dsl_ds_destroyarg ndsda = {0};
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1332
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1333 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1334 * If we're not prepared to remove the origin, don't remove
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1335 * the clone either.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1336 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1337 if (dsda->rm_origin == NULL) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1338 dsda->need_prep = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1339 return (EBUSY);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1340 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1341
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1342 ndsda.ds = ds_prev;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1343 ndsda.is_origin_rm = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1344 return (dsl_dataset_destroy_check(&ndsda, tag, tx));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1345 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1346
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1347 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1348 * If we're not going to remove the origin after all,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1349 * undo the open context setup.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1350 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1351 if (dsda->rm_origin != NULL) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1352 dsl_dataset_disown(dsda->rm_origin, tag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1353 dsda->rm_origin = NULL;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1354 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1355
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1356 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1357 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1358
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1359 /* ARGSUSED */
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1360 int
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1361 dsl_dataset_destroy_check(void *arg1, void *arg2, dmu_tx_t *tx)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1362 {
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1363 struct dsl_ds_destroyarg *dsda = arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1364 dsl_dataset_t *ds = dsda->ds;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1365
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1366 /* we have an owner hold, so noone else can destroy us */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1367 ASSERT(!DSL_DATASET_IS_DESTROYED(ds));
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1368
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1369 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1370 * Only allow deferred destroy on pools that support it.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1371 * NOTE: deferred destroy is only supported on snapshots.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1372 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1373 if (dsda->defer) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1374 if (spa_version(ds->ds_dir->dd_pool->dp_spa) <
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1375 SPA_VERSION_USERREFS)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1376 return (ENOTSUP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1377 ASSERT(dsl_dataset_is_snapshot(ds));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1378 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1379 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1380
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1381 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1382 * Can't delete a head dataset if there are snapshots of it.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1383 * (Except if the only snapshots are from the branch we cloned
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1384 * from.)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1385 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1386 if (ds->ds_prev != NULL &&
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1387 ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object)
10816
731471f04028 6482588 zfs destroy -r aborts and dumps core when destroying a file system (while snapshotting is going on)
vitezslav batrla - Sun Microsystems - Prague Czech Republic <Vitezslav.Batrla@Sun.COM>
parents: 10801
diff changeset
1388 return (EBUSY);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1389
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1390 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1391 * If we made changes this txg, traverse_dsl_dataset won't find
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1392 * them. Try again.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1393 */
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1394 if (ds->ds_phys->ds_bp.blk_birth >= tx->tx_txg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1395 return (EAGAIN);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1396
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1397 if (dsl_dataset_is_snapshot(ds)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1398 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1399 * If this snapshot has an elevated user reference count,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1400 * we can't destroy it yet.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1401 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1402 if (ds->ds_userrefs > 0 && !dsda->releasing)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1403 return (EBUSY);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1404
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1405 mutex_enter(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1406 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1407 * Can't delete a branch point. However, if we're destroying
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1408 * a clone and removing its origin due to it having a user
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1409 * hold count of 0 and having been marked for deferred destroy,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1410 * it's OK for the origin to have a single clone.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1411 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1412 if (ds->ds_phys->ds_num_children >
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1413 (dsda->is_origin_rm ? 2 : 1)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1414 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1415 return (EEXIST);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1416 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1417 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1418 } else if (dsl_dir_is_clone(ds->ds_dir)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1419 return (dsl_dataset_origin_check(dsda, arg2, tx));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1420 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1421
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1422 /* XXX we should do some i/o error checking... */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1423 return (0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1424 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1425
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1426 struct refsarg {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1427 kmutex_t lock;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1428 boolean_t gone;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1429 kcondvar_t cv;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1430 };
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1431
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1432 /* ARGSUSED */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1433 static void
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1434 dsl_dataset_refs_gone(dmu_buf_t *db, void *argv)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1435 {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1436 struct refsarg *arg = argv;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1437
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1438 mutex_enter(&arg->lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1439 arg->gone = TRUE;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1440 cv_signal(&arg->cv);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1441 mutex_exit(&arg->lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1442 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1443
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1444 static void
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1445 dsl_dataset_drain_refs(dsl_dataset_t *ds, void *tag)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1446 {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1447 struct refsarg arg;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1448
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1449 mutex_init(&arg.lock, NULL, MUTEX_DEFAULT, NULL);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1450 cv_init(&arg.cv, NULL, CV_DEFAULT, NULL);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1451 arg.gone = FALSE;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1452 (void) dmu_buf_update_user(ds->ds_dbuf, ds, &arg, &ds->ds_phys,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1453 dsl_dataset_refs_gone);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1454 dmu_buf_rele(ds->ds_dbuf, tag);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1455 mutex_enter(&arg.lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1456 while (!arg.gone)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1457 cv_wait(&arg.cv, &arg.lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1458 ASSERT(arg.gone);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1459 mutex_exit(&arg.lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1460 ds->ds_dbuf = NULL;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1461 ds->ds_phys = NULL;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1462 mutex_destroy(&arg.lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1463 cv_destroy(&arg.cv);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1464 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1465
10801
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1466 static void
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1467 remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj, dmu_tx_t *tx)
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1468 {
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1469 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1470 uint64_t count;
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1471 int err;
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1472
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1473 ASSERT(ds->ds_phys->ds_num_children >= 2);
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1474 err = zap_remove_int(mos, ds->ds_phys->ds_next_clones_obj, obj, tx);
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1475 /*
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1476 * The err should not be ENOENT, but a bug in a previous version
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1477 * of the code could cause upgrade_clones_cb() to not set
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1478 * ds_next_snap_obj when it should, leading to a missing entry.
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1479 * If we knew that the pool was created after
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1480 * SPA_VERSION_NEXT_CLONES, we could assert that it isn't
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1481 * ENOENT. However, at least we can check that we don't have
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1482 * too many entries in the next_clones_obj even after failing to
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1483 * remove this one.
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1484 */
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1485 if (err != ENOENT) {
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1486 VERIFY3U(err, ==, 0);
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1487 }
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1488 ASSERT3U(0, ==, zap_count(mos, ds->ds_phys->ds_next_clones_obj,
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1489 &count));
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1490 ASSERT3U(count, <=, ds->ds_phys->ds_num_children - 2);
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1491 }
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1492
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1493 static void
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1494 dsl_dataset_remove_clones_key(dsl_dataset_t *ds, uint64_t mintxg, dmu_tx_t *tx)
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1495 {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1496 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1497 zap_cursor_t zc;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1498 zap_attribute_t za;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1499
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1500 /*
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1501 * If it is the old version, dd_clones doesn't exist so we can't
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1502 * find the clones, but deadlist_remove_key() is a no-op so it
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1503 * doesn't matter.
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1504 */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1505 if (ds->ds_dir->dd_phys->dd_clones == 0)
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1506 return;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1507
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1508 for (zap_cursor_init(&zc, mos, ds->ds_dir->dd_phys->dd_clones);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1509 zap_cursor_retrieve(&zc, &za) == 0;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1510 zap_cursor_advance(&zc)) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1511 dsl_dataset_t *clone;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1512
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1513 VERIFY3U(0, ==, dsl_dataset_hold_obj(ds->ds_dir->dd_pool,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1514 za.za_first_integer, FTAG, &clone));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1515 if (clone->ds_dir->dd_origin_txg > mintxg) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1516 dsl_deadlist_remove_key(&clone->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1517 mintxg, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1518 dsl_dataset_remove_clones_key(clone, mintxg, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1519 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1520 dsl_dataset_rele(clone, FTAG);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1521 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1522 zap_cursor_fini(&zc);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1523 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1524
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1525 struct process_old_arg {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1526 dsl_dataset_t *ds;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1527 dsl_dataset_t *ds_prev;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1528 boolean_t after_branch_point;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1529 zio_t *pio;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1530 uint64_t used, comp, uncomp;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1531 };
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1532
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1533 static int
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1534 process_old_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1535 {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1536 struct process_old_arg *poa = arg;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1537 dsl_pool_t *dp = poa->ds->ds_dir->dd_pool;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1538
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1539 if (bp->blk_birth <= poa->ds->ds_phys->ds_prev_snap_txg) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1540 dsl_deadlist_insert(&poa->ds->ds_deadlist, bp, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1541 if (poa->ds_prev && !poa->after_branch_point &&
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1542 bp->blk_birth >
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1543 poa->ds_prev->ds_phys->ds_prev_snap_txg) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1544 poa->ds_prev->ds_phys->ds_unique_bytes +=
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1545 bp_get_dsize_sync(dp->dp_spa, bp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1546 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1547 } else {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1548 poa->used += bp_get_dsize_sync(dp->dp_spa, bp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1549 poa->comp += BP_GET_PSIZE(bp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1550 poa->uncomp += BP_GET_UCSIZE(bp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1551 dsl_free_sync(poa->pio, dp, tx->tx_txg, bp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1552 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1553 return (0);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1554 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1555
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1556 static void
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1557 process_old_deadlist(dsl_dataset_t *ds, dsl_dataset_t *ds_prev,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1558 dsl_dataset_t *ds_next, boolean_t after_branch_point, dmu_tx_t *tx)
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1559 {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1560 struct process_old_arg poa = { 0 };
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1561 dsl_pool_t *dp = ds->ds_dir->dd_pool;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1562 objset_t *mos = dp->dp_meta_objset;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1563
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1564 ASSERT(ds->ds_deadlist.dl_oldfmt);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1565 ASSERT(ds_next->ds_deadlist.dl_oldfmt);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1566
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1567 poa.ds = ds;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1568 poa.ds_prev = ds_prev;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1569 poa.after_branch_point = after_branch_point;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1570 poa.pio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1571 VERIFY3U(0, ==, bpobj_iterate(&ds_next->ds_deadlist.dl_bpobj,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1572 process_old_cb, &poa, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1573 VERIFY3U(zio_wait(poa.pio), ==, 0);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1574 ASSERT3U(poa.used, ==, ds->ds_phys->ds_unique_bytes);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1575
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1576 /* change snapused */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1577 dsl_dir_diduse_space(ds->ds_dir, DD_USED_SNAP,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1578 -poa.used, -poa.comp, -poa.uncomp, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1579
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1580 /* swap next's deadlist to our deadlist */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1581 dsl_deadlist_close(&ds->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1582 dsl_deadlist_close(&ds_next->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1583 SWITCH64(ds_next->ds_phys->ds_deadlist_obj,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1584 ds->ds_phys->ds_deadlist_obj);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1585 dsl_deadlist_open(&ds->ds_deadlist, mos, ds->ds_phys->ds_deadlist_obj);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1586 dsl_deadlist_open(&ds_next->ds_deadlist, mos,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1587 ds_next->ds_phys->ds_deadlist_obj);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1588 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1589
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1590 void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1591 dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1592 {
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1593 struct dsl_ds_destroyarg *dsda = arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1594 dsl_dataset_t *ds = dsda->ds;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1595 int err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1596 int after_branch_point = FALSE;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1597 dsl_pool_t *dp = ds->ds_dir->dd_pool;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1598 objset_t *mos = dp->dp_meta_objset;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1599 dsl_dataset_t *ds_prev = NULL;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1600 uint64_t obj;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1601
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1602 ASSERT(ds->ds_owner);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1603 ASSERT(dsda->defer || ds->ds_phys->ds_num_children <= 1);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1604 ASSERT(ds->ds_prev == NULL ||
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1605 ds->ds_prev->ds_phys->ds_next_snap_obj != ds->ds_object);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1606 ASSERT3U(ds->ds_phys->ds_bp.blk_birth, <=, tx->tx_txg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1607
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1608 if (dsda->defer) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1609 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1610 if (ds->ds_userrefs > 0 || ds->ds_phys->ds_num_children > 1) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1611 dmu_buf_will_dirty(ds->ds_dbuf, tx);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1612 ds->ds_phys->ds_flags |= DS_FLAG_DEFER_DESTROY;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1613 return;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1614 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1615 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1616
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1617 /* signal any waiters that this dataset is going away */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1618 mutex_enter(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1619 ds->ds_owner = dsl_reaper;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1620 cv_broadcast(&ds->ds_exclusive_cv);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1621 mutex_exit(&ds->ds_lock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1622
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1623 if (ds->ds_objset) {
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1624 dmu_objset_evict(ds->ds_objset);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1625 ds->ds_objset = NULL;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1626 }
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1627
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1628 /* Remove our reservation */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1629 if (ds->ds_reserved != 0) {
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1630 dsl_prop_setarg_t psa;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1631 uint64_t value = 0;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1632
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1633 dsl_prop_setarg_init_uint64(&psa, "refreservation",
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1634 (ZPROP_SRC_NONE | ZPROP_SRC_LOCAL | ZPROP_SRC_RECEIVED),
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1635 &value);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1636 psa.psa_effective_value = 0; /* predict default value */
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
1637
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1638 dsl_dataset_set_reservation_sync(ds, &psa, tx);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1639 ASSERT3U(ds->ds_reserved, ==, 0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1640 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1641
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1642 ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1643
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1644 dsl_scan_ds_destroyed(ds, tx);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1645
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1646 obj = ds->ds_object;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1647
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1648 if (ds->ds_phys->ds_prev_snap_obj != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1649 if (ds->ds_prev) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1650 ds_prev = ds->ds_prev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1651 } else {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1652 VERIFY(0 == dsl_dataset_hold_obj(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1653 ds->ds_phys->ds_prev_snap_obj, FTAG, &ds_prev));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1654 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1655 after_branch_point =
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1656 (ds_prev->ds_phys->ds_next_snap_obj != obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1657
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1658 dmu_buf_will_dirty(ds_prev->ds_dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1659 if (after_branch_point &&
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1660 ds_prev->ds_phys->ds_next_clones_obj != 0) {
10801
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
1661 remove_from_next_clones(ds_prev, obj, tx);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1662 if (ds->ds_phys->ds_next_snap_obj != 0) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1663 VERIFY(0 == zap_add_int(mos,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1664 ds_prev->ds_phys->ds_next_clones_obj,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1665 ds->ds_phys->ds_next_snap_obj, tx));
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1666 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1667 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1668 if (after_branch_point &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1669 ds->ds_phys->ds_next_snap_obj == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1670 /* This clone is toast. */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1671 ASSERT(ds_prev->ds_phys->ds_num_children > 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1672 ds_prev->ds_phys->ds_num_children--;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1673
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1674 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1675 * If the clone's origin has no other clones, no
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1676 * user holds, and has been marked for deferred
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1677 * deletion, then we should have done the necessary
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1678 * destroy setup for it.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1679 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1680 if (ds_prev->ds_phys->ds_num_children == 1 &&
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1681 ds_prev->ds_userrefs == 0 &&
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1682 DS_IS_DEFER_DESTROY(ds_prev)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1683 ASSERT3P(dsda->rm_origin, !=, NULL);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1684 } else {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1685 ASSERT3P(dsda->rm_origin, ==, NULL);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1686 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1687 } else if (!after_branch_point) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1688 ds_prev->ds_phys->ds_next_snap_obj =
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1689 ds->ds_phys->ds_next_snap_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1690 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1691 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1692
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1693 if (dsl_dataset_is_snapshot(ds)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1694 dsl_dataset_t *ds_next;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1695 uint64_t old_unique;
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1696 uint64_t used = 0, comp = 0, uncomp = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1697
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1698 VERIFY(0 == dsl_dataset_hold_obj(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1699 ds->ds_phys->ds_next_snap_obj, FTAG, &ds_next));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1700 ASSERT3U(ds_next->ds_phys->ds_prev_snap_obj, ==, obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1701
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1702 old_unique = ds_next->ds_phys->ds_unique_bytes;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1703
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1704 dmu_buf_will_dirty(ds_next->ds_dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1705 ds_next->ds_phys->ds_prev_snap_obj =
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1706 ds->ds_phys->ds_prev_snap_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1707 ds_next->ds_phys->ds_prev_snap_txg =
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1708 ds->ds_phys->ds_prev_snap_txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1709 ASSERT3U(ds->ds_phys->ds_prev_snap_txg, ==,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1710 ds_prev ? ds_prev->ds_phys->ds_creation_txg : 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1711
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1712
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1713 if (ds_next->ds_deadlist.dl_oldfmt) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1714 process_old_deadlist(ds, ds_prev, ds_next,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1715 after_branch_point, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1716 } else {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1717 /* Adjust prev's unique space. */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1718 if (ds_prev && !after_branch_point) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1719 dsl_deadlist_space_range(&ds_next->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1720 ds_prev->ds_phys->ds_prev_snap_txg,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1721 ds->ds_phys->ds_prev_snap_txg,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1722 &used, &comp, &uncomp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1723 ds_prev->ds_phys->ds_unique_bytes += used;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1724 }
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1725
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1726 /* Adjust snapused. */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1727 dsl_deadlist_space_range(&ds_next->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1728 ds->ds_phys->ds_prev_snap_txg, UINT64_MAX,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1729 &used, &comp, &uncomp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1730 dsl_dir_diduse_space(ds->ds_dir, DD_USED_SNAP,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1731 -used, -comp, -uncomp, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1732
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1733 /* Move blocks to be freed to pool's free list. */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1734 dsl_deadlist_move_bpobj(&ds_next->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1735 &dp->dp_free_bpobj, ds->ds_phys->ds_prev_snap_txg,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1736 tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1737 dsl_dir_diduse_space(tx->tx_pool->dp_free_dir,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1738 DD_USED_HEAD, used, comp, uncomp, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1739 dsl_dir_dirty(tx->tx_pool->dp_free_dir, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1740
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1741 /* Merge our deadlist into next's and free it. */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1742 dsl_deadlist_merge(&ds_next->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1743 ds->ds_phys->ds_deadlist_obj, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1744 }
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1745 dsl_deadlist_close(&ds->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1746 dsl_deadlist_free(mos, ds->ds_phys->ds_deadlist_obj, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1747
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1748 /* Collapse range in clone heads */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1749 dsl_dataset_remove_clones_key(ds,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1750 ds->ds_phys->ds_creation_txg, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1751
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1752 if (dsl_dataset_is_snapshot(ds_next)) {
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1753 dsl_dataset_t *ds_nextnext;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1754
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1755 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1756 * Update next's unique to include blocks which
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1757 * were previously shared by only this snapshot
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1758 * and it. Those blocks will be born after the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1759 * prev snap and before this snap, and will have
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1760 * died after the next snap and before the one
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1761 * after that (ie. be on the snap after next's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1762 * deadlist).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1763 */
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1764 VERIFY(0 == dsl_dataset_hold_obj(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1765 ds_next->ds_phys->ds_next_snap_obj,
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1766 FTAG, &ds_nextnext));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1767 dsl_deadlist_space_range(&ds_nextnext->ds_deadlist,
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1768 ds->ds_phys->ds_prev_snap_txg,
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1769 ds->ds_phys->ds_creation_txg,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1770 &used, &comp, &uncomp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1771 ds_next->ds_phys->ds_unique_bytes += used;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1772 dsl_dataset_rele(ds_nextnext, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1773 ASSERT3P(ds_next->ds_prev, ==, NULL);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1774
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1775 /* Collapse range in this head. */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1776 dsl_dataset_t *hds;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1777 VERIFY3U(0, ==, dsl_dataset_hold_obj(dp,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1778 ds->ds_dir->dd_phys->dd_head_dataset_obj,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1779 FTAG, &hds));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1780 dsl_deadlist_remove_key(&hds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1781 ds->ds_phys->ds_creation_txg, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1782 dsl_dataset_rele(hds, FTAG);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1783
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1784 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1785 ASSERT3P(ds_next->ds_prev, ==, ds);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1786 dsl_dataset_drop_ref(ds_next->ds_prev, ds_next);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1787 ds_next->ds_prev = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1788 if (ds_prev) {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1789 VERIFY(0 == dsl_dataset_get_ref(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1790 ds->ds_phys->ds_prev_snap_obj,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1791 ds_next, &ds_next->ds_prev));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1792 }
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1793
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1794 dsl_dataset_recalc_head_uniq(ds_next);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1795
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1796 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1797 * Reduce the amount of our unconsmed refreservation
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1798 * being charged to our parent by the amount of
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1799 * new unique data we have gained.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1800 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1801 if (old_unique < ds_next->ds_reserved) {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1802 int64_t mrsdelta;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1803 uint64_t new_unique =
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1804 ds_next->ds_phys->ds_unique_bytes;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1805
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1806 ASSERT(old_unique <= new_unique);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1807 mrsdelta = MIN(new_unique - old_unique,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1808 ds_next->ds_reserved - old_unique);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1809 dsl_dir_diduse_space(ds->ds_dir,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1810 DD_USED_REFRSRV, -mrsdelta, 0, 0, tx);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1811 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1812 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1813 dsl_dataset_rele(ds_next, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1814 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1815 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1816 * There's no next snapshot, so this is a head dataset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1817 * Destroy the deadlist. Unless it's a clone, the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1818 * deadlist should be empty. (If it's a clone, it's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1819 * safe to ignore the deadlist contents.)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1820 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1821 struct killarg ka;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1822
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1823 dsl_deadlist_close(&ds->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1824 dsl_deadlist_free(mos, ds->ds_phys->ds_deadlist_obj, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1825 ds->ds_phys->ds_deadlist_obj = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1826
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1827 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1828 * Free everything that we point to (that's born after
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1829 * the previous snapshot, if we are a clone)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1830 *
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1831 * NB: this should be very quick, because we already
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1832 * freed all the objects in open context.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1833 */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1834 ka.ds = ds;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1835 ka.tx = tx;
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
1836 err = traverse_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
1837 TRAVERSE_POST, kill_blkptr, &ka);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1838 ASSERT3U(err, ==, 0);
9390
887948510f80 6826861 assertion failed in dsl_dataset_destroy_sync when "zfs destroy" old fs
Chris Kirby <chris.kirby@sun.com>
parents: 8779
diff changeset
1839 ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1840 ds->ds_phys->ds_unique_bytes == 0);
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
1841
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
1842 if (ds->ds_prev != NULL) {
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1843 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1844 VERIFY3U(0, ==, zap_remove_int(mos,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1845 ds->ds_prev->ds_dir->dd_phys->dd_clones,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1846 ds->ds_object, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
1847 }
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
1848 dsl_dataset_rele(ds->ds_prev, ds);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
1849 ds->ds_prev = ds_prev = NULL;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
1850 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1851 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1852
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1853 if (ds->ds_dir->dd_phys->dd_head_dataset_obj == ds->ds_object) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1854 /* Erase the link in the dir */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1855 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1856 ds->ds_dir->dd_phys->dd_head_dataset_obj = 0;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1857 ASSERT(ds->ds_phys->ds_snapnames_zapobj != 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1858 err = zap_destroy(mos, ds->ds_phys->ds_snapnames_zapobj, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1859 ASSERT(err == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1860 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1861 /* remove from snapshot namespace */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1862 dsl_dataset_t *ds_head;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1863 ASSERT(ds->ds_phys->ds_snapnames_zapobj == 0);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1864 VERIFY(0 == dsl_dataset_hold_obj(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1865 ds->ds_dir->dd_phys->dd_head_dataset_obj, FTAG, &ds_head));
2207
47efcb3433a7 6439370 assertion failures possible in dsl_dataset_destroy_sync()
ahrens
parents: 2199
diff changeset
1866 VERIFY(0 == dsl_dataset_get_snapname(ds));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1867 #ifdef ZFS_DEBUG
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1868 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1869 uint64_t val;
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
1870
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1871 err = dsl_dataset_snap_lookup(ds_head,
6492
903545192033 6654808 FIGNORECASE lookups in a zfs xattr dir don't provide 'realname' data
timh
parents: 6047
diff changeset
1872 ds->ds_snapname, &val);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1873 ASSERT3U(err, ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1874 ASSERT3U(val, ==, obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1875 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1876 #endif
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1877 err = dsl_dataset_snap_remove(ds_head, ds->ds_snapname, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1878 ASSERT(err == 0);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1879 dsl_dataset_rele(ds_head, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1880 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1881
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1882 if (ds_prev && ds->ds_prev != ds_prev)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1883 dsl_dataset_rele(ds_prev, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1884
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4967
diff changeset
1885 spa_prop_clear_bootfs(dp->dp_spa, ds->ds_object, tx);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1886 spa_history_log_internal(LOG_DS_DESTROY, dp->dp_spa, tx,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1887 "dataset = %llu", ds->ds_object);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
1888
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1889 if (ds->ds_phys->ds_next_clones_obj != 0) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1890 uint64_t count;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1891 ASSERT(0 == zap_count(mos,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1892 ds->ds_phys->ds_next_clones_obj, &count) && count == 0);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1893 VERIFY(0 == dmu_object_free(mos,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1894 ds->ds_phys->ds_next_clones_obj, tx));
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1895 }
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1896 if (ds->ds_phys->ds_props_obj != 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
1897 VERIFY(0 == zap_destroy(mos, ds->ds_phys->ds_props_obj, tx));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1898 if (ds->ds_phys->ds_userrefs_obj != 0)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1899 VERIFY(0 == zap_destroy(mos, ds->ds_phys->ds_userrefs_obj, tx));
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1900 dsl_dir_close(ds->ds_dir, ds);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1901 ds->ds_dir = NULL;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1902 dsl_dataset_drain_refs(ds, tag);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1903 VERIFY(0 == dmu_object_free(mos, obj, tx));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1904
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1905 if (dsda->rm_origin) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1906 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1907 * Remove the origin of the clone we just destroyed.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1908 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1909 struct dsl_ds_destroyarg ndsda = {0};
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1910
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
1911 ndsda.ds = dsda->rm_origin;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1912 dsl_dataset_destroy_sync(&ndsda, tag, tx);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
1913 }
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1914 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1915
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1916 static int
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1917 dsl_dataset_snapshot_reserve_space(dsl_dataset_t *ds, dmu_tx_t *tx)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1918 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1919 uint64_t asize;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1920
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1921 if (!dmu_tx_is_syncing(tx))
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1922 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1923
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1924 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1925 * If there's an fs-only reservation, any blocks that might become
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1926 * owned by the snapshot dataset must be accommodated by space
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1927 * outside of the reservation.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1928 */
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1929 ASSERT(ds->ds_reserved == 0 || DS_UNIQUE_IS_ACCURATE(ds));
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1930 asize = MIN(ds->ds_phys->ds_unique_bytes, ds->ds_reserved);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1931 if (asize > dsl_dir_space_available(ds->ds_dir, NULL, 0, FALSE))
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1932 return (ENOSPC);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1933
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1934 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1935 * Propogate any reserved space for this snapshot to other
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1936 * snapshot checks in this sync group.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1937 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1938 if (asize > 0)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1939 dsl_dir_willuse_space(ds->ds_dir, asize, tx);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1940
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1941 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1942 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1943
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1944 int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1945 dsl_dataset_snapshot_check(void *arg1, void *arg2, dmu_tx_t *tx)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1946 {
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1947 dsl_dataset_t *ds = arg1;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1948 const char *snapname = arg2;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1949 int err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1950 uint64_t value;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1951
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1952 /*
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1953 * We don't allow multiple snapshots of the same txg. If there
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1954 * is already one, try again.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1955 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1956 if (ds->ds_phys->ds_prev_snap_txg >= tx->tx_txg)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1957 return (EAGAIN);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1958
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1959 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1960 * Check for conflicting name snapshot name.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1961 */
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
1962 err = dsl_dataset_snap_lookup(ds, snapname, &value);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1963 if (err == 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1964 return (EEXIST);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1965 if (err != ENOENT)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1966 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1967
3978
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1968 /*
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1969 * Check that the dataset's name is not too long. Name consists
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1970 * of the dataset's length + 1 for the @-sign + snapshot name's length
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1971 */
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1972 if (dsl_dataset_namelen(ds) + 1 + strlen(snapname) >= MAXNAMELEN)
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1973 return (ENAMETOOLONG);
2dd668007b7a 6533813 recursive snapshotting resulted in a bad stack overflow
mmusante
parents: 3912
diff changeset
1974
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1975 err = dsl_dataset_snapshot_reserve_space(ds, tx);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1976 if (err)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1977 return (err);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
1978
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1979 ds->ds_trysnap_txg = tx->tx_txg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1980 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1981 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1982
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1983 void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
1984 dsl_dataset_snapshot_sync(void *arg1, void *arg2, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1985 {
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
1986 dsl_dataset_t *ds = arg1;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1987 const char *snapname = arg2;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1988 dsl_pool_t *dp = ds->ds_dir->dd_pool;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1989 dmu_buf_t *dbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1990 dsl_dataset_phys_t *dsphys;
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1991 uint64_t dsobj, crtxg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1992 objset_t *mos = dp->dp_meta_objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1993 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1994
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1995 ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1996
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1997 /*
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1998 * The origin's ds_creation_txg has to be < TXG_INITIAL
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
1999 */
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2000 if (strcmp(snapname, ORIGIN_DIR_NAME) == 0)
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2001 crtxg = 1;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2002 else
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2003 crtxg = tx->tx_txg;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2004
928
36d72fe4da29 6349314 dmu_object_type names incorrect for DSL Directories and DSL Datasets
tabriz
parents: 885
diff changeset
2005 dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0,
36d72fe4da29 6349314 dmu_object_type names incorrect for DSL Directories and DSL Datasets
tabriz
parents: 885
diff changeset
2006 DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
2007 VERIFY(0 == dmu_bonus_hold(mos, dsobj, FTAG, &dbuf));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2008 dmu_buf_will_dirty(dbuf, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2009 dsphys = dbuf->db_data;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2010 bzero(dsphys, sizeof (dsl_dataset_phys_t));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2011 dsphys->ds_dir_obj = ds->ds_dir->dd_object;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2012 dsphys->ds_fsid_guid = unique_create();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2013 (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2014 sizeof (dsphys->ds_guid));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2015 dsphys->ds_prev_snap_obj = ds->ds_phys->ds_prev_snap_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2016 dsphys->ds_prev_snap_txg = ds->ds_phys->ds_prev_snap_txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2017 dsphys->ds_next_snap_obj = ds->ds_object;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2018 dsphys->ds_num_children = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2019 dsphys->ds_creation_time = gethrestime_sec();
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2020 dsphys->ds_creation_txg = crtxg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2021 dsphys->ds_deadlist_obj = ds->ds_phys->ds_deadlist_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2022 dsphys->ds_used_bytes = ds->ds_phys->ds_used_bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2023 dsphys->ds_compressed_bytes = ds->ds_phys->ds_compressed_bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2024 dsphys->ds_uncompressed_bytes = ds->ds_phys->ds_uncompressed_bytes;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2025 dsphys->ds_flags = ds->ds_phys->ds_flags;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2026 dsphys->ds_bp = ds->ds_phys->ds_bp;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
2027 dmu_buf_rele(dbuf, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2028
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2029 ASSERT3U(ds->ds_prev != 0, ==, ds->ds_phys->ds_prev_snap_obj != 0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2030 if (ds->ds_prev) {
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2031 uint64_t next_clones_obj =
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2032 ds->ds_prev->ds_phys->ds_next_clones_obj;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2033 ASSERT(ds->ds_prev->ds_phys->ds_next_snap_obj ==
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2034 ds->ds_object ||
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2035 ds->ds_prev->ds_phys->ds_num_children > 1);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2036 if (ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2037 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2038 ASSERT3U(ds->ds_phys->ds_prev_snap_txg, ==,
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2039 ds->ds_prev->ds_phys->ds_creation_txg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2040 ds->ds_prev->ds_phys->ds_next_snap_obj = dsobj;
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2041 } else if (next_clones_obj != 0) {
10801
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
2042 remove_from_next_clones(ds->ds_prev,
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
2043 dsphys->ds_next_snap_obj, tx);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2044 VERIFY3U(0, ==, zap_add_int(mos,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2045 next_clones_obj, dsobj, tx));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2046 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2047 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2048
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2049 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2050 * If we have a reference-reservation on this dataset, we will
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2051 * need to increase the amount of refreservation being charged
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2052 * since our unique space is going to zero.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2053 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2054 if (ds->ds_reserved) {
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2055 int64_t delta;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2056 ASSERT(DS_UNIQUE_IS_ACCURATE(ds));
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2057 delta = MIN(ds->ds_phys->ds_unique_bytes, ds->ds_reserved);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2058 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV,
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2059 delta, 0, 0, tx);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2060 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2061
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2062 dmu_buf_will_dirty(ds->ds_dbuf, tx);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2063 zfs_dbgmsg("taking snapshot %s@%s/%llu; newkey=%llu",
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2064 ds->ds_dir->dd_myname, snapname, dsobj,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2065 ds->ds_phys->ds_prev_snap_txg);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2066 ds->ds_phys->ds_deadlist_obj = dsl_deadlist_clone(&ds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2067 UINT64_MAX, ds->ds_phys->ds_prev_snap_obj, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2068 dsl_deadlist_close(&ds->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2069 dsl_deadlist_open(&ds->ds_deadlist, mos, ds->ds_phys->ds_deadlist_obj);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2070 dsl_deadlist_add_key(&ds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2071 ds->ds_phys->ds_prev_snap_txg, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2072
5712
81f1af42bafc 6628232 zfs snapshot -r is very slow, causes systemic slowdown
ahrens
parents: 5569
diff changeset
2073 ASSERT3U(ds->ds_phys->ds_prev_snap_txg, <, tx->tx_txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2074 ds->ds_phys->ds_prev_snap_obj = dsobj;
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2075 ds->ds_phys->ds_prev_snap_txg = crtxg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2076 ds->ds_phys->ds_unique_bytes = 0;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2077 if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2078 ds->ds_phys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE;
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2079
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2080 err = zap_add(mos, ds->ds_phys->ds_snapnames_zapobj,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2081 snapname, 8, 1, &dsobj, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2082 ASSERT(err == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2083
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2084 if (ds->ds_prev)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2085 dsl_dataset_drop_ref(ds->ds_prev, ds);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2086 VERIFY(0 == dsl_dataset_get_ref(dp,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2087 ds->ds_phys->ds_prev_snap_obj, ds, &ds->ds_prev));
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2088
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2089 dsl_scan_ds_snapshotted(ds, tx);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2090
10373
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10342
diff changeset
2091 dsl_dir_snap_cmtime_update(ds->ds_dir);
bcf97ee54990 6395956 snapshot dir needs real c/mtime
Chris Kirby <chris.kirby@sun.com>
parents: 10342
diff changeset
2092
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2093 spa_history_log_internal(LOG_DS_SNAPSHOT, dp->dp_spa, tx,
4603
c7840c367d00 6494569 zfs recv -d pool/<doesn't exist> core dumps for top-level filesystem backups
ahrens
parents: 4577
diff changeset
2094 "dataset = %llu", dsobj);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2095 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2096
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2097 void
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
2098 dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2099 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2100 ASSERT(dmu_tx_is_syncing(tx));
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
2101 ASSERT(ds->ds_objset != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2102 ASSERT(ds->ds_phys->ds_next_snap_obj == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2103
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2104 /*
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2105 * in case we had to change ds_fsid_guid when we opened it,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2106 * sync it out now.
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2107 */
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2108 dmu_buf_will_dirty(ds->ds_dbuf, tx);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2109 ds->ds_phys->ds_fsid_guid = ds->ds_fsid_guid;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2110
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2111 dsl_dir_dirty(ds->ds_dir, tx);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
2112 dmu_objset_sync(ds->ds_objset, zio, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2113 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2114
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2115 void
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2116 dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2117 {
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2118 uint64_t refd, avail, uobjs, aobjs;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2119
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2120 dsl_dir_stats(ds->ds_dir, nv);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2121
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2122 dsl_dataset_space(ds, &refd, &avail, &uobjs, &aobjs);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2123 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_AVAILABLE, avail);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2124 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFERENCED, refd);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2125
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2126 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_CREATION,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2127 ds->ds_phys->ds_creation_time);
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2128 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_CREATETXG,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2129 ds->ds_phys->ds_creation_txg);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2130 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFQUOTA,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2131 ds->ds_quota);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2132 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFRESERVATION,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2133 ds->ds_reserved);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6502
diff changeset
2134 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_GUID,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6502
diff changeset
2135 ds->ds_phys->ds_guid);
10575
2a8816c5173b 6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10385
diff changeset
2136 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_UNIQUE,
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2137 ds->ds_phys->ds_unique_bytes);
10575
2a8816c5173b 6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10385
diff changeset
2138 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_OBJSETID,
2a8816c5173b 6882196 resource.* events shouldn't be posted during spa_tryimport()
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10385
diff changeset
2139 ds->ds_object);
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
2140 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USERREFS,
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
2141 ds->ds_userrefs);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
2142 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_DEFER_DESTROY,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
2143 DS_IS_DEFER_DESTROY(ds) ? 1 : 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2144
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2145 if (ds->ds_phys->ds_next_snap_obj) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2146 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2147 * This is a snapshot; override the dd's space used with
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2148 * our unique space and compression ratio.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2149 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2150 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USED,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2151 ds->ds_phys->ds_unique_bytes);
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2152 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2153 ds->ds_phys->ds_compressed_bytes == 0 ? 100 :
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2154 (ds->ds_phys->ds_uncompressed_bytes * 100 /
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2155 ds->ds_phys->ds_compressed_bytes));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2156 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2157 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2158
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2159 void
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2160 dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2161 {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2162 stat->dds_creation_txg = ds->ds_phys->ds_creation_txg;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2163 stat->dds_inconsistent = ds->ds_phys->ds_flags & DS_FLAG_INCONSISTENT;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2164 stat->dds_guid = ds->ds_phys->ds_guid;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2165 if (ds->ds_phys->ds_next_snap_obj) {
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2166 stat->dds_is_snapshot = B_TRUE;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2167 stat->dds_num_clones = ds->ds_phys->ds_num_children - 1;
8228
51e9ca9ee3a5 6572357 libzfs should do more to avoid mnttab lookups
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 7837
diff changeset
2168 } else {
51e9ca9ee3a5 6572357 libzfs should do more to avoid mnttab lookups
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 7837
diff changeset
2169 stat->dds_is_snapshot = B_FALSE;
51e9ca9ee3a5 6572357 libzfs should do more to avoid mnttab lookups
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 7837
diff changeset
2170 stat->dds_num_clones = 0;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2171 }
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2172
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2173 /* clone origin is really a dsl_dir thing... */
5446
51fbc14b301d 6421210 zfs rollback without unmounting
ahrens
parents: 5383
diff changeset
2174 rw_enter(&ds->ds_dir->dd_pool->dp_config_rwlock, RW_READER);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2175 if (dsl_dir_is_clone(ds->ds_dir)) {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2176 dsl_dataset_t *ods;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2177
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2178 VERIFY(0 == dsl_dataset_get_ref(ds->ds_dir->dd_pool,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2179 ds->ds_dir->dd_phys->dd_origin_obj, FTAG, &ods));
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2180 dsl_dataset_name(ods, stat->dds_origin);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2181 dsl_dataset_drop_ref(ods, FTAG);
8228
51e9ca9ee3a5 6572357 libzfs should do more to avoid mnttab lookups
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 7837
diff changeset
2182 } else {
51e9ca9ee3a5 6572357 libzfs should do more to avoid mnttab lookups
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 7837
diff changeset
2183 stat->dds_origin[0] = '\0';
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2184 }
5446
51fbc14b301d 6421210 zfs rollback without unmounting
ahrens
parents: 5383
diff changeset
2185 rw_exit(&ds->ds_dir->dd_pool->dp_config_rwlock);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2186 }
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2187
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2188 uint64_t
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2189 dsl_dataset_fsid_guid(dsl_dataset_t *ds)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2190 {
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4603
diff changeset
2191 return (ds->ds_fsid_guid);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2192 }
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2193
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2194 void
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2195 dsl_dataset_space(dsl_dataset_t *ds,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2196 uint64_t *refdbytesp, uint64_t *availbytesp,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2197 uint64_t *usedobjsp, uint64_t *availobjsp)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2198 {
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2199 *refdbytesp = ds->ds_phys->ds_used_bytes;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2200 *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2201 if (ds->ds_reserved > ds->ds_phys->ds_unique_bytes)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2202 *availbytesp += ds->ds_reserved - ds->ds_phys->ds_unique_bytes;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2203 if (ds->ds_quota != 0) {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2204 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2205 * Adjust available bytes according to refquota
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2206 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2207 if (*refdbytesp < ds->ds_quota)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2208 *availbytesp = MIN(*availbytesp,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2209 ds->ds_quota - *refdbytesp);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2210 else
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2211 *availbytesp = 0;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
2212 }
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2213 *usedobjsp = ds->ds_phys->ds_bp.blk_fill;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
2214 *availobjsp = DN_MAX_OBJECT - *usedobjsp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2215 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2216
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2217 boolean_t
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2218 dsl_dataset_modified_since_lastsnap(dsl_dataset_t *ds)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2219 {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2220 dsl_pool_t *dp = ds->ds_dir->dd_pool;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2221
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2222 ASSERT(RW_LOCK_HELD(&dp->dp_config_rwlock) ||
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2223 dsl_pool_sync_context(dp));
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2224 if (ds->ds_prev == NULL)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2225 return (B_FALSE);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2226 if (ds->ds_phys->ds_bp.blk_birth >
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2227 ds->ds_prev->ds_phys->ds_creation_txg)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2228 return (B_TRUE);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2229 return (B_FALSE);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2230 }
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2231
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2232 /* ARGSUSED */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2233 static int
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2234 dsl_dataset_snapshot_rename_check(void *arg1, void *arg2, dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2235 {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2236 dsl_dataset_t *ds = arg1;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2237 char *newsnapname = arg2;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2238 dsl_dir_t *dd = ds->ds_dir;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2239 dsl_dataset_t *hds;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2240 uint64_t val;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2241 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2242
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2243 err = dsl_dataset_hold_obj(dd->dd_pool,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2244 dd->dd_phys->dd_head_dataset_obj, FTAG, &hds);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2245 if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2246 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2247
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2248 /* new name better not be in use */
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2249 err = dsl_dataset_snap_lookup(hds, newsnapname, &val);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2250 dsl_dataset_rele(hds, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2251
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2252 if (err == 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2253 err = EEXIST;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2254 else if (err == ENOENT)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2255 err = 0;
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2256
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2257 /* dataset name + 1 for the "@" + the new snapshot name must fit */
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2258 if (dsl_dir_namelen(ds->ds_dir) + 1 + strlen(newsnapname) >= MAXNAMELEN)
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2259 err = ENAMETOOLONG;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2260
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2261 return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2262 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2263
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2264 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2265 dsl_dataset_snapshot_rename_sync(void *arg1, void *arg2, dmu_tx_t *tx)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2266 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2267 dsl_dataset_t *ds = arg1;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2268 const char *newsnapname = arg2;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2269 dsl_dir_t *dd = ds->ds_dir;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2270 objset_t *mos = dd->dd_pool->dp_meta_objset;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2271 dsl_dataset_t *hds;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2272 int err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2273
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2274 ASSERT(ds->ds_phys->ds_next_snap_obj != 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2275
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2276 VERIFY(0 == dsl_dataset_hold_obj(dd->dd_pool,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2277 dd->dd_phys->dd_head_dataset_obj, FTAG, &hds));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2278
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2279 VERIFY(0 == dsl_dataset_get_snapname(ds));
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2280 err = dsl_dataset_snap_remove(hds, ds->ds_snapname, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2281 ASSERT3U(err, ==, 0);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2282 mutex_enter(&ds->ds_lock);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2283 (void) strcpy(ds->ds_snapname, newsnapname);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2284 mutex_exit(&ds->ds_lock);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2285 err = zap_add(mos, hds->ds_phys->ds_snapnames_zapobj,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2286 ds->ds_snapname, 8, 1, &ds->ds_object, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2287 ASSERT3U(err, ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2288
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2289 spa_history_log_internal(LOG_DS_RENAME, dd->dd_pool->dp_spa, tx,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2290 "dataset = %llu", ds->ds_object);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2291 dsl_dataset_rele(hds, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2292 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2293
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2294 struct renamesnaparg {
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2295 dsl_sync_task_group_t *dstg;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2296 char failed[MAXPATHLEN];
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2297 char *oldsnap;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2298 char *newsnap;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2299 };
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2300
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2301 static int
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2302 dsl_snapshot_rename_one(const char *name, void *arg)
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2303 {
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2304 struct renamesnaparg *ra = arg;
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2305 dsl_dataset_t *ds = NULL;
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2306 char *snapname;
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2307 int err;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2308
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2309 snapname = kmem_asprintf("%s@%s", name, ra->oldsnap);
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2310 (void) strlcpy(ra->failed, snapname, sizeof (ra->failed));
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2311
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2312 /*
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2313 * For recursive snapshot renames the parent won't be changing
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2314 * so we just pass name for both the to/from argument.
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2315 */
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2316 err = zfs_secpolicy_rename_perms(snapname, snapname, CRED());
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2317 if (err != 0) {
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2318 strfree(snapname);
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2319 return (err == ENOENT ? 0 : err);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2320 }
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2321
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2322 #ifdef _KERNEL
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2323 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2324 * For all filesystems undergoing rename, we'll need to unmount it.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2325 */
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2326 (void) zfs_unmount_snap(snapname, NULL);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2327 #endif
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2328 err = dsl_dataset_hold(snapname, ra->dstg, &ds);
11609
3b5da7ebb54d 6920880 assertion failure in dbuf_write_ready()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11546
diff changeset
2329 strfree(snapname);
3b5da7ebb54d 6920880 assertion failure in dbuf_write_ready()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11546
diff changeset
2330 if (err != 0)
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2331 return (err == ENOENT ? 0 : err);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2332
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2333 dsl_sync_task_create(ra->dstg, dsl_dataset_snapshot_rename_check,
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2334 dsl_dataset_snapshot_rename_sync, ds, ra->newsnap, 0);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2335
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2336 return (0);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2337 }
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2338
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2339 static int
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2340 dsl_recursive_rename(char *oldname, const char *newname)
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2341 {
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2342 int err;
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2343 struct renamesnaparg *ra;
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2344 dsl_sync_task_t *dst;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2345 spa_t *spa;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2346 char *cp, *fsname = spa_strdup(oldname);
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2347 int len = strlen(oldname) + 1;
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2348
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2349 /* truncate the snapshot name to get the fsname */
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2350 cp = strchr(fsname, '@');
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2351 *cp = '\0';
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2352
4603
c7840c367d00 6494569 zfs recv -d pool/<doesn't exist> core dumps for top-level filesystem backups
ahrens
parents: 4577
diff changeset
2353 err = spa_open(fsname, &spa, FTAG);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2354 if (err) {
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2355 kmem_free(fsname, len);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2356 return (err);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2357 }
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2358 ra = kmem_alloc(sizeof (struct renamesnaparg), KM_SLEEP);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2359 ra->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2360
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2361 ra->oldsnap = strchr(oldname, '@') + 1;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2362 ra->newsnap = strchr(newname, '@') + 1;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2363 *ra->failed = '\0';
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2364
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2365 err = dmu_objset_find(fsname, dsl_snapshot_rename_one, ra,
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2366 DS_FIND_CHILDREN);
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2367 kmem_free(fsname, len);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2368
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2369 if (err == 0) {
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2370 err = dsl_sync_task_group_wait(ra->dstg);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2371 }
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2372
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2373 for (dst = list_head(&ra->dstg->dstg_tasks); dst;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2374 dst = list_next(&ra->dstg->dstg_tasks, dst)) {
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2375 dsl_dataset_t *ds = dst->dst_arg1;
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2376 if (dst->dst_err) {
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2377 dsl_dir_name(ds->ds_dir, ra->failed);
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2378 (void) strlcat(ra->failed, "@", sizeof (ra->failed));
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2379 (void) strlcat(ra->failed, ra->newsnap,
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2380 sizeof (ra->failed));
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2381 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2382 dsl_dataset_rele(ds, ra->dstg);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2383 }
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2384
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2385 if (err)
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2386 (void) strlcpy(oldname, ra->failed, sizeof (ra->failed));
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2387
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2388 dsl_sync_task_group_destroy(ra->dstg);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2389 kmem_free(ra, sizeof (struct renamesnaparg));
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2390 spa_close(spa, FTAG);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2391 return (err);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2392 }
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2393
4569
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2394 static int
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
2395 dsl_valid_rename(const char *oldname, void *arg)
4569
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2396 {
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2397 int delta = *(int *)arg;
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2398
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2399 if (strlen(oldname) + delta >= MAXNAMELEN)
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2400 return (ENAMETOOLONG);
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2401
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2402 return (0);
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2403 }
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2404
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2405 #pragma weak dmu_objset_rename = dsl_dataset_rename
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2406 int
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2407 dsl_dataset_rename(char *oldname, const char *newname, boolean_t recursive)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2408 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2409 dsl_dir_t *dd;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2410 dsl_dataset_t *ds;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2411 const char *tail;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2412 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2413
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2414 err = dsl_dir_open(oldname, FTAG, &dd, &tail);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
2415 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
2416 return (err);
11701
6f890435df16 6915532 snapshot related activity causes akd to hang
Sanjeev Bagewadi <Sanjeev.Bagewadi@Sun.COM>
parents: 11609
diff changeset
2417
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2418 if (tail == NULL) {
4569
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2419 int delta = strlen(newname) - strlen(oldname);
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2420
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2421 /* if we're growing, validate child name lengths */
4569
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2422 if (delta > 0)
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2423 err = dmu_objset_find(oldname, dsl_valid_rename,
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2424 &delta, DS_FIND_CHILDREN | DS_FIND_SNAPSHOTS);
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2425
11823
c756cd80d532 6930022 zfs rename of non-shapshot is slower than necessary
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11701
diff changeset
2426 if (err == 0)
4569
e80d40447f27 6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
mmusante
parents: 4543
diff changeset
2427 err = dsl_dir_rename(dd, newname);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2428 dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2429 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2430 }
11701
6f890435df16 6915532 snapshot related activity causes akd to hang
Sanjeev Bagewadi <Sanjeev.Bagewadi@Sun.COM>
parents: 11609
diff changeset
2431
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2432 if (tail[0] != '@') {
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2433 /* the name ended in a nonexistent component */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2434 dsl_dir_close(dd, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2435 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2436 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2437
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2438 dsl_dir_close(dd, FTAG);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2439
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2440 /* new name must be snapshot in same filesystem */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2441 tail = strchr(newname, '@');
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2442 if (tail == NULL)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2443 return (EINVAL);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2444 tail++;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2445 if (strncmp(oldname, newname, tail - newname) != 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2446 return (EXDEV);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2447
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2448 if (recursive) {
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2449 err = dsl_recursive_rename(oldname, newname);
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2450 } else {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2451 err = dsl_dataset_hold(oldname, FTAG, &ds);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2452 if (err)
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2453 return (err);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2454
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2455 err = dsl_sync_task_do(ds->ds_dir->dd_pool,
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2456 dsl_dataset_snapshot_rename_check,
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2457 dsl_dataset_snapshot_rename_sync, ds, (char *)tail, 1);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2458
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2459 dsl_dataset_rele(ds, FTAG);
4007
c6f5c6753018 PSARC 2007/142 zfs rename -r
mmusante
parents: 3978
diff changeset
2460 }
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2461
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2462 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2463 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2464
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2465 struct promotenode {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2466 list_node_t link;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2467 dsl_dataset_t *ds;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2468 };
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2469
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2470 struct promotearg {
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2471 list_t shared_snaps, origin_snaps, clone_snaps;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2472 dsl_dataset_t *origin_origin;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2473 uint64_t used, comp, uncomp, unique, cloneusedsnap, originusedsnap;
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2474 char *err_ds;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2475 };
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2476
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2477 static int snaplist_space(list_t *l, uint64_t mintxg, uint64_t *spacep);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2478 static boolean_t snaplist_unstable(list_t *l);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2479
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2480 static int
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2481 dsl_dataset_promote_check(void *arg1, void *arg2, dmu_tx_t *tx)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2482 {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2483 dsl_dataset_t *hds = arg1;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2484 struct promotearg *pa = arg2;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2485 struct promotenode *snap = list_head(&pa->shared_snaps);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2486 dsl_dataset_t *origin_ds = snap->ds;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2487 int err;
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2488 uint64_t unused;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2489
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2490 /* Check that it is a real clone */
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2491 if (!dsl_dir_is_clone(hds->ds_dir))
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2492 return (EINVAL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2493
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2494 /* Since this is so expensive, don't do the preliminary check */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2495 if (!dmu_tx_is_syncing(tx))
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2496 return (0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2497
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2498 if (hds->ds_phys->ds_flags & DS_FLAG_NOPROMOTE)
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2499 return (EXDEV);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2500
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2501 /* compute origin's new unique space */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2502 snap = list_tail(&pa->clone_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2503 ASSERT3U(snap->ds->ds_phys->ds_prev_snap_obj, ==, origin_ds->ds_object);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2504 dsl_deadlist_space_range(&snap->ds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2505 origin_ds->ds_phys->ds_prev_snap_txg, UINT64_MAX,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2506 &pa->unique, &unused, &unused);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2507
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2508 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2509 * Walk the snapshots that we are moving
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2510 *
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2511 * Compute space to transfer. Consider the incremental changes
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2512 * to used for each snapshot:
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2513 * (my used) = (prev's used) + (blocks born) - (blocks killed)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2514 * So each snapshot gave birth to:
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2515 * (blocks born) = (my used) - (prev's used) + (blocks killed)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2516 * So a sequence would look like:
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2517 * (uN - u(N-1) + kN) + ... + (u1 - u0 + k1) + (u0 - 0 + k0)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2518 * Which simplifies to:
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2519 * uN + kN + kN-1 + ... + k1 + k0
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2520 * Note however, if we stop before we reach the ORIGIN we get:
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2521 * uN + kN + kN-1 + ... + kM - uM-1
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2522 */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2523 pa->used = origin_ds->ds_phys->ds_used_bytes;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2524 pa->comp = origin_ds->ds_phys->ds_compressed_bytes;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2525 pa->uncomp = origin_ds->ds_phys->ds_uncompressed_bytes;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2526 for (snap = list_head(&pa->shared_snaps); snap;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2527 snap = list_next(&pa->shared_snaps, snap)) {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2528 uint64_t val, dlused, dlcomp, dluncomp;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2529 dsl_dataset_t *ds = snap->ds;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2530
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2531 /* Check that the snapshot name does not conflict */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2532 VERIFY(0 == dsl_dataset_get_snapname(ds));
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2533 err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2534 if (err == 0) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2535 err = EEXIST;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2536 goto out;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2537 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2538 if (err != ENOENT)
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2539 goto out;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2540
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2541 /* The very first snapshot does not have a deadlist */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2542 if (ds->ds_phys->ds_prev_snap_obj == 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2543 continue;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2544
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2545 dsl_deadlist_space(&ds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2546 &dlused, &dlcomp, &dluncomp);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2547 pa->used += dlused;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2548 pa->comp += dlcomp;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2549 pa->uncomp += dluncomp;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2550 }
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2551
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2552 /*
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2553 * If we are a clone of a clone then we never reached ORIGIN,
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2554 * so we need to subtract out the clone origin's used space.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2555 */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2556 if (pa->origin_origin) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2557 pa->used -= pa->origin_origin->ds_phys->ds_used_bytes;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2558 pa->comp -= pa->origin_origin->ds_phys->ds_compressed_bytes;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2559 pa->uncomp -= pa->origin_origin->ds_phys->ds_uncompressed_bytes;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2560 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2561
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2562 /* Check that there is enough space here */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2563 err = dsl_dir_transfer_possible(origin_ds->ds_dir, hds->ds_dir,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2564 pa->used);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2565 if (err)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2566 return (err);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2567
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2568 /*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2569 * Compute the amounts of space that will be used by snapshots
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2570 * after the promotion (for both origin and clone). For each,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2571 * it is the amount of space that will be on all of their
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2572 * deadlists (that was not born before their new origin).
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2573 */
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2574 if (hds->ds_dir->dd_phys->dd_flags & DD_FLAG_USED_BREAKDOWN) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2575 uint64_t space;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2576
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2577 /*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2578 * Note, typically this will not be a clone of a clone,
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2579 * so dd_origin_txg will be < TXG_INITIAL, so
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2580 * these snaplist_space() -> dsl_deadlist_space_range()
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2581 * calls will be fast because they do not have to
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2582 * iterate over all bps.
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2583 */
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2584 snap = list_head(&pa->origin_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2585 err = snaplist_space(&pa->shared_snaps,
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2586 snap->ds->ds_dir->dd_origin_txg, &pa->cloneusedsnap);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2587 if (err)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2588 return (err);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2589
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2590 err = snaplist_space(&pa->clone_snaps,
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2591 snap->ds->ds_dir->dd_origin_txg, &space);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2592 if (err)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2593 return (err);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2594 pa->cloneusedsnap += space;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2595 }
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2596 if (origin_ds->ds_dir->dd_phys->dd_flags & DD_FLAG_USED_BREAKDOWN) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2597 err = snaplist_space(&pa->origin_snaps,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2598 origin_ds->ds_phys->ds_creation_txg, &pa->originusedsnap);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2599 if (err)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2600 return (err);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2601 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2602
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2603 return (0);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2604 out:
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2605 pa->err_ds = snap->ds->ds_snapname;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2606 return (err);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2607 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2608
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2609 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2610 dsl_dataset_promote_sync(void *arg1, void *arg2, dmu_tx_t *tx)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2611 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2612 dsl_dataset_t *hds = arg1;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2613 struct promotearg *pa = arg2;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2614 struct promotenode *snap = list_head(&pa->shared_snaps);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2615 dsl_dataset_t *origin_ds = snap->ds;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2616 dsl_dataset_t *origin_head;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2617 dsl_dir_t *dd = hds->ds_dir;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2618 dsl_pool_t *dp = hds->ds_dir->dd_pool;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2619 dsl_dir_t *odd = NULL;
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2620 uint64_t oldnext_obj;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2621 int64_t delta;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2622
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2623 ASSERT(0 == (hds->ds_phys->ds_flags & DS_FLAG_NOPROMOTE));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2624
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2625 snap = list_head(&pa->origin_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2626 origin_head = snap->ds;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2627
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2207
diff changeset
2628 /*
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2629 * We need to explicitly open odd, since origin_ds's dd will be
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2207
diff changeset
2630 * changing.
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2207
diff changeset
2631 */
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2632 VERIFY(0 == dsl_dir_open_obj(dp, origin_ds->ds_dir->dd_object,
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2633 NULL, FTAG, &odd));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2634
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2635 /* change origin's next snap */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2636 dmu_buf_will_dirty(origin_ds->ds_dbuf, tx);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2637 oldnext_obj = origin_ds->ds_phys->ds_next_snap_obj;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2638 snap = list_tail(&pa->clone_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2639 ASSERT3U(snap->ds->ds_phys->ds_prev_snap_obj, ==, origin_ds->ds_object);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2640 origin_ds->ds_phys->ds_next_snap_obj = snap->ds->ds_object;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2641
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2642 /* change the origin's next clone */
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2643 if (origin_ds->ds_phys->ds_next_clones_obj) {
10801
e0bf032e8673 6822816 assertion failed: zap_remove_int(ds_next_clones_obj) returns ENOENT
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10799
diff changeset
2644 remove_from_next_clones(origin_ds, snap->ds->ds_object, tx);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2645 VERIFY3U(0, ==, zap_add_int(dp->dp_meta_objset,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2646 origin_ds->ds_phys->ds_next_clones_obj,
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2647 oldnext_obj, tx));
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2648 }
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2649
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2650 /* change origin */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2651 dmu_buf_will_dirty(dd->dd_dbuf, tx);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2652 ASSERT3U(dd->dd_phys->dd_origin_obj, ==, origin_ds->ds_object);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2653 dd->dd_phys->dd_origin_obj = odd->dd_phys->dd_origin_obj;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2654 dd->dd_origin_txg = origin_head->ds_dir->dd_origin_txg;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2655 dmu_buf_will_dirty(odd->dd_dbuf, tx);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2656 odd->dd_phys->dd_origin_obj = origin_ds->ds_object;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2657 origin_head->ds_dir->dd_origin_txg =
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2658 origin_ds->ds_phys->ds_creation_txg;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2659
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2660 /* change dd_clone entries */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2661 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2662 VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2663 odd->dd_phys->dd_clones, hds->ds_object, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2664 VERIFY3U(0, ==, zap_add_int(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2665 pa->origin_origin->ds_dir->dd_phys->dd_clones,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2666 hds->ds_object, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2667
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2668 VERIFY3U(0, ==, zap_remove_int(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2669 pa->origin_origin->ds_dir->dd_phys->dd_clones,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2670 origin_head->ds_object, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2671 if (dd->dd_phys->dd_clones == 0) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2672 dd->dd_phys->dd_clones = zap_create(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2673 DMU_OT_DSL_CLONES, DMU_OT_NONE, 0, tx);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2674 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2675 VERIFY3U(0, ==, zap_add_int(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2676 dd->dd_phys->dd_clones, origin_head->ds_object, tx));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2677
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2678 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2679
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2680 /* move snapshots to this dir */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2681 for (snap = list_head(&pa->shared_snaps); snap;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2682 snap = list_next(&pa->shared_snaps, snap)) {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2683 dsl_dataset_t *ds = snap->ds;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2684
7237
f47d41541b14 PSARC 2008/393 zfs primarycache and secondarycache properties
ek110237
parents: 7077
diff changeset
2685 /* unregister props as dsl_dir is changing */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
2686 if (ds->ds_objset) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
2687 dmu_objset_evict(ds->ds_objset);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
2688 ds->ds_objset = NULL;
7237
f47d41541b14 PSARC 2008/393 zfs primarycache and secondarycache properties
ek110237
parents: 7077
diff changeset
2689 }
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2690 /* move snap name entry */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2691 VERIFY(0 == dsl_dataset_get_snapname(ds));
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2692 VERIFY(0 == dsl_dataset_snap_remove(origin_head,
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2693 ds->ds_snapname, tx));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2694 VERIFY(0 == zap_add(dp->dp_meta_objset,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2695 hds->ds_phys->ds_snapnames_zapobj, ds->ds_snapname,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2696 8, 1, &ds->ds_object, tx));
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2697
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2698 /* change containing dsl_dir */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2699 dmu_buf_will_dirty(ds->ds_dbuf, tx);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2700 ASSERT3U(ds->ds_phys->ds_dir_obj, ==, odd->dd_object);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2701 ds->ds_phys->ds_dir_obj = dd->dd_object;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2702 ASSERT3P(ds->ds_dir, ==, odd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2703 dsl_dir_close(ds->ds_dir, ds);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
2704 VERIFY(0 == dsl_dir_open_obj(dp, dd->dd_object,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2705 NULL, ds, &ds->ds_dir));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2706
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2707 /* move any clone references */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2708 if (ds->ds_phys->ds_next_clones_obj &&
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2709 spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2710 zap_cursor_t zc;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2711 zap_attribute_t za;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2712
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2713 for (zap_cursor_init(&zc, dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2714 ds->ds_phys->ds_next_clones_obj);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2715 zap_cursor_retrieve(&zc, &za) == 0;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2716 zap_cursor_advance(&zc)) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2717 dsl_dataset_t *cnds;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2718 uint64_t o;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2719
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2720 if (za.za_first_integer == oldnext_obj) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2721 /*
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2722 * We've already moved the
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2723 * origin's reference.
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2724 */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2725 continue;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2726 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2727
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2728 VERIFY3U(0, ==, dsl_dataset_hold_obj(dp,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2729 za.za_first_integer, FTAG, &cnds));
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2730 o = cnds->ds_dir->dd_phys->dd_head_dataset_obj;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2731
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2732 VERIFY3U(zap_remove_int(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2733 odd->dd_phys->dd_clones, o, tx), ==, 0);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2734 VERIFY3U(zap_add_int(dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2735 dd->dd_phys->dd_clones, o, tx), ==, 0);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2736 dsl_dataset_rele(cnds, FTAG);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2737 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2738 zap_cursor_fini(&zc);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2739 }
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2740
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2741 ASSERT3U(dsl_prop_numcb(ds), ==, 0);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2742 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2743
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2744 /*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2745 * Change space accounting.
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2746 * Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2747 * both be valid, or both be 0 (resulting in delta == 0). This
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2748 * is true for each of {clone,origin} independently.
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2749 */
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2750
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2751 delta = pa->cloneusedsnap -
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2752 dd->dd_phys->dd_used_breakdown[DD_USED_SNAP];
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2753 ASSERT3S(delta, >=, 0);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2754 ASSERT3U(pa->used, >=, delta);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2755 dsl_dir_diduse_space(dd, DD_USED_SNAP, delta, 0, 0, tx);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2756 dsl_dir_diduse_space(dd, DD_USED_HEAD,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2757 pa->used - delta, pa->comp, pa->uncomp, tx);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2758
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2759 delta = pa->originusedsnap -
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2760 odd->dd_phys->dd_used_breakdown[DD_USED_SNAP];
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2761 ASSERT3S(delta, <=, 0);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2762 ASSERT3U(pa->used, >=, -delta);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2763 dsl_dir_diduse_space(odd, DD_USED_SNAP, delta, 0, 0, tx);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2764 dsl_dir_diduse_space(odd, DD_USED_HEAD,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2765 -pa->used - delta, -pa->comp, -pa->uncomp, tx);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2766
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2767 origin_ds->ds_phys->ds_unique_bytes = pa->unique;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2768
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2769 /* log history record */
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2770 spa_history_log_internal(LOG_DS_PROMOTE, dd->dd_pool->dp_spa, tx,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
2771 "dataset = %llu", hds->ds_object);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4009
diff changeset
2772
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2773 dsl_dir_close(odd, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2774 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2775
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2776 static char *snaplist_tag = "snaplist";
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2777 /*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2778 * Make a list of dsl_dataset_t's for the snapshots between first_obj
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2779 * (exclusive) and last_obj (inclusive). The list will be in reverse
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2780 * order (last_obj will be the list_head()). If first_obj == 0, do all
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2781 * snapshots back to this dataset's origin.
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2782 */
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2783 static int
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2784 snaplist_make(dsl_pool_t *dp, boolean_t own,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2785 uint64_t first_obj, uint64_t last_obj, list_t *l)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2786 {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2787 uint64_t obj = last_obj;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2788
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2789 ASSERT(RW_LOCK_HELD(&dp->dp_config_rwlock));
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2790
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2791 list_create(l, sizeof (struct promotenode),
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2792 offsetof(struct promotenode, link));
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2793
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2794 while (obj != first_obj) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2795 dsl_dataset_t *ds;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2796 struct promotenode *snap;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2797 int err;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2798
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2799 if (own) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2800 err = dsl_dataset_own_obj(dp, obj,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2801 0, snaplist_tag, &ds);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2802 if (err == 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2803 dsl_dataset_make_exclusive(ds, snaplist_tag);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2804 } else {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2805 err = dsl_dataset_hold_obj(dp, obj, snaplist_tag, &ds);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2806 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2807 if (err == ENOENT) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2808 /* lost race with snapshot destroy */
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2809 struct promotenode *last = list_tail(l);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2810 ASSERT(obj != last->ds->ds_phys->ds_prev_snap_obj);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2811 obj = last->ds->ds_phys->ds_prev_snap_obj;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2812 continue;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2813 } else if (err) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2814 return (err);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2815 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2816
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2817 if (first_obj == 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2818 first_obj = ds->ds_dir->dd_phys->dd_origin_obj;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2819
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2820 snap = kmem_alloc(sizeof (struct promotenode), KM_SLEEP);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2821 snap->ds = ds;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2822 list_insert_tail(l, snap);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2823 obj = ds->ds_phys->ds_prev_snap_obj;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2824 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2825
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2826 return (0);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2827 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2828
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2829 static int
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2830 snaplist_space(list_t *l, uint64_t mintxg, uint64_t *spacep)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2831 {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2832 struct promotenode *snap;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2833
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2834 *spacep = 0;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2835 for (snap = list_head(l); snap; snap = list_next(l, snap)) {
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2836 uint64_t used, comp, uncomp;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2837 dsl_deadlist_space_range(&snap->ds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2838 mintxg, UINT64_MAX, &used, &comp, &uncomp);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2839 *spacep += used;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2840 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2841 return (0);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2842 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2843
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2844 static void
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2845 snaplist_destroy(list_t *l, boolean_t own)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2846 {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2847 struct promotenode *snap;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2848
8779
f164e0e90508 6784924 panic while ludelete (zfs destroy)
Mark J Musante <Mark.Musante@Sun.COM>
parents: 8746
diff changeset
2849 if (!l || !list_link_active(&l->list_head))
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2850 return;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2851
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2852 while ((snap = list_tail(l)) != NULL) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2853 list_remove(l, snap);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2854 if (own)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2855 dsl_dataset_disown(snap->ds, snaplist_tag);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2856 else
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2857 dsl_dataset_rele(snap->ds, snaplist_tag);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2858 kmem_free(snap, sizeof (struct promotenode));
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2859 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2860 list_destroy(l);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2861 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2862
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2863 /*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2864 * Promote a clone. Nomenclature note:
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2865 * "clone" or "cds": the original clone which is being promoted
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2866 * "origin" or "ods": the snapshot which is originally clone's origin
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2867 * "origin head" or "ohds": the dataset which is the head
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2868 * (filesystem/volume) for the origin
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2869 * "origin origin": the origin of the origin's filesystem (typically
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2870 * NULL, indicating that the clone is not a clone of a clone).
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2871 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2872 int
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2873 dsl_dataset_promote(const char *name, char *conflsnap)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2874 {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2875 dsl_dataset_t *ds;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2876 dsl_dir_t *dd;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2877 dsl_pool_t *dp;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2878 dmu_object_info_t doi;
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2879 struct promotearg pa = { 0 };
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6992
diff changeset
2880 struct promotenode *snap;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2881 int err;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2882
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2883 err = dsl_dataset_hold(name, FTAG, &ds);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2884 if (err)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2885 return (err);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2886 dd = ds->ds_dir;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2887 dp = dd->dd_pool;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2888
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2889 err = dmu_object_info(dp->dp_meta_objset,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2890 ds->ds_phys->ds_snapnames_zapobj, &doi);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2891 if (err) {
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2892 dsl_dataset_rele(ds, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2893 return (err);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2894 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2895
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2896 if (dsl_dataset_is_snapshot(ds) || dd->dd_phys->dd_origin_obj == 0) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2897 dsl_dataset_rele(ds, FTAG);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2898 return (EINVAL);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2899 }
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2900
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2901 /*
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2902 * We are going to inherit all the snapshots taken before our
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2903 * origin (i.e., our new origin will be our parent's origin).
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2904 * Take ownership of them so that we can rename them into our
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2905 * namespace.
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2906 */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2907 rw_enter(&dp->dp_config_rwlock, RW_READER);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2908
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2909 err = snaplist_make(dp, B_TRUE, 0, dd->dd_phys->dd_origin_obj,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2910 &pa.shared_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2911 if (err != 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2912 goto out;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2913
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2914 err = snaplist_make(dp, B_FALSE, 0, ds->ds_object, &pa.clone_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2915 if (err != 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2916 goto out;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2917
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2918 snap = list_head(&pa.shared_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2919 ASSERT3U(snap->ds->ds_object, ==, dd->dd_phys->dd_origin_obj);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2920 err = snaplist_make(dp, B_FALSE, dd->dd_phys->dd_origin_obj,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2921 snap->ds->ds_dir->dd_phys->dd_head_dataset_obj, &pa.origin_snaps);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2922 if (err != 0)
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2923 goto out;
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2924
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2925 if (snap->ds->ds_dir->dd_phys->dd_origin_obj != 0) {
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2926 err = dsl_dataset_hold_obj(dp,
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2927 snap->ds->ds_dir->dd_phys->dd_origin_obj,
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2928 FTAG, &pa.origin_origin);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2929 if (err != 0)
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2930 goto out;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2931 }
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2932
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2933 out:
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2934 rw_exit(&dp->dp_config_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2935
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2936 /*
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2937 * Add in 128x the snapnames zapobj size, since we will be moving
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2938 * a bunch of snapnames to the promoted ds, and dirtying their
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2939 * bonus buffers.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2940 */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2941 if (err == 0) {
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2942 err = dsl_sync_task_do(dp, dsl_dataset_promote_check,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2943 dsl_dataset_promote_sync, ds, &pa,
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10816
diff changeset
2944 2 + 2 * doi.doi_physical_blocks_512);
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2945 if (err && pa.err_ds && conflsnap)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10575
diff changeset
2946 (void) strncpy(conflsnap, pa.err_ds, MAXNAMELEN);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2947 }
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2948
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2949 snaplist_destroy(&pa.shared_snaps, B_TRUE);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2950 snaplist_destroy(&pa.clone_snaps, B_FALSE);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2951 snaplist_destroy(&pa.origin_snaps, B_FALSE);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
2952 if (pa.origin_origin)
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
2953 dsl_dataset_rele(pa.origin_origin, FTAG);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
2954 dsl_dataset_rele(ds, FTAG);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2955 return (err);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1758
diff changeset
2956 }
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
2957
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2958 struct cloneswaparg {
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2959 dsl_dataset_t *cds; /* clone dataset */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2960 dsl_dataset_t *ohds; /* origin's head dataset */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2961 boolean_t force;
5481
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2962 int64_t unused_refres_delta; /* change in unconsumed refreservation */
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2963 };
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2964
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2965 /* ARGSUSED */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2966 static int
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2967 dsl_dataset_clone_swap_check(void *arg1, void *arg2, dmu_tx_t *tx)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2968 {
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2969 struct cloneswaparg *csa = arg1;
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2970
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2971 /* they should both be heads */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2972 if (dsl_dataset_is_snapshot(csa->cds) ||
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2973 dsl_dataset_is_snapshot(csa->ohds))
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2974 return (EINVAL);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2975
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2976 /* the branch point should be just before them */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2977 if (csa->cds->ds_prev != csa->ohds->ds_prev)
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2978 return (EINVAL);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2979
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
2980 /* cds should be the clone (unless they are unrelated) */
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
2981 if (csa->cds->ds_prev != NULL &&
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
2982 csa->cds->ds_prev != csa->cds->ds_dir->dd_pool->dp_origin_snap &&
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
2983 csa->ohds->ds_object !=
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
2984 csa->cds->ds_prev->ds_phys->ds_next_snap_obj)
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2985 return (EINVAL);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2986
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2987 /* the clone should be a child of the origin */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2988 if (csa->cds->ds_dir->dd_parent != csa->ohds->ds_dir)
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2989 return (EINVAL);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
2990
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2991 /* ohds shouldn't be modified unless 'force' */
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2992 if (!csa->force && dsl_dataset_modified_since_lastsnap(csa->ohds))
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
2993 return (ETXTBSY);
5481
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2994
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2995 /* adjust amount of any unconsumed refreservation */
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2996 csa->unused_refres_delta =
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2997 (int64_t)MIN(csa->ohds->ds_reserved,
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2998 csa->ohds->ds_phys->ds_unique_bytes) -
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
2999 (int64_t)MIN(csa->ohds->ds_reserved,
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3000 csa->cds->ds_phys->ds_unique_bytes);
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3001
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3002 if (csa->unused_refres_delta > 0 &&
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3003 csa->unused_refres_delta >
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3004 dsl_dir_space_available(csa->ohds->ds_dir, NULL, 0, TRUE))
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3005 return (ENOSPC);
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3006
10799
395576ddfea9 6881321 zfs test rsend_012_pos panics when running daily.0807 archives
Chris Kirby <Chris.Kirby@sun.com>
parents: 10588
diff changeset
3007 if (csa->ohds->ds_quota != 0 &&
395576ddfea9 6881321 zfs test rsend_012_pos panics when running daily.0807 archives
Chris Kirby <Chris.Kirby@sun.com>
parents: 10588
diff changeset
3008 csa->cds->ds_phys->ds_unique_bytes > csa->ohds->ds_quota)
395576ddfea9 6881321 zfs test rsend_012_pos panics when running daily.0807 archives
Chris Kirby <Chris.Kirby@sun.com>
parents: 10588
diff changeset
3009 return (EDQUOT);
395576ddfea9 6881321 zfs test rsend_012_pos panics when running daily.0807 archives
Chris Kirby <Chris.Kirby@sun.com>
parents: 10588
diff changeset
3010
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3011 return (0);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3012 }
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3013
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3014 /* ARGSUSED */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3015 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3016 dsl_dataset_clone_swap_sync(void *arg1, void *arg2, dmu_tx_t *tx)
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3017 {
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3018 struct cloneswaparg *csa = arg1;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3019 dsl_pool_t *dp = csa->cds->ds_dir->dd_pool;
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3020
5481
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3021 ASSERT(csa->cds->ds_reserved == 0);
10799
395576ddfea9 6881321 zfs test rsend_012_pos panics when running daily.0807 archives
Chris Kirby <Chris.Kirby@sun.com>
parents: 10588
diff changeset
3022 ASSERT(csa->ohds->ds_quota == 0 ||
395576ddfea9 6881321 zfs test rsend_012_pos panics when running daily.0807 archives
Chris Kirby <Chris.Kirby@sun.com>
parents: 10588
diff changeset
3023 csa->cds->ds_phys->ds_unique_bytes <= csa->ohds->ds_quota);
5481
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3024
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3025 dmu_buf_will_dirty(csa->cds->ds_dbuf, tx);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3026 dmu_buf_will_dirty(csa->ohds->ds_dbuf, tx);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3027
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3028 if (csa->cds->ds_objset != NULL) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3029 dmu_objset_evict(csa->cds->ds_objset);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3030 csa->cds->ds_objset = NULL;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3031 }
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3032
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3033 if (csa->ohds->ds_objset != NULL) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3034 dmu_objset_evict(csa->ohds->ds_objset);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3035 csa->ohds->ds_objset = NULL;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3036 }
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3037
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3038 /*
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3039 * Reset origin's unique bytes, if it exists.
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3040 */
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3041 if (csa->cds->ds_prev) {
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3042 dsl_dataset_t *origin = csa->cds->ds_prev;
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3043 uint64_t comp, uncomp;
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3044
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3045 dmu_buf_will_dirty(origin->ds_dbuf, tx);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3046 dsl_deadlist_space_range(&csa->cds->ds_deadlist,
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3047 origin->ds_phys->ds_prev_snap_txg, UINT64_MAX,
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3048 &origin->ds_phys->ds_unique_bytes, &comp, &uncomp);
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3049 }
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3050
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3051 /* swap blkptrs */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3052 {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3053 blkptr_t tmp;
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3054 tmp = csa->ohds->ds_phys->ds_bp;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3055 csa->ohds->ds_phys->ds_bp = csa->cds->ds_phys->ds_bp;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3056 csa->cds->ds_phys->ds_bp = tmp;
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3057 }
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3058
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3059 /* set dd_*_bytes */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3060 {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3061 int64_t dused, dcomp, duncomp;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3062 uint64_t cdl_used, cdl_comp, cdl_uncomp;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3063 uint64_t odl_used, odl_comp, odl_uncomp;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3064
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3065 ASSERT3U(csa->cds->ds_dir->dd_phys->
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3066 dd_used_breakdown[DD_USED_SNAP], ==, 0);
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3067
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3068 dsl_deadlist_space(&csa->cds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3069 &cdl_used, &cdl_comp, &cdl_uncomp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3070 dsl_deadlist_space(&csa->ohds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3071 &odl_used, &odl_comp, &odl_uncomp);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3072
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3073 dused = csa->cds->ds_phys->ds_used_bytes + cdl_used -
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3074 (csa->ohds->ds_phys->ds_used_bytes + odl_used);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3075 dcomp = csa->cds->ds_phys->ds_compressed_bytes + cdl_comp -
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3076 (csa->ohds->ds_phys->ds_compressed_bytes + odl_comp);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3077 duncomp = csa->cds->ds_phys->ds_uncompressed_bytes +
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3078 cdl_uncomp -
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3079 (csa->ohds->ds_phys->ds_uncompressed_bytes + odl_uncomp);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3080
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3081 dsl_dir_diduse_space(csa->ohds->ds_dir, DD_USED_HEAD,
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3082 dused, dcomp, duncomp, tx);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3083 dsl_dir_diduse_space(csa->cds->ds_dir, DD_USED_HEAD,
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3084 -dused, -dcomp, -duncomp, tx);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3085
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3086 /*
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3087 * The difference in the space used by snapshots is the
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3088 * difference in snapshot space due to the head's
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3089 * deadlist (since that's the only thing that's
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3090 * changing that affects the snapused).
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3091 */
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3092 dsl_deadlist_space_range(&csa->cds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3093 csa->ohds->ds_dir->dd_origin_txg, UINT64_MAX,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3094 &cdl_used, &cdl_comp, &cdl_uncomp);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3095 dsl_deadlist_space_range(&csa->ohds->ds_deadlist,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3096 csa->ohds->ds_dir->dd_origin_txg, UINT64_MAX,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3097 &odl_used, &odl_comp, &odl_uncomp);
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3098 dsl_dir_transfer_space(csa->ohds->ds_dir, cdl_used - odl_used,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3099 DD_USED_HEAD, DD_USED_SNAP, tx);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3100 }
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3101
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3102 /* swap ds_*_bytes */
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3103 SWITCH64(csa->ohds->ds_phys->ds_used_bytes,
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3104 csa->cds->ds_phys->ds_used_bytes);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3105 SWITCH64(csa->ohds->ds_phys->ds_compressed_bytes,
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3106 csa->cds->ds_phys->ds_compressed_bytes);
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3107 SWITCH64(csa->ohds->ds_phys->ds_uncompressed_bytes,
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3108 csa->cds->ds_phys->ds_uncompressed_bytes);
5481
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3109 SWITCH64(csa->ohds->ds_phys->ds_unique_bytes,
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3110 csa->cds->ds_phys->ds_unique_bytes);
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3111
1364fb7de75d 6619182 new non-sparse zvols should get refreservations
ck153898
parents: 5475
diff changeset
3112 /* apply any parent delta for change in unconsumed refreservation */
7390
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3113 dsl_dir_diduse_space(csa->ohds->ds_dir, DD_USED_REFRSRV,
6d408f0a5fbd PSARC/2008/518 ZFS space accounting enhancements
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7385
diff changeset
3114 csa->unused_refres_delta, 0, 0, tx);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3115
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3116 /*
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3117 * Swap deadlists.
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3118 */
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3119 dsl_deadlist_close(&csa->cds->ds_deadlist);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3120 dsl_deadlist_close(&csa->ohds->ds_deadlist);
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3121 SWITCH64(csa->ohds->ds_phys->ds_deadlist_obj,
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3122 csa->cds->ds_phys->ds_deadlist_obj);
12470
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3123 dsl_deadlist_open(&csa->cds->ds_deadlist, dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3124 csa->cds->ds_phys->ds_deadlist_obj);
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3125 dsl_deadlist_open(&csa->ohds->ds_deadlist, dp->dp_meta_objset,
54258108784b 6948890 snapshot deletion can induce pathologically long spa_sync() times
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 12450
diff changeset
3126 csa->ohds->ds_phys->ds_deadlist_obj);
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
3127
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3128 dsl_scan_ds_clone_swapped(csa->ohds, csa->cds, tx);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3129 }
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3130
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3131 /*
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3132 * Swap 'clone' with its origin head datasets. Used at the end of "zfs
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3133 * recv" into an existing fs to swizzle the file system to the new
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3134 * version, and by "zfs rollback". Can also be used to swap two
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3135 * independent head datasets if neither has any snapshots.
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3136 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3137 int
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3138 dsl_dataset_clone_swap(dsl_dataset_t *clone, dsl_dataset_t *origin_head,
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3139 boolean_t force)
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3140 {
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3141 struct cloneswaparg csa;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3142 int error;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3143
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3144 ASSERT(clone->ds_owner);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3145 ASSERT(origin_head->ds_owner);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3146 retry:
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3147 /* Need exclusive access for the swap */
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3148 rw_enter(&clone->ds_rwlock, RW_WRITER);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3149 if (!rw_tryenter(&origin_head->ds_rwlock, RW_WRITER)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3150 rw_exit(&clone->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3151 rw_enter(&origin_head->ds_rwlock, RW_WRITER);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3152 if (!rw_tryenter(&clone->ds_rwlock, RW_WRITER)) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3153 rw_exit(&origin_head->ds_rwlock);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3154 goto retry;
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3155 }
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3156 }
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3157 csa.cds = clone;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3158 csa.ohds = origin_head;
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5326
diff changeset
3159 csa.force = force;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3160 error = dsl_sync_task_do(clone->ds_dir->dd_pool,
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3161 dsl_dataset_clone_swap_check,
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3162 dsl_dataset_clone_swap_sync, &csa, NULL, 9);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3163 return (error);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3164 }
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5094
diff changeset
3165
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3166 /*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3167 * Given a pool name and a dataset object number in that pool,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3168 * return the name of that dataset.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3169 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3170 int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3171 dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3172 {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3173 spa_t *spa;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3174 dsl_pool_t *dp;
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3175 dsl_dataset_t *ds;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3176 int error;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3177
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3178 if ((error = spa_open(pname, &spa, FTAG)) != 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3179 return (error);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3180 dp = spa_get_dsl(spa);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3181 rw_enter(&dp->dp_config_rwlock, RW_READER);
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3182 if ((error = dsl_dataset_hold_obj(dp, obj, FTAG, &ds)) == 0) {
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3183 dsl_dataset_name(ds, buf);
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3184 dsl_dataset_rele(ds, FTAG);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3185 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3186 rw_exit(&dp->dp_config_rwlock);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3187 spa_close(spa, FTAG);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3188
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3189 return (error);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
3190 }
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3191
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3192 int
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3193 dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota,
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3194 uint64_t asize, uint64_t inflight, uint64_t *used, uint64_t *ref_rsrv)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3195 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3196 int error = 0;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3197
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3198 ASSERT3S(asize, >, 0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3199
5831
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3200 /*
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3201 * *ref_rsrv is the portion of asize that will come from any
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3202 * unconsumed refreservation space.
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3203 */
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3204 *ref_rsrv = 0;
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3205
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3206 mutex_enter(&ds->ds_lock);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3207 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3208 * Make a space adjustment for reserved bytes.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3209 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3210 if (ds->ds_reserved > ds->ds_phys->ds_unique_bytes) {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3211 ASSERT3U(*used, >=,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3212 ds->ds_reserved - ds->ds_phys->ds_unique_bytes);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3213 *used -= (ds->ds_reserved - ds->ds_phys->ds_unique_bytes);
5831
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3214 *ref_rsrv =
48655d6b290b 6630761 In sub-filesystem, available space is less than refreservation space
ck153898
parents: 5712
diff changeset
3215 asize - MIN(asize, parent_delta(ds, asize + inflight));
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3216 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3217
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3218 if (!check_quota || ds->ds_quota == 0) {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3219 mutex_exit(&ds->ds_lock);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3220 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3221 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3222 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3223 * If they are requesting more space, and our current estimate
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3224 * is over quota, they get to try again unless the actual
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3225 * on-disk is over quota and there are no pending changes (which
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3226 * may free up space for us).
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3227 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3228 if (ds->ds_phys->ds_used_bytes + inflight >= ds->ds_quota) {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3229 if (inflight > 0 || ds->ds_phys->ds_used_bytes < ds->ds_quota)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3230 error = ERESTART;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3231 else
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3232 error = EDQUOT;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3233 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3234 mutex_exit(&ds->ds_lock);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3235
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3236 return (error);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3237 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3238
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3239 /* ARGSUSED */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3240 static int
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3241 dsl_dataset_set_quota_check(void *arg1, void *arg2, dmu_tx_t *tx)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3242 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3243 dsl_dataset_t *ds = arg1;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3244 dsl_prop_setarg_t *psa = arg2;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3245 int err;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3246
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3247 if (spa_version(ds->ds_dir->dd_pool->dp_spa) < SPA_VERSION_REFQUOTA)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3248 return (ENOTSUP);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3249
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3250 if ((err = dsl_prop_predict_sync(ds->ds_dir, psa)) != 0)
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3251 return (err);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3252
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3253 if (psa->psa_effective_value == 0)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3254 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3255
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3256 if (psa->psa_effective_value < ds->ds_phys->ds_used_bytes ||
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3257 psa->psa_effective_value < ds->ds_reserved)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3258 return (ENOSPC);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3259
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3260 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3261 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3262
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3263 extern void dsl_prop_set_sync(void *, void *, dmu_tx_t *);
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3264
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3265 void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3266 dsl_dataset_set_quota_sync(void *arg1, void *arg2, dmu_tx_t *tx)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3267 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3268 dsl_dataset_t *ds = arg1;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3269 dsl_prop_setarg_t *psa = arg2;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3270 uint64_t effective_value = psa->psa_effective_value;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3271
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3272 dsl_prop_set_sync(ds, psa, tx);
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3273 DSL_PROP_CHECK_PREDICTION(ds->ds_dir, psa);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3274
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3275 if (ds->ds_quota != effective_value) {
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3276 dmu_buf_will_dirty(ds->ds_dbuf, tx);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3277 ds->ds_quota = effective_value;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3278
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3279 spa_history_log_internal(LOG_DS_REFQUOTA,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3280 ds->ds_dir->dd_pool->dp_spa, tx, "%lld dataset = %llu ",
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3281 (longlong_t)ds->ds_quota, ds->ds_object);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3282 }
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3283 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3284
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3285 int
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3286 dsl_dataset_set_quota(const char *dsname, zprop_source_t source, uint64_t quota)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3287 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3288 dsl_dataset_t *ds;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3289 dsl_prop_setarg_t psa;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3290 int err;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3291
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3292 dsl_prop_setarg_init_uint64(&psa, "refquota", source, &quota);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3293
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3294 err = dsl_dataset_hold(dsname, FTAG, &ds);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3295 if (err)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3296 return (err);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3297
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3298 /*
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3299 * If someone removes a file, then tries to set the quota, we
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3300 * want to make sure the file freeing takes effect.
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3301 */
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3302 txg_wait_open(ds->ds_dir->dd_pool, 0);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3303
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3304 err = dsl_sync_task_do(ds->ds_dir->dd_pool,
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3305 dsl_dataset_set_quota_check, dsl_dataset_set_quota_sync,
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3306 ds, &psa, 0);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3307
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3308 dsl_dataset_rele(ds, FTAG);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3309 return (err);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3310 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3311
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3312 static int
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3313 dsl_dataset_set_reservation_check(void *arg1, void *arg2, dmu_tx_t *tx)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3314 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3315 dsl_dataset_t *ds = arg1;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3316 dsl_prop_setarg_t *psa = arg2;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3317 uint64_t effective_value;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3318 uint64_t unique;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3319 int err;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3320
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3321 if (spa_version(ds->ds_dir->dd_pool->dp_spa) <
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3322 SPA_VERSION_REFRESERVATION)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3323 return (ENOTSUP);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3324
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3325 if (dsl_dataset_is_snapshot(ds))
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3326 return (EINVAL);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3327
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3328 if ((err = dsl_prop_predict_sync(ds->ds_dir, psa)) != 0)
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3329 return (err);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3330
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3331 effective_value = psa->psa_effective_value;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3332
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3333 /*
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3334 * If we are doing the preliminary check in open context, the
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3335 * space estimates may be inaccurate.
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3336 */
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3337 if (!dmu_tx_is_syncing(tx))
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3338 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3339
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3340 mutex_enter(&ds->ds_lock);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3341 if (!DS_UNIQUE_IS_ACCURATE(ds))
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3342 dsl_dataset_recalc_head_uniq(ds);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3343 unique = ds->ds_phys->ds_unique_bytes;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3344 mutex_exit(&ds->ds_lock);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3345
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3346 if (MAX(unique, effective_value) > MAX(unique, ds->ds_reserved)) {
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3347 uint64_t delta = MAX(unique, effective_value) -
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3348 MAX(unique, ds->ds_reserved);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3349
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3350 if (delta > dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE))
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3351 return (ENOSPC);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3352 if (ds->ds_quota > 0 &&
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3353 effective_value > ds->ds_quota)
8525
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3354 return (ENOSPC);
e0e0e525d0f8 6788830 set large value to reservation cause core dump
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 8517
diff changeset
3355 }
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3356
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3357 return (0);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3358 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3359
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3360 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3361 dsl_dataset_set_reservation_sync(void *arg1, void *arg2, dmu_tx_t *tx)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3362 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3363 dsl_dataset_t *ds = arg1;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3364 dsl_prop_setarg_t *psa = arg2;
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3365 uint64_t effective_value = psa->psa_effective_value;
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3366 uint64_t unique;
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3367 int64_t delta;
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3368
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3369 dsl_prop_set_sync(ds, psa, tx);
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3370 DSL_PROP_CHECK_PREDICTION(ds->ds_dir, psa);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3371
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3372 dmu_buf_will_dirty(ds->ds_dbuf, tx);
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3373
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3374 mutex_enter(&ds->ds_dir->dd_lock);
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3375 mutex_enter(&ds->ds_lock);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3376 ASSERT(DS_UNIQUE_IS_ACCURATE(ds));
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3377 unique = ds->ds_phys->ds_unique_bytes;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3378 delta = MAX(0, (int64_t)(effective_value - unique)) -
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3379 MAX(0, (int64_t)(ds->ds_reserved - unique));
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3380 ds->ds_reserved = effective_value;
7595
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3381 mutex_exit(&ds->ds_lock);
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3382
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3383 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, delta, 0, 0, tx);
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3384 mutex_exit(&ds->ds_dir->dd_lock);
2ff5700c7efc 6747355 finish closing race condition when setting refreservation
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7525
diff changeset
3385
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3386 spa_history_log_internal(LOG_DS_REFRESERV,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3387 ds->ds_dir->dd_pool->dp_spa, tx, "%lld dataset = %llu",
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3388 (longlong_t)effective_value, ds->ds_object);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3389 }
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3390
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3391 int
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3392 dsl_dataset_set_reservation(const char *dsname, zprop_source_t source,
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3393 uint64_t reservation)
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3394 {
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3395 dsl_dataset_t *ds;
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3396 dsl_prop_setarg_t psa;
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3397 int err;
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3398
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3399 dsl_prop_setarg_init_uint64(&psa, "refreservation", source,
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3400 &reservation);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3401
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3402 err = dsl_dataset_hold(dsname, FTAG, &ds);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3403 if (err)
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3404 return (err);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3405
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3406 err = dsl_sync_task_do(ds->ds_dir->dd_pool,
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3407 dsl_dataset_set_reservation_check,
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3408 dsl_dataset_set_reservation_sync, ds, &psa, 0);
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10951
diff changeset
3409
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6643
diff changeset
3410 dsl_dataset_rele(ds, FTAG);
5378
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3411 return (err);
111aa1baa84a PSARC 2007/555 zfs fs-only quotas and reservations
ck153898
parents: 5367
diff changeset
3412 }
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3413
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3414 struct dsl_ds_holdarg {
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3415 dsl_sync_task_group_t *dstg;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3416 char *htag;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3417 char *snapname;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3418 boolean_t recursive;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3419 boolean_t gotone;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3420 boolean_t temphold;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3421 char failed[MAXPATHLEN];
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3422 };
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3423
10951
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3424 /*
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3425 * The max length of a temporary tag prefix is the number of hex digits
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3426 * required to express UINT64_MAX plus one for the hyphen.
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3427 */
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3428 #define MAX_TAG_PREFIX_LEN 17
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3429
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3430 static int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3431 dsl_dataset_user_hold_check(void *arg1, void *arg2, dmu_tx_t *tx)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3432 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3433 dsl_dataset_t *ds = arg1;
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3434 struct dsl_ds_holdarg *ha = arg2;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3435 char *htag = ha->htag;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3436 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3437 int error = 0;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3438
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3439 if (spa_version(ds->ds_dir->dd_pool->dp_spa) < SPA_VERSION_USERREFS)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3440 return (ENOTSUP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3441
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3442 if (!dsl_dataset_is_snapshot(ds))
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3443 return (EINVAL);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3444
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3445 /* tags must be unique */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3446 mutex_enter(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3447 if (ds->ds_phys->ds_userrefs_obj) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3448 error = zap_lookup(mos, ds->ds_phys->ds_userrefs_obj, htag,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3449 8, 1, tx);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3450 if (error == 0)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3451 error = EEXIST;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3452 else if (error == ENOENT)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3453 error = 0;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3454 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3455 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3456
10951
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3457 if (error == 0 && ha->temphold &&
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3458 strlen(htag) + MAX_TAG_PREFIX_LEN >= MAXNAMELEN)
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3459 error = E2BIG;
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3460
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3461 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3462 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3463
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3464 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3465 dsl_dataset_user_hold_sync(void *arg1, void *arg2, dmu_tx_t *tx)
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3466 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3467 dsl_dataset_t *ds = arg1;
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3468 struct dsl_ds_holdarg *ha = arg2;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3469 char *htag = ha->htag;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3470 dsl_pool_t *dp = ds->ds_dir->dd_pool;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3471 objset_t *mos = dp->dp_meta_objset;
10951
56fd5475e8fe 6896756 assertion failed: 0 == dsl_pool_user_hold(dp, ds->ds_object, htag, &now, tx)
Chris Kirby <Chris.Kirby@sun.com>
parents: 10922
diff changeset
3472 uint64_t now = gethrestime_sec();
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3473 uint64_t zapobj;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3474
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3475 mutex_enter(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3476 if (ds->ds_phys->ds_userrefs_obj == 0) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3477 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3478 * This is the first user hold for this dataset. Create
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3479 * the userrefs zap object.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3480 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3481 dmu_buf_will_dirty(ds->ds_dbuf, tx);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3482 zapobj = ds->ds_phys->ds_userrefs_obj =
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3483 zap_create(mos, DMU_OT_USERREFS, DMU_OT_NONE, 0, tx);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3484 } else {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3485 zapobj = ds->ds_phys->ds_userrefs_obj;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3486 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3487 ds->ds_userrefs++;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3488 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3489
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3490 VERIFY(0 == zap_add(mos, zapobj, htag, 8, 1, &now, tx));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3491
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3492 if (ha->temphold) {
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3493 VERIFY(0 == dsl_pool_user_hold(dp, ds->ds_object,
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3494 htag, &now, tx));
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3495 }
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3496
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3497 spa_history_log_internal(LOG_DS_USER_HOLD,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3498 dp->dp_spa, tx, "<%s> temp = %d dataset = %llu", htag,
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3499 (int)ha->temphold, ds->ds_object);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3500 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3501
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3502 static int
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3503 dsl_dataset_user_hold_one(const char *dsname, void *arg)
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3504 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3505 struct dsl_ds_holdarg *ha = arg;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3506 dsl_dataset_t *ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3507 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3508 char *name;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3509
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3510 /* alloc a buffer to hold dsname@snapname plus terminating NULL */
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3511 name = kmem_asprintf("%s@%s", dsname, ha->snapname);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3512 error = dsl_dataset_hold(name, ha->dstg, &ds);
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3513 strfree(name);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3514 if (error == 0) {
10268
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3515 ha->gotone = B_TRUE;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3516 dsl_sync_task_create(ha->dstg, dsl_dataset_user_hold_check,
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3517 dsl_dataset_user_hold_sync, ds, ha, 0);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3518 } else if (error == ENOENT && ha->recursive) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3519 error = 0;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3520 } else {
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3521 (void) strlcpy(ha->failed, dsname, sizeof (ha->failed));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3522 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3523 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3524 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3525
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3526 int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3527 dsl_dataset_user_hold(char *dsname, char *snapname, char *htag,
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3528 boolean_t recursive, boolean_t temphold)
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3529 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3530 struct dsl_ds_holdarg *ha;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3531 dsl_sync_task_t *dst;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3532 spa_t *spa;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3533 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3534
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3535 ha = kmem_zalloc(sizeof (struct dsl_ds_holdarg), KM_SLEEP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3536
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3537 (void) strlcpy(ha->failed, dsname, sizeof (ha->failed));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3538
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3539 error = spa_open(dsname, &spa, FTAG);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3540 if (error) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3541 kmem_free(ha, sizeof (struct dsl_ds_holdarg));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3542 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3543 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3544
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3545 ha->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3546 ha->htag = htag;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3547 ha->snapname = snapname;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3548 ha->recursive = recursive;
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3549 ha->temphold = temphold;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3550 if (recursive) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3551 error = dmu_objset_find(dsname, dsl_dataset_user_hold_one,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3552 ha, DS_FIND_CHILDREN);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3553 } else {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3554 error = dsl_dataset_user_hold_one(dsname, ha);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3555 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3556 if (error == 0)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3557 error = dsl_sync_task_group_wait(ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3558
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3559 for (dst = list_head(&ha->dstg->dstg_tasks); dst;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3560 dst = list_next(&ha->dstg->dstg_tasks, dst)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3561 dsl_dataset_t *ds = dst->dst_arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3562
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3563 if (dst->dst_err) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3564 dsl_dataset_name(ds, ha->failed);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3565 *strchr(ha->failed, '@') = '\0';
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3566 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3567 dsl_dataset_rele(ds, ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3568 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3569
10268
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3570 if (error == 0 && recursive && !ha->gotone)
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3571 error = ENOENT;
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3572
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3573 if (error)
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3574 (void) strlcpy(dsname, ha->failed, sizeof (ha->failed));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3575
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3576 dsl_sync_task_group_destroy(ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3577 kmem_free(ha, sizeof (struct dsl_ds_holdarg));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3578 spa_close(spa, FTAG);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3579 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3580 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3581
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3582 struct dsl_ds_releasearg {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3583 dsl_dataset_t *ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3584 const char *htag;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3585 boolean_t own; /* do we own or just hold ds? */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3586 };
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3587
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3588 static int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3589 dsl_dataset_release_might_destroy(dsl_dataset_t *ds, const char *htag,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3590 boolean_t *might_destroy)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3591 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3592 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3593 uint64_t zapobj;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3594 uint64_t tmp;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3595 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3596
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3597 *might_destroy = B_FALSE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3598
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3599 mutex_enter(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3600 zapobj = ds->ds_phys->ds_userrefs_obj;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3601 if (zapobj == 0) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3602 /* The tag can't possibly exist */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3603 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3604 return (ESRCH);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3605 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3606
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3607 /* Make sure the tag exists */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3608 error = zap_lookup(mos, zapobj, htag, 8, 1, &tmp);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3609 if (error) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3610 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3611 if (error == ENOENT)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3612 error = ESRCH;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3613 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3614 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3615
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3616 if (ds->ds_userrefs == 1 && ds->ds_phys->ds_num_children == 1 &&
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3617 DS_IS_DEFER_DESTROY(ds))
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3618 *might_destroy = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3619
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3620 mutex_exit(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3621 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3622 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3623
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3624 static int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3625 dsl_dataset_user_release_check(void *arg1, void *tag, dmu_tx_t *tx)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3626 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3627 struct dsl_ds_releasearg *ra = arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3628 dsl_dataset_t *ds = ra->ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3629 boolean_t might_destroy;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3630 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3631
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3632 if (spa_version(ds->ds_dir->dd_pool->dp_spa) < SPA_VERSION_USERREFS)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3633 return (ENOTSUP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3634
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3635 error = dsl_dataset_release_might_destroy(ds, ra->htag, &might_destroy);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3636 if (error)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3637 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3638
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3639 if (might_destroy) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3640 struct dsl_ds_destroyarg dsda = {0};
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3641
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3642 if (dmu_tx_is_syncing(tx)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3643 /*
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3644 * If we're not prepared to remove the snapshot,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3645 * we can't allow the release to happen right now.
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3646 */
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3647 if (!ra->own)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3648 return (EBUSY);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3649 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3650 dsda.ds = ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3651 dsda.releasing = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3652 return (dsl_dataset_destroy_check(&dsda, tag, tx));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3653 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3654
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3655 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3656 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3657
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3658 static void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3659 dsl_dataset_user_release_sync(void *arg1, void *tag, dmu_tx_t *tx)
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3660 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3661 struct dsl_ds_releasearg *ra = arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3662 dsl_dataset_t *ds = ra->ds;
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3663 dsl_pool_t *dp = ds->ds_dir->dd_pool;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3664 objset_t *mos = dp->dp_meta_objset;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3665 uint64_t zapobj;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3666 uint64_t dsobj = ds->ds_object;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3667 uint64_t refs;
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3668 int error;
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3669
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3670 if (ds->ds_objset) {
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3671 dmu_objset_evict(ds->ds_objset);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3672 ds->ds_objset = NULL;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3673 }
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3674
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3675 mutex_enter(&ds->ds_lock);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3676 ds->ds_userrefs--;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3677 refs = ds->ds_userrefs;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3678 mutex_exit(&ds->ds_lock);
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3679 error = dsl_pool_user_release(dp, ds->ds_object, ra->htag, tx);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3680 VERIFY(error == 0 || error == ENOENT);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3681 zapobj = ds->ds_phys->ds_userrefs_obj;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3682 VERIFY(0 == zap_remove(mos, zapobj, ra->htag, tx));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3683 if (ds->ds_userrefs == 0 && ds->ds_phys->ds_num_children == 1 &&
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3684 DS_IS_DEFER_DESTROY(ds)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3685 struct dsl_ds_destroyarg dsda = {0};
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3686
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3687 ASSERT(ra->own);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3688 dsda.ds = ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3689 dsda.releasing = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3690 /* We already did the destroy_check */
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3691 dsl_dataset_destroy_sync(&dsda, tag, tx);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3692 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3693
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3694 spa_history_log_internal(LOG_DS_USER_RELEASE,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12295
diff changeset
3695 dp->dp_spa, tx, "<%s> %lld dataset = %llu",
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3696 ra->htag, (longlong_t)refs, dsobj);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3697 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3698
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3699 static int
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3700 dsl_dataset_user_release_one(const char *dsname, void *arg)
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3701 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3702 struct dsl_ds_holdarg *ha = arg;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3703 struct dsl_ds_releasearg *ra;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3704 dsl_dataset_t *ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3705 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3706 void *dtag = ha->dstg;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3707 char *name;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3708 boolean_t own = B_FALSE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3709 boolean_t might_destroy;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3710
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3711 /* alloc a buffer to hold dsname@snapname, plus the terminating NULL */
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3712 name = kmem_asprintf("%s@%s", dsname, ha->snapname);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3713 error = dsl_dataset_hold(name, dtag, &ds);
10272
a0669934e974 6861581 ZFS frees in synching context during rollback
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10268
diff changeset
3714 strfree(name);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3715 if (error == ENOENT && ha->recursive)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3716 return (0);
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3717 (void) strlcpy(ha->failed, dsname, sizeof (ha->failed));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3718 if (error)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3719 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3720
10268
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3721 ha->gotone = B_TRUE;
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3722
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3723 ASSERT(dsl_dataset_is_snapshot(ds));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3724
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3725 error = dsl_dataset_release_might_destroy(ds, ha->htag, &might_destroy);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3726 if (error) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3727 dsl_dataset_rele(ds, dtag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3728 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3729 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3730
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3731 if (might_destroy) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3732 #ifdef _KERNEL
12115
3655f38d3bea 6942295 use-after-free panic in dsl_dataset_user_release_one
Chris Kirby <Chris.Kirby@oracle.com>
parents: 11823
diff changeset
3733 name = kmem_asprintf("%s@%s", dsname, ha->snapname);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3734 error = zfs_unmount_snap(name, NULL);
12115
3655f38d3bea 6942295 use-after-free panic in dsl_dataset_user_release_one
Chris Kirby <Chris.Kirby@oracle.com>
parents: 11823
diff changeset
3735 strfree(name);
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3736 if (error) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3737 dsl_dataset_rele(ds, dtag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3738 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3739 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3740 #endif
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3741 if (!dsl_dataset_tryown(ds, B_TRUE, dtag)) {
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3742 dsl_dataset_rele(ds, dtag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3743 return (EBUSY);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3744 } else {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3745 own = B_TRUE;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3746 dsl_dataset_make_exclusive(ds, dtag);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3747 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3748 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3749
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3750 ra = kmem_alloc(sizeof (struct dsl_ds_releasearg), KM_SLEEP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3751 ra->ds = ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3752 ra->htag = ha->htag;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3753 ra->own = own;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3754 dsl_sync_task_create(ha->dstg, dsl_dataset_user_release_check,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3755 dsl_dataset_user_release_sync, ra, dtag, 0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3756
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3757 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3758 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3759
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3760 int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3761 dsl_dataset_user_release(char *dsname, char *snapname, char *htag,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3762 boolean_t recursive)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3763 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3764 struct dsl_ds_holdarg *ha;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3765 dsl_sync_task_t *dst;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3766 spa_t *spa;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3767 int error;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3768
11546
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3769 top:
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3770 ha = kmem_zalloc(sizeof (struct dsl_ds_holdarg), KM_SLEEP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3771
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3772 (void) strlcpy(ha->failed, dsname, sizeof (ha->failed));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3773
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3774 error = spa_open(dsname, &spa, FTAG);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3775 if (error) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3776 kmem_free(ha, sizeof (struct dsl_ds_holdarg));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3777 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3778 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3779
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3780 ha->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3781 ha->htag = htag;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3782 ha->snapname = snapname;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3783 ha->recursive = recursive;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3784 if (recursive) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3785 error = dmu_objset_find(dsname, dsl_dataset_user_release_one,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3786 ha, DS_FIND_CHILDREN);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3787 } else {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3788 error = dsl_dataset_user_release_one(dsname, ha);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3789 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3790 if (error == 0)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3791 error = dsl_sync_task_group_wait(ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3792
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3793 for (dst = list_head(&ha->dstg->dstg_tasks); dst;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3794 dst = list_next(&ha->dstg->dstg_tasks, dst)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3795 struct dsl_ds_releasearg *ra = dst->dst_arg1;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3796 dsl_dataset_t *ds = ra->ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3797
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3798 if (dst->dst_err)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3799 dsl_dataset_name(ds, ha->failed);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3800
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3801 if (ra->own)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3802 dsl_dataset_disown(ds, ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3803 else
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3804 dsl_dataset_rele(ds, ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3805
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3806 kmem_free(ra, sizeof (struct dsl_ds_releasearg));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3807 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3808
10268
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3809 if (error == 0 && recursive && !ha->gotone)
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3810 error = ENOENT;
cb380b2e9410 6868130 ZFS hold/release "zfs hold -r tag snapshot" failed to check the existence of snapshot
Chris Kirby <chris.kirby@sun.com>
parents: 10242
diff changeset
3811
11546
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3812 if (error && error != EBUSY)
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3813 (void) strlcpy(dsname, ha->failed, sizeof (ha->failed));
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3814
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3815 dsl_sync_task_group_destroy(ha->dstg);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3816 kmem_free(ha, sizeof (struct dsl_ds_holdarg));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3817 spa_close(spa, FTAG);
11546
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3818
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3819 /*
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3820 * We can get EBUSY if we were racing with deferred destroy and
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3821 * dsl_dataset_user_release_check() hadn't done the necessary
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3822 * open context setup. We can also get EBUSY if we're racing
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3823 * with destroy and that thread is the ds_owner. Either way
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3824 * the busy condition should be transient, and we should retry
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3825 * the release operation.
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3826 */
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3827 if (error == EBUSY)
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3828 goto top;
42ea6be8961b 6915111 zfs_iter_snapshots() can miss snapshots
Chris Kirby <Chris.Kirby@sun.com>
parents: 11209
diff changeset
3829
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3830 return (error);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3831 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3832
10342
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3833 /*
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3834 * Called at spa_load time to release a stale temporary user hold.
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3835 */
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3836 int
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3837 dsl_dataset_user_release_tmp(dsl_pool_t *dp, uint64_t dsobj, char *htag)
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3838 {
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3839 dsl_dataset_t *ds;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3840 char *snap;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3841 char *name;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3842 int namelen;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3843 int error;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3844
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3845 rw_enter(&dp->dp_config_rwlock, RW_READER);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3846 error = dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3847 rw_exit(&dp->dp_config_rwlock);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3848 if (error)
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3849 return (error);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3850 namelen = dsl_dataset_namelen(ds)+1;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3851 name = kmem_alloc(namelen, KM_SLEEP);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3852 dsl_dataset_name(ds, name);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3853 dsl_dataset_rele(ds, FTAG);
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3854
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3855 snap = strchr(name, '@');
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3856 *snap = '\0';
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3857 ++snap;
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3858 return (dsl_dataset_user_release(name, snap, htag, B_FALSE));
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3859 }
108f0058f837 6833815 scheduled snapshots deleted per snapshot policy can lead to replication failures
Chris Kirby <chris.kirby@sun.com>
parents: 10298
diff changeset
3860
10242
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3861 int
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3862 dsl_dataset_get_holds(const char *dsname, nvlist_t **nvp)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3863 {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3864 dsl_dataset_t *ds;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3865 int err;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3866
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3867 err = dsl_dataset_hold(dsname, FTAG, &ds);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3868 if (err)
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3869 return (err);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3870
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3871 VERIFY(0 == nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3872 if (ds->ds_phys->ds_userrefs_obj != 0) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3873 zap_attribute_t *za;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3874 zap_cursor_t zc;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3875
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3876 za = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3877 for (zap_cursor_init(&zc, ds->ds_dir->dd_pool->dp_meta_objset,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3878 ds->ds_phys->ds_userrefs_obj);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3879 zap_cursor_retrieve(&zc, za) == 0;
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3880 zap_cursor_advance(&zc)) {
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3881 VERIFY(0 == nvlist_add_uint64(*nvp, za->za_name,
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3882 za->za_first_integer));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3883 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3884 zap_cursor_fini(&zc);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3885 kmem_free(za, sizeof (zap_attribute_t));
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3886 }
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3887 dsl_dataset_rele(ds, FTAG);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3888 return (0);
c40d075fbca6 PSARC/2009/297 zfs snapshot holds
Chris Kirby <chris.kirby@sun.com>
parents: 10204
diff changeset
3889 }
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3890
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3891 /*
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3892 * Note, this fuction is used as the callback for dmu_objset_find(). We
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3893 * always return 0 so that we will continue to find and process
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3894 * inconsistent datasets, even if we encounter an error trying to
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3895 * process one of them.
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3896 */
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3897 /* ARGSUSED */
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3898 int
11209
462283cb4096 6905188 panic: kernel heap corruption when doing "zfs rename -r"
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11022
diff changeset
3899 dsl_destroy_inconsistent(const char *dsname, void *arg)
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3900 {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3901 dsl_dataset_t *ds;
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3902
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3903 if (dsl_dataset_own(dsname, B_TRUE, FTAG, &ds) == 0) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3904 if (DS_IS_INCONSISTENT(ds))
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3905 (void) dsl_dataset_destroy(ds, FTAG, B_FALSE);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3906 else
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3907 dsl_dataset_disown(ds, FTAG);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3908 }
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3909 return (0);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10272
diff changeset
3910 }