mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 18:11:00 +03:00
Fix unfortunate NULL in spa_update_dspace
After 1325434b
, we can in certain circumstances end up calling
spa_update_dspace with vd->vdev_mg NULL, which ends poorly during
vdev removal.
So let's not do that further space adjustment when we can't.
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rich Ercolani <rincebrain@gmail.com>
Closes #12380
Closes #12428
This commit is contained in:
parent
1b06b03a7b
commit
f1ca7999bb
@ -1853,7 +1853,14 @@ spa_update_dspace(spa_t *spa)
|
|||||||
spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER);
|
spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER);
|
||||||
vdev_t *vd =
|
vdev_t *vd =
|
||||||
vdev_lookup_top(spa, spa->spa_vdev_removal->svr_vdev_id);
|
vdev_lookup_top(spa, spa->spa_vdev_removal->svr_vdev_id);
|
||||||
if (vd->vdev_mg->mg_class == spa_normal_class(spa)) {
|
/*
|
||||||
|
* If the stars align, we can wind up here after
|
||||||
|
* vdev_remove_complete() has cleared vd->vdev_mg but before
|
||||||
|
* spa->spa_vdev_removal gets cleared, so we must check before
|
||||||
|
* we dereference.
|
||||||
|
*/
|
||||||
|
if (vd->vdev_mg &&
|
||||||
|
vd->vdev_mg->mg_class == spa_normal_class(spa)) {
|
||||||
spa->spa_dspace -= spa_deflate(spa) ?
|
spa->spa_dspace -= spa_deflate(spa) ?
|
||||||
vd->vdev_stat.vs_dspace : vd->vdev_stat.vs_space;
|
vd->vdev_stat.vs_dspace : vd->vdev_stat.vs_space;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user