annotate usr/src/uts/common/fs/zfs/dsl_synctask.c @ 11823:c756cd80d532

6930022 zfs rename of non-shapshot is slower than necessary
author Matthew Ahrens <Matthew.Ahrens@Sun.COM>
date Thu, 25 Feb 2010 14:08:36 -0800
parents 9195ca3173d2
children 7cf402a7f374
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
1 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
2 * CDDL HEADER START
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
3 *
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
7 *
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
10 * See the License for the specific language governing permissions
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
11 * and limitations under the License.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
12 *
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
18 *
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
19 * CDDL HEADER END
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
20 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
21 /*
11816
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
23 * Use is subject to license terms.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
24 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
25
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
26 #include <sys/dmu.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
27 #include <sys/dmu_tx.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
28 #include <sys/dsl_pool.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
29 #include <sys/dsl_dir.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
30 #include <sys/dsl_synctask.h>
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
31 #include <sys/metaslab.h>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2532
diff changeset
32 #include <sys/cred.h>
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
33
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
34 #define DST_AVG_BLKSHIFT 14
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
35
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
36 /* ARGSUSED */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
37 static int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
38 dsl_null_checkfunc(void *arg1, void *arg2, dmu_tx_t *tx)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
39 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
40 return (0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
41 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
42
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
43 dsl_sync_task_group_t *
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
44 dsl_sync_task_group_create(dsl_pool_t *dp)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
45 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
46 dsl_sync_task_group_t *dstg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
47
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
48 dstg = kmem_zalloc(sizeof (dsl_sync_task_group_t), KM_SLEEP);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
49 list_create(&dstg->dstg_tasks, sizeof (dsl_sync_task_t),
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
50 offsetof(dsl_sync_task_t, dst_node));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
51 dstg->dstg_pool = dp;
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
52 dstg->dstg_cr = CRED();
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
53
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
54 return (dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
55 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
56
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
57 void
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
58 dsl_sync_task_create(dsl_sync_task_group_t *dstg,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
59 dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
60 void *arg1, void *arg2, int blocks_modified)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
61 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
62 dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
63
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
64 if (checkfunc == NULL)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
65 checkfunc = dsl_null_checkfunc;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
66 dst = kmem_zalloc(sizeof (dsl_sync_task_t), KM_SLEEP);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
67 dst->dst_checkfunc = checkfunc;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
68 dst->dst_syncfunc = syncfunc;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
69 dst->dst_arg1 = arg1;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
70 dst->dst_arg2 = arg2;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
71 list_insert_tail(&dstg->dstg_tasks, dst);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
72
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
73 dstg->dstg_space += blocks_modified << DST_AVG_BLKSHIFT;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
74 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
75
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
76 int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
77 dsl_sync_task_group_wait(dsl_sync_task_group_t *dstg)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
78 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
79 dmu_tx_t *tx;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
80 uint64_t txg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
81 dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
82
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
83 top:
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
84 tx = dmu_tx_create_dd(dstg->dstg_pool->dp_mos_dir);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
85 VERIFY(0 == dmu_tx_assign(tx, TXG_WAIT));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
86
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
87 txg = dmu_tx_get_txg(tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
88
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
89 /* Do a preliminary error check. */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
90 dstg->dstg_err = 0;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
91 rw_enter(&dstg->dstg_pool->dp_config_rwlock, RW_READER);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
92 for (dst = list_head(&dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
93 dst = list_next(&dstg->dstg_tasks, dst)) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
94 #ifdef ZFS_DEBUG
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
95 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
96 * Only check half the time, otherwise, the sync-context
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
97 * check will almost never fail.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
98 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
99 if (spa_get_random(2) == 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
100 continue;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
101 #endif
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
102 dst->dst_err =
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
103 dst->dst_checkfunc(dst->dst_arg1, dst->dst_arg2, tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
104 if (dst->dst_err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
105 dstg->dstg_err = dst->dst_err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
106 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
107 rw_exit(&dstg->dstg_pool->dp_config_rwlock);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
108
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
109 if (dstg->dstg_err) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
110 dmu_tx_commit(tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
111 return (dstg->dstg_err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
112 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
113
11816
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
114 /*
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
115 * We don't generally have many sync tasks, so pay the price of
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
116 * add_tail to get the tasks executed in the right order.
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
117 */
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
118 VERIFY(0 == txg_list_add_tail(&dstg->dstg_pool->dp_sync_tasks,
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
119 dstg, txg));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
120
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
121 dmu_tx_commit(tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
122
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
123 txg_wait_synced(dstg->dstg_pool, txg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
124
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 5378
diff changeset
125 if (dstg->dstg_err == EAGAIN) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 5378
diff changeset
126 txg_wait_synced(dstg->dstg_pool, txg + TXG_DEFER_SIZE);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
127 goto top;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 5378
diff changeset
128 }
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
129
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
130 return (dstg->dstg_err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
131 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
132
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
133 void
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
134 dsl_sync_task_group_nowait(dsl_sync_task_group_t *dstg, dmu_tx_t *tx)
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
135 {
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
136 uint64_t txg;
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
137
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
138 dstg->dstg_nowaiter = B_TRUE;
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
139 dstg->dstg_cr = NULL; /* it won't be valid by the time we sync */
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
140 txg = dmu_tx_get_txg(tx);
11816
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
141 /*
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
142 * We don't generally have many sync tasks, so pay the price of
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
143 * add_tail to get the tasks executed in the right order.
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
144 */
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
145 VERIFY(0 == txg_list_add_tail(&dstg->dstg_pool->dp_sync_tasks,
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
146 dstg, txg));
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
147 }
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
148
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
149 void
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
150 dsl_sync_task_group_destroy(dsl_sync_task_group_t *dstg)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
151 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
152 dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
153
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
154 while (dst = list_head(&dstg->dstg_tasks)) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
155 list_remove(&dstg->dstg_tasks, dst);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
156 kmem_free(dst, sizeof (dsl_sync_task_t));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
157 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
158 kmem_free(dstg, sizeof (dsl_sync_task_group_t));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
159 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
160
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
161 void
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
162 dsl_sync_task_group_sync(dsl_sync_task_group_t *dstg, dmu_tx_t *tx)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
163 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
164 dsl_sync_task_t *dst;
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
165 dsl_pool_t *dp = dstg->dstg_pool;
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
166 uint64_t quota, used;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
167
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
168 ASSERT3U(dstg->dstg_err, ==, 0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
169
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
170 /*
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
171 * Check for sufficient space. We just check against what's
11823
c756cd80d532 6930022 zfs rename of non-shapshot is slower than necessary
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11822
diff changeset
172 * on-disk; we don't want any in-flight accounting to get in our
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
173 * way, because open context may have already used up various
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
174 * in-core limits (arc_tempreserve, dsl_pool_tempreserve).
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
175 */
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
176 quota = dsl_pool_adjustedsize(dp, B_FALSE) -
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
177 metaslab_class_get_deferred(spa_normal_class(dp->dp_spa));
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
178 used = dp->dp_root_dir->dd_phys->dd_used_bytes;
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
179 /* MOS space is triple-dittoed, so we multiply by 3. */
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
180 if (dstg->dstg_space > 0 && used + dstg->dstg_space * 3 > quota) {
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
181 dstg->dstg_err = ENOSPC;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
182 return;
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
183 }
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
184
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
185 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
186 * Check for errors by calling checkfuncs.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
187 */
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
188 rw_enter(&dp->dp_config_rwlock, RW_WRITER);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
189 for (dst = list_head(&dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
190 dst = list_next(&dstg->dstg_tasks, dst)) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
191 dst->dst_err =
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
192 dst->dst_checkfunc(dst->dst_arg1, dst->dst_arg2, tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
193 if (dst->dst_err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
194 dstg->dstg_err = dst->dst_err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
195 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
196
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
197 if (dstg->dstg_err == 0) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
198 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
199 * Execute sync tasks.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
200 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
201 for (dst = list_head(&dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
202 dst = list_next(&dstg->dstg_tasks, dst)) {
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 2532
diff changeset
203 dst->dst_syncfunc(dst->dst_arg1, dst->dst_arg2,
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
204 dstg->dstg_cr, tx);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
205 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
206 }
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
207 rw_exit(&dp->dp_config_rwlock);
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
208
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
209 if (dstg->dstg_nowaiter)
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
210 dsl_sync_task_group_destroy(dstg);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
211 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
212
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
213 int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
214 dsl_sync_task_do(dsl_pool_t *dp,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
215 dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
216 void *arg1, void *arg2, int blocks_modified)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
217 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
218 dsl_sync_task_group_t *dstg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
219 int err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
220
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
221 dstg = dsl_sync_task_group_create(dp);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
222 dsl_sync_task_create(dstg, checkfunc, syncfunc,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
223 arg1, arg2, blocks_modified);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
224 err = dsl_sync_task_group_wait(dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
225 dsl_sync_task_group_destroy(dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
226 return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
227 }
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
228
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
229 void
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
230 dsl_sync_task_do_nowait(dsl_pool_t *dp,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
231 dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
232 void *arg1, void *arg2, int blocks_modified, dmu_tx_t *tx)
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
233 {
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
234 dsl_sync_task_group_t *dstg;
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
235
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
236 dstg = dsl_sync_task_group_create(dp);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
237 dsl_sync_task_create(dstg, checkfunc, syncfunc,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
238 arg1, arg2, blocks_modified);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
239 dsl_sync_task_group_nowait(dstg, tx);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
240 }