From 743253df70e9d9772cf98fcdd0fb7f42398d4ff8 Mon Sep 17 00:00:00 2001 From: Olaf Faaland Date: Thu, 8 Mar 2018 15:39:07 -0800 Subject: [PATCH] Hold SCL_VDEV when counting leaves A config lock should be held while vdev_count_leaves() walks the tree, otherwise the pointers reference may become invalid during the walk. SCL_VDEV is a minimal lock provided for such uses cases. Reviewed-by: Brian Behlendorf Reviewed-by: Tony Hutter Signed-off-by: Olaf Faaland Closes #7286 --- module/zfs/vdev.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c index c73b2e7f2ddd..172485f6e495 100644 --- a/module/zfs/vdev.c +++ b/module/zfs/vdev.c @@ -209,7 +209,13 @@ vdev_count_leaves_impl(vdev_t *vd) int vdev_count_leaves(spa_t *spa) { - return (vdev_count_leaves_impl(spa->spa_root_vdev)); + int rc; + + spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER); + rc = vdev_count_leaves_impl(spa->spa_root_vdev); + spa_config_exit(spa, SCL_VDEV, FTAG); + + return (rc); } void