git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Rebase master to b105
[zfs.git]
/
module
/
zfs
/
metaslab.c
diff --git
a/module/zfs/metaslab.c
b/module/zfs/metaslab.c
index
87727fa
..
4128329
100644
(file)
--- 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;
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;
uint64_t offset = -1ULL;
uint64_t asize;
uint64_t distance;
@@
-778,11
+780,20
@@
top:
all_zero = B_TRUE;
do {
vd = mg->mg_vd;
all_zero = B_TRUE;
do {
vd = mg->mg_vd;
+
/*
* Don't allocate from faulted devices.
*/
/*
* 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;
goto next;
+
/*
* Avoid writing single-copy data to a failing vdev
*/
/*
* Avoid writing single-copy data to a failing vdev
*/
@@
-858,6
+869,12
@@
next:
goto top;
}
goto top;
}
+ if (!zio_lock) {
+ dshift = 3;
+ zio_lock = B_TRUE;
+ goto top;
+ }
+
bzero(&dva[d], sizeof (dva_t));
return (ENOSPC);
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);
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);
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);