mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-27 03:19:35 +03:00
Fix ENXIO from spa_ld_verify_logs() in ztest
This patch fixes a small issue where the zil_check_log_chain() code path would hit an EBUSY error. This would occur when 2 threads attempted to call metaslab_activate() at the same time. In this case, the "loser" would receive an error code which should have been ignored, but was instead floated to the caller. This ended up resulting in an ENXIO being returned from from spa_ld_verify_logs(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Serapheim Dimitropoulos <serapheim.dimitro@delphix.com> Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Signed-off-by: Tom Caputi <tcaputi@datto.com> Closes #8010
This commit is contained in:
parent
4a7eb69a5a
commit
7ab96299e5
@ -2049,7 +2049,7 @@ metaslab_activate(metaslab_t *msp, int allocator, uint64_t activation_weight)
|
|||||||
* The metaslab was activated for another allocator
|
* The metaslab was activated for another allocator
|
||||||
* while we were waiting, we should reselect.
|
* while we were waiting, we should reselect.
|
||||||
*/
|
*/
|
||||||
return (EBUSY);
|
return (SET_ERROR(EBUSY));
|
||||||
}
|
}
|
||||||
if ((error = metaslab_activate_allocator(msp->ms_group, msp,
|
if ((error = metaslab_activate_allocator(msp->ms_group, msp,
|
||||||
allocator, activation_weight)) != 0) {
|
allocator, activation_weight)) != 0) {
|
||||||
@ -3886,15 +3886,21 @@ metaslab_claim_concrete(vdev_t *vd, uint64_t offset, uint64_t size,
|
|||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
if (offset >> vd->vdev_ms_shift >= vd->vdev_ms_count)
|
if (offset >> vd->vdev_ms_shift >= vd->vdev_ms_count)
|
||||||
return (ENXIO);
|
return (SET_ERROR(ENXIO));
|
||||||
|
|
||||||
ASSERT3P(vd->vdev_ms, !=, NULL);
|
ASSERT3P(vd->vdev_ms, !=, NULL);
|
||||||
msp = vd->vdev_ms[offset >> vd->vdev_ms_shift];
|
msp = vd->vdev_ms[offset >> vd->vdev_ms_shift];
|
||||||
|
|
||||||
mutex_enter(&msp->ms_lock);
|
mutex_enter(&msp->ms_lock);
|
||||||
|
|
||||||
if ((txg != 0 && spa_writeable(spa)) || !msp->ms_loaded)
|
if ((txg != 0 && spa_writeable(spa)) || !msp->ms_loaded) {
|
||||||
error = metaslab_activate(msp, 0, METASLAB_WEIGHT_CLAIM);
|
error = metaslab_activate(msp, 0, METASLAB_WEIGHT_CLAIM);
|
||||||
|
if (error == EBUSY) {
|
||||||
|
ASSERT(msp->ms_loaded);
|
||||||
|
ASSERT(msp->ms_weight & METASLAB_ACTIVE_MASK);
|
||||||
|
error = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (error == 0 &&
|
if (error == 0 &&
|
||||||
!range_tree_contains(msp->ms_allocatable, offset, size))
|
!range_tree_contains(msp->ms_allocatable, offset, size))
|
||||||
|
Loading…
Reference in New Issue
Block a user