/* All UBLK_F_* have to be included into UBLK_F_ALL */
 #define UBLK_F_ALL (UBLK_F_SUPPORT_ZERO_COPY \
                | UBLK_F_URING_CMD_COMP_IN_TASK \
-               | UBLK_F_NEED_GET_DATA)
+               | UBLK_F_NEED_GET_DATA \
+               | UBLK_F_USER_RECOVERY)
 
 /* All UBLK_PARAM_TYPE_* should be included here */
 #define UBLK_PARAM_TYPE_ALL (UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DISCARD)
                        PAGE_SIZE);
 }
 
+static inline bool ublk_queue_can_use_recovery(
+               struct ublk_queue *ubq)
+{
+       if (ubq->flags & UBLK_F_USER_RECOVERY)
+               return true;
+       return false;
+}
+
+static inline bool ublk_can_use_recovery(struct ublk_device *ub)
+{
+       if (ub->dev_info.flags & UBLK_F_USER_RECOVERY)
+               return true;
+       return false;
+}
+
 static void ublk_free_disk(struct gendisk *disk)
 {
        struct ublk_device *ub = disk->private_data;
 
  */
 #define UBLK_F_NEED_GET_DATA (1UL << 2)
 
+#define UBLK_F_USER_RECOVERY   (1UL << 3)
+
 /* device state */
 #define UBLK_S_DEV_DEAD        0
 #define UBLK_S_DEV_LIVE        1
+#define UBLK_S_DEV_QUIESCED    2
 
 /* shipped via sqe->cmd of io_uring command */
 struct ublksrv_ctrl_cmd {