]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/os/linux/zfs/vdev_disk.c
zed: mark disks as REMOVED when they are removed
[mirror_zfs.git] / module / os / linux / zfs / vdev_disk.c
index ba7adcc1b5766523400eab861681c7d3272ce440..0fed09df52033d55c583079d0424fb9c99c76430 100644 (file)
@@ -179,6 +179,18 @@ vdev_disk_error(zio_t *zio)
            zio->io_flags);
 }
 
+static void
+vdev_disk_kobj_evt_post(vdev_t *v)
+{
+       vdev_disk_t *vd = v->vdev_tsd;
+       if (vd && vd->vd_bdev) {
+               spl_signal_kobj_evt(vd->vd_bdev);
+       } else {
+               vdev_dbgmsg(v, "vdev_disk_t is NULL for VDEV:%s\n",
+                   v->vdev_path);
+       }
+}
+
 static int
 vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
     uint64_t *logical_ashift, uint64_t *physical_ashift)
@@ -290,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);
@@ -901,7 +920,7 @@ vdev_disk_io_done(zio_t *zio)
                vdev_t *v = zio->io_vd;
                vdev_disk_t *vd = v->vdev_tsd;
 
-               if (zfs_check_media_change(vd->vd_bdev)) {
+               if (!zfs_check_disk_status(vd->vd_bdev)) {
                        invalidate_bdev(vd->vd_bdev);
                        v->vdev_remove_wanted = B_TRUE;
                        spa_async_request(zio->io_spa, SPA_ASYNC_REMOVE);
@@ -957,7 +976,8 @@ vdev_ops_t vdev_disk_ops = {
        .vdev_op_nparity = NULL,
        .vdev_op_ndisks = NULL,
        .vdev_op_type = VDEV_TYPE_DISK,         /* name of this vdev type */
-       .vdev_op_leaf = B_TRUE                  /* leaf vdev */
+       .vdev_op_leaf = B_TRUE,                 /* leaf vdev */
+       .vdev_op_kobj_evt_post = vdev_disk_kobj_evt_post
 };
 
 /*