summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorGeorge Wilson <George.Wilson@Sun.COM>2010-05-03 11:16:14 -0700
committerGeorge Wilson <George.Wilson@Sun.COM>2010-05-03 11:16:14 -0700
commit3113f7cee6785cfe8d9e78c535cf9e2a79283275 (patch)
tree30eae80fd95e19d251f772e6fe21d51366db3273 /usr/src
parent55da60b91d96984f12de050ce428373ea25c7f35 (diff)
downloadillumos-joyent-3113f7cee6785cfe8d9e78c535cf9e2a79283275.tar.gz
6948911 snapshot deletion can induce unsatisfiable allocations in txg sync
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_dataset.c7
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_scrub.c10
-rw-r--r--usr/src/uts/common/fs/zfs/sys/dsl_pool.h5
3 files changed, 16 insertions, 6 deletions
diff --git a/usr/src/uts/common/fs/zfs/dsl_dataset.c b/usr/src/uts/common/fs/zfs/dsl_dataset.c
index 1e0ac2c76a..ee0ccd7d01 100644
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c
+++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c
@@ -1598,6 +1598,7 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, cred_t *cr, dmu_tx_t *tx)
if (ds->ds_phys->ds_next_snap_obj != 0) {
blkptr_t bp;
+ zio_t *pio;
dsl_dataset_t *ds_next;
uint64_t itor = 0;
uint64_t old_unique;
@@ -1617,6 +1618,8 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, cred_t *cr, dmu_tx_t *tx)
ASSERT3U(ds->ds_phys->ds_prev_snap_txg, ==,
ds_prev ? ds_prev->ds_phys->ds_creation_txg : 0);
+ pio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
+
/*
* Transfer to our deadlist (which will become next's
* new deadlist) any entries from next's current
@@ -1639,10 +1642,10 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, cred_t *cr, dmu_tx_t *tx)
used += bp_get_dsize_sync(dp->dp_spa, &bp);
compressed += BP_GET_PSIZE(&bp);
uncompressed += BP_GET_UCSIZE(&bp);
- dsl_free(dp, tx->tx_txg, &bp);
+ dsl_free_sync(pio, dp, tx->tx_txg, &bp);
}
}
-
+ VERIFY3U(zio_wait(pio), ==, 0);
ASSERT3U(used, ==, ds->ds_phys->ds_unique_bytes);
/* change snapused */
diff --git a/usr/src/uts/common/fs/zfs/dsl_scrub.c b/usr/src/uts/common/fs/zfs/dsl_scrub.c
index 269e1c4f6f..b16ff66586 100644
--- a/usr/src/uts/common/fs/zfs/dsl_scrub.c
+++ b/usr/src/uts/common/fs/zfs/dsl_scrub.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/dsl_pool.h>
@@ -272,6 +271,13 @@ dsl_free(dsl_pool_t *dp, uint64_t txg, const blkptr_t *bpp)
zio_free(dp->dp_spa, txg, bpp);
}
+void
+dsl_free_sync(zio_t *pio, dsl_pool_t *dp, uint64_t txg, const blkptr_t *bpp)
+{
+ ASSERT(dsl_pool_sync_context(dp));
+ zio_nowait(zio_free_sync(pio, dp->dp_spa, txg, bpp, pio->io_flags));
+}
+
static boolean_t
bookmark_is_zero(const zbookmark_t *zb)
{
diff --git a/usr/src/uts/common/fs/zfs/sys/dsl_pool.h b/usr/src/uts/common/fs/zfs/sys/dsl_pool.h
index 4e49d212a3..97541ad2f1 100644
--- a/usr/src/uts/common/fs/zfs/sys/dsl_pool.h
+++ b/usr/src/uts/common/fs/zfs/sys/dsl_pool.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _SYS_DSL_POOL_H
@@ -137,6 +136,8 @@ void dsl_pool_tempreserve_clear(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx);
void dsl_pool_memory_pressure(dsl_pool_t *dp);
void dsl_pool_willuse_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx);
void dsl_free(dsl_pool_t *dp, uint64_t txg, const blkptr_t *bpp);
+void dsl_free_sync(zio_t *pio, dsl_pool_t *dp, uint64_t txg,
+ const blkptr_t *bpp);
void dsl_pool_ds_destroyed(struct dsl_dataset *ds, struct dmu_tx *tx);
void dsl_pool_ds_snapshotted(struct dsl_dataset *ds, struct dmu_tx *tx);
void dsl_pool_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2,