Revert "block: remove __blkdev_driver_ioctl"
[platform/kernel/linux-rpi.git] / drivers / md / dm-rq.c
index 5b95eea..53a9b16 100644 (file)
@@ -490,10 +490,23 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx,
        struct mapped_device *md = tio->md;
        struct dm_target *ti = md->immutable_target;
 
+       /*
+        * blk-mq's unquiesce may come from outside events, such as
+        * elevator switch, updating nr_requests or others, and request may
+        * come during suspend, so simply ask for blk-mq to requeue it.
+        */
+       if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)))
+               return BLK_STS_RESOURCE;
+
        if (unlikely(!ti)) {
                int srcu_idx;
-               struct dm_table *map = dm_get_live_table(md, &srcu_idx);
+               struct dm_table *map;
 
+               map = dm_get_live_table(md, &srcu_idx);
+               if (unlikely(!map)) {
+                       dm_put_live_table(md, srcu_idx);
+                       return BLK_STS_RESOURCE;
+               }
                ti = dm_table_find_target(map, 0);
                dm_put_live_table(md, srcu_idx);
        }