usr/src/uts/common/fs/zfs/dsl_synctask.c
author Lin Ling <Lin.Ling@Sun.COM>
Mon, 03 May 2010 14:54:08 -0700
changeset 12296 7cf402a7f374
parent 11823 c756cd80d532
child 13061 bda0decf867b
permissions -rw-r--r--
6675946 'zpool status' should show the progress of resilvering for individual disk. 6683750 scrub -s have to wait until resilver completed? 6841252 Resilvering not restartable - causing an excess reboot delay 6855073 spa scrub stats (eg %done) are reset on reboot 6891824 7410 NAS head "continually resilvering" following HDD replacement 6899970 scrub/resilver percent complete reporting in zpool status can be overly optimistic 6940889 add interval (count) args to zpool list 6944623 dbuf_read_done() locking performance improvement 6946760 mutex problem in bplist_enqueue() 6391915 RFE: provide interval arg to zpool status to monitor resilvering 6946512 want zfs_send() to pass back debug info 6943992 'zpool scrub' should not restart the existing scrub silently 6878281 zpool should store the time of last scrub/resilver and other zpool status info in pool properties. 6935158 Assertion failed: used <= spa_get_dspace(dd->dd_pool->dp_spa) 6944388 dsl_dataset_snapshot_reserve_space() causes dp_write_limit=max
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
/*
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11823
diff changeset
    22
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    23
 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    24
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    25
#include <sys/dmu.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    26
#include <sys/dmu_tx.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    27
#include <sys/dsl_pool.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    28
#include <sys/dsl_dir.h>
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    29
#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
    30
#include <sys/metaslab.h>
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    31
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    32
#define	DST_AVG_BLKSHIFT 14
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    33
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    34
/* ARGSUSED */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    35
static int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    36
dsl_null_checkfunc(void *arg1, void *arg2, dmu_tx_t *tx)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    37
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    38
	return (0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    39
}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    40
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    41
dsl_sync_task_group_t *
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    42
dsl_sync_task_group_create(dsl_pool_t *dp)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    43
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    44
	dsl_sync_task_group_t *dstg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    45
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    46
	dstg = kmem_zalloc(sizeof (dsl_sync_task_group_t), KM_SLEEP);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    47
	list_create(&dstg->dstg_tasks, sizeof (dsl_sync_task_t),
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    48
	    offsetof(dsl_sync_task_t, dst_node));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    49
	dstg->dstg_pool = dp;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    50
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    51
	return (dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    52
}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    53
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    54
void
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    55
dsl_sync_task_create(dsl_sync_task_group_t *dstg,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    56
    dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    57
    void *arg1, void *arg2, int blocks_modified)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    58
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    59
	dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    60
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    61
	if (checkfunc == NULL)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    62
		checkfunc = dsl_null_checkfunc;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    63
	dst = kmem_zalloc(sizeof (dsl_sync_task_t), KM_SLEEP);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    64
	dst->dst_checkfunc = checkfunc;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    65
	dst->dst_syncfunc = syncfunc;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    66
	dst->dst_arg1 = arg1;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    67
	dst->dst_arg2 = arg2;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    68
	list_insert_tail(&dstg->dstg_tasks, dst);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    69
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    70
	dstg->dstg_space += blocks_modified << DST_AVG_BLKSHIFT;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    71
}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    72
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    73
int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    74
dsl_sync_task_group_wait(dsl_sync_task_group_t *dstg)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    75
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    76
	dmu_tx_t *tx;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    77
	uint64_t txg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    78
	dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    79
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    80
top:
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    81
	tx = dmu_tx_create_dd(dstg->dstg_pool->dp_mos_dir);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    82
	VERIFY(0 == dmu_tx_assign(tx, TXG_WAIT));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    83
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    84
	txg = dmu_tx_get_txg(tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    85
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    86
	/* Do a preliminary error check. */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    87
	dstg->dstg_err = 0;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    88
	rw_enter(&dstg->dstg_pool->dp_config_rwlock, RW_READER);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    89
	for (dst = list_head(&dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    90
	    dst = list_next(&dstg->dstg_tasks, dst)) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    91
#ifdef ZFS_DEBUG
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    92
		/*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    93
		 * Only check half the time, otherwise, the sync-context
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    94
		 * check will almost never fail.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    95
		 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    96
		if (spa_get_random(2) == 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    97
			continue;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    98
#endif
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
    99
		dst->dst_err =
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   100
		    dst->dst_checkfunc(dst->dst_arg1, dst->dst_arg2, tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   101
		if (dst->dst_err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   102
			dstg->dstg_err = dst->dst_err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   103
	}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   104
	rw_exit(&dstg->dstg_pool->dp_config_rwlock);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   105
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   106
	if (dstg->dstg_err) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   107
		dmu_tx_commit(tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   108
		return (dstg->dstg_err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   109
	}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   110
11816
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
   111
	/*
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
   112
	 * 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
   113
	 * 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
   114
	 */
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
   115
	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
   116
	    dstg, txg));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   117
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   118
	dmu_tx_commit(tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   119
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   120
	txg_wait_synced(dstg->dstg_pool, txg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   121
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 5378
diff changeset
   122
	if (dstg->dstg_err == EAGAIN) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 5378
diff changeset
   123
		txg_wait_synced(dstg->dstg_pool, txg + TXG_DEFER_SIZE);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   124
		goto top;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 5378
diff changeset
   125
	}
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   126
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   127
	return (dstg->dstg_err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   128
}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   129
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   130
void
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   131
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
   132
{
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   133
	uint64_t txg;
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   134
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   135
	dstg->dstg_nowaiter = B_TRUE;
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   136
	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
   137
	/*
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
   138
	 * 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
   139
	 * 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
   140
	 */
a30797f77200 6928246 spa_history_log should use dsl_sync_task_do_nowait
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10922
diff changeset
   141
	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
   142
	    dstg, txg));
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   143
}
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   144
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   145
void
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   146
dsl_sync_task_group_destroy(dsl_sync_task_group_t *dstg)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   147
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   148
	dsl_sync_task_t *dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   149
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   150
	while (dst = list_head(&dstg->dstg_tasks)) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   151
		list_remove(&dstg->dstg_tasks, dst);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   152
		kmem_free(dst, sizeof (dsl_sync_task_t));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   153
	}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   154
	kmem_free(dstg, sizeof (dsl_sync_task_group_t));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   155
}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   156
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   157
void
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   158
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
   159
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   160
	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
   161
	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
   162
	uint64_t quota, used;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   163
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   164
	ASSERT3U(dstg->dstg_err, ==, 0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   165
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   166
	/*
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
   167
	 * 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
   168
	 * 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
   169
	 * 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
   170
	 * in-core limits (arc_tempreserve, dsl_pool_tempreserve).
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   171
	 */
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
   172
	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
   173
	    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
   174
	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
   175
	/* 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
   176
	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
   177
		dstg->dstg_err = ENOSPC;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   178
		return;
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
   179
	}
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   180
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   181
	/*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   182
	 * Check for errors by calling checkfuncs.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   183
	 */
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
   184
	rw_enter(&dp->dp_config_rwlock, RW_WRITER);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   185
	for (dst = list_head(&dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   186
	    dst = list_next(&dstg->dstg_tasks, dst)) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   187
		dst->dst_err =
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   188
		    dst->dst_checkfunc(dst->dst_arg1, dst->dst_arg2, tx);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   189
		if (dst->dst_err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   190
			dstg->dstg_err = dst->dst_err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   191
	}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   192
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   193
	if (dstg->dstg_err == 0) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   194
		/*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   195
		 * Execute sync tasks.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   196
		 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   197
		for (dst = list_head(&dstg->dstg_tasks); dst;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   198
		    dst = list_next(&dstg->dstg_tasks, dst)) {
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11823
diff changeset
   199
			dst->dst_syncfunc(dst->dst_arg1, dst->dst_arg2, tx);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   200
		}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   201
	}
11822
9195ca3173d2 6929652 dsl_sync_task_group_wait() can wait too long
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 11816
diff changeset
   202
	rw_exit(&dp->dp_config_rwlock);
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   203
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   204
	if (dstg->dstg_nowaiter)
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   205
		dsl_sync_task_group_destroy(dstg);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   206
}
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   207
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   208
int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   209
dsl_sync_task_do(dsl_pool_t *dp,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   210
    dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   211
    void *arg1, void *arg2, int blocks_modified)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   212
{
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   213
	dsl_sync_task_group_t *dstg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   214
	int err;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   215
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   216
	dstg = dsl_sync_task_group_create(dp);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   217
	dsl_sync_task_create(dstg, checkfunc, syncfunc,
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   218
	    arg1, arg2, blocks_modified);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   219
	err = dsl_sync_task_group_wait(dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   220
	dsl_sync_task_group_destroy(dstg);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   221
	return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents:
diff changeset
   222
}
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   223
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   224
void
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   225
dsl_sync_task_do_nowait(dsl_pool_t *dp,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   226
    dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   227
    void *arg1, void *arg2, int blocks_modified, dmu_tx_t *tx)
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   228
{
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   229
	dsl_sync_task_group_t *dstg;
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   230
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   231
	dstg = dsl_sync_task_group_create(dp);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   232
	dsl_sync_task_create(dstg, checkfunc, syncfunc,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   233
	    arg1, arg2, blocks_modified);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   234
	dsl_sync_task_group_nowait(dstg, tx);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
   235
}