From 1296aaa76e2d87dd93a46634ba7554d1270d51e7 Mon Sep 17 00:00:00 2001 From: Ameer Hamza Date: Thu, 1 Sep 2022 17:49:04 +0500 Subject: [PATCH] Mark VDEV as removed if not found by vdev_open() Signed-off-by: Ameer Hamza --- module/os/linux/zfs/vdev_disk.c | 7 +++++++ module/zfs/vdev.c | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c index b561a08b6af7..0fed09df5203 100644 --- a/module/os/linux/zfs/vdev_disk.c +++ b/module/os/linux/zfs/vdev_disk.c @@ -302,6 +302,13 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize, bdev = blkdev_get_by_path(v->vdev_path, mode | FMODE_EXCL, zfs_vdev_holder); if (unlikely(PTR_ERR(bdev) == -ENOENT)) { + /* + * There is no point of waiting since device is removed + * explicitly + */ + if (v->vdev_removed) + break; + schedule_timeout(MSEC_TO_TICK(10)); } else if (unlikely(PTR_ERR(bdev) == -ERESTARTSYS)) { timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms * 10); diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c index e788cf9a0f1b..c1cbe3afedd1 100644 --- a/module/zfs/vdev.c +++ b/module/zfs/vdev.c @@ -1921,6 +1921,19 @@ vdev_open(vdev_t *vd) error = vd->vdev_ops->vdev_op_open(vd, &osize, &max_osize, &logical_ashift, &physical_ashift); + + /* Device is unplugged, remove the device if not already removed */ + if (error == ENOENT) { + if (vd->vdev_removed) { + vdev_set_state(vd, B_TRUE, VDEV_STATE_REMOVED, + VDEV_AUX_NONE); + } else { + vd->vdev_remove_wanted = B_TRUE; + spa_async_request(spa, SPA_ASYNC_REMOVE); + } + return (error); + } + /* * Physical volume size should never be larger than its max size, unless * the disk has shrunk while we were reading it or the device is buggy