diff options
author | Brian Behlendorf <[email protected]> | 2009-01-15 13:59:39 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2009-01-15 13:59:39 -0800 |
commit | fb5f0bc83330c8a0236c4d34a23723ac1974971a (patch) | |
tree | 51880dcfa8ec9e8e80b8c44e9ffc55a4b7160216 /module/zfs/metaslab.c | |
parent | 42bcb36c8987b0b11411ce6cf8339694b624a17c (diff) |
Rebase master to b105
Diffstat (limited to 'module/zfs/metaslab.c')
-rw-r--r-- | module/zfs/metaslab.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c index 87727fac2..412832968 100644 --- a/module/zfs/metaslab.c +++ b/module/zfs/metaslab.c @@ -720,6 +720,8 @@ metaslab_alloc_dva(spa_t *spa, metaslab_class_t *mc, uint64_t psize, vdev_t *vd; int dshift = 3; int all_zero; + int zio_lock = B_FALSE; + boolean_t allocatable; uint64_t offset = -1ULL; uint64_t asize; uint64_t distance; @@ -778,11 +780,20 @@ top: all_zero = B_TRUE; do { vd = mg->mg_vd; + /* * Don't allocate from faulted devices. */ - if (!vdev_allocatable(vd)) + if (zio_lock) { + spa_config_enter(spa, SCL_ZIO, FTAG, RW_READER); + allocatable = vdev_allocatable(vd); + spa_config_exit(spa, SCL_ZIO, FTAG); + } else { + allocatable = vdev_allocatable(vd); + } + if (!allocatable) goto next; + /* * Avoid writing single-copy data to a failing vdev */ @@ -858,6 +869,12 @@ next: goto top; } + if (!zio_lock) { + dshift = 3; + zio_lock = B_TRUE; + goto top; + } + bzero(&dva[d], sizeof (dva_t)); return (ENOSPC); @@ -946,7 +963,7 @@ metaslab_claim_dva(spa_t *spa, const dva_t *dva, uint64_t txg) space_map_claim(&msp->ms_map, offset, size); - if (spa_mode & FWRITE) { /* don't dirty if we're zdb(1M) */ + if (spa_writeable(spa)) { /* don't dirty if we're zdb(1M) */ if (msp->ms_allocmap[txg & TXG_MASK].sm_space == 0) vdev_dirty(vd, VDD_METASLAB, msp, txg); space_map_add(&msp->ms_allocmap[txg & TXG_MASK], offset, size); |