flush_workqueue(shost->work_q);
 }
 EXPORT_SYMBOL_GPL(scsi_flush_work);
+
+static bool complete_all_cmds_iter(struct request *rq, void *data, bool rsvd)
+{
+       struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
+       int status = *(int *)data;
+
+       scsi_dma_unmap(scmd);
+       scmd->result = status << 16;
+       scmd->scsi_done(scmd);
+       return true;
+}
+
+/**
+ * scsi_host_complete_all_commands - Terminate all running commands
+ * @shost:     Scsi Host on which commands should be terminated
+ * @status:    Status to be set for the terminated commands
+ *
+ * There is no protection against modification of the number
+ * of outstanding commands. It is the responsibility of the
+ * caller to ensure that concurrent I/O submission and/or
+ * completion is stopped when calling this function.
+ */
+void scsi_host_complete_all_commands(struct Scsi_Host *shost, int status)
+{
+       blk_mq_tagset_busy_iter(&shost->tag_set, complete_all_cmds_iter,
+                               &status);
+}
+EXPORT_SYMBOL_GPL(scsi_host_complete_all_commands);
 
 extern void scsi_host_put(struct Scsi_Host *t);
 extern struct Scsi_Host *scsi_host_lookup(unsigned short);
 extern const char *scsi_host_state_name(enum scsi_host_state);
+extern void scsi_host_complete_all_commands(struct Scsi_Host *shost,
+                                           int status);
 
 static inline int __must_check scsi_add_host(struct Scsi_Host *host,
                                             struct device *dev)