+++ /dev/null
-Subject: block: Add interface to abort queued requests
-From: Mike Anderson <andmike@linux.vnet.ibm.com>
-Date: Thu Oct 9 08:56:13 2008 +0200:
-Git: 11914a53d2ec2974a565311af327b8983d8c820d
-References: FATE#304151,bnc#417544
-
-Adapted for SLES11, based on the original commit.
-
-Signed-off-by: Mike Anderson <andmike@linux.vnet.ibm.com>
-Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-Signed-off-by: Hannes Reinecke <hare@suse.de>
-
----
- block/blk-timeout.c | 22 ++++++++++++++++++++++
- block/elevator.c | 13 +++++++++++++
- include/linux/blkdev.h | 1 +
- include/linux/blktrace_api.h | 2 ++
- include/linux/elevator.h | 1 +
- 5 files changed, 39 insertions(+)
-
---- a/block/blk-timeout.c
-+++ b/block/blk-timeout.c
-@@ -153,3 +153,25 @@ void blk_add_timer(struct request *req)
- time_before(expiry, q->timeout.expires))
- mod_timer(&q->timeout, expiry);
- }
-+
-+/**
-+ * blk_abort_queue -- Abort all request on given queue
-+ * @queue: pointer to queue
-+ *
-+ */
-+void blk_abort_queue(struct request_queue *q)
-+{
-+ unsigned long flags;
-+ struct request *rq, *tmp;
-+
-+ spin_lock_irqsave(q->queue_lock, flags);
-+
-+ elv_abort_queue(q);
-+
-+ list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list)
-+ blk_abort_request(rq);
-+
-+ spin_unlock_irqrestore(q->queue_lock, flags);
-+
-+}
-+EXPORT_SYMBOL_GPL(blk_abort_queue);
---- a/block/elevator.c
-+++ b/block/elevator.c
-@@ -914,6 +914,19 @@ int elv_may_queue(struct request_queue *
- return ELV_MQUEUE_MAY;
- }
-
-+void elv_abort_queue(struct request_queue *q)
-+{
-+ struct request *rq;
-+
-+ while (!list_empty(&q->queue_head)) {
-+ rq = list_entry_rq(q->queue_head.next);
-+ rq->cmd_flags |= REQ_QUIET;
-+ blk_add_trace_rq(q, rq, BLK_TA_ABORT);
-+ end_queued_request(rq, 0);
-+ }
-+}
-+EXPORT_SYMBOL(elv_abort_queue);
-+
- void elv_completed_request(struct request_queue *q, struct request *rq)
- {
- elevator_t *e = q->elevator;
---- a/include/linux/blkdev.h
-+++ b/include/linux/blkdev.h
-@@ -780,6 +780,7 @@ extern int blk_end_request_callback(stru
- extern void blk_complete_request(struct request *);
- extern void __blk_complete_request(struct request *);
- extern void blk_abort_request(struct request *);
-+extern void blk_abort_queue(struct request_queue *);
-
- /*
- * blk_end_request() takes bytes instead of sectors as a complete size.
---- a/include/linux/blktrace_api.h
-+++ b/include/linux/blktrace_api.h
-@@ -51,6 +51,7 @@ enum blktrace_act {
- __BLK_TA_SPLIT, /* bio was split */
- __BLK_TA_BOUNCE, /* bio was bounced */
- __BLK_TA_REMAP, /* bio was remapped */
-+ __BLK_TA_ABORT, /* request aborted */
- __BLK_TA_DRV_DATA, /* driver-specific binary data */
- };
-
-@@ -82,6 +83,7 @@ enum blktrace_notify {
- #define BLK_TA_SPLIT (__BLK_TA_SPLIT)
- #define BLK_TA_BOUNCE (__BLK_TA_BOUNCE)
- #define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE))
-+#define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE))
- #define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA))
-
- #define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))
---- a/include/linux/elevator.h
-+++ b/include/linux/elevator.h
-@@ -112,6 +112,7 @@ extern struct request *elv_latter_reques
- extern int elv_register_queue(struct request_queue *q);
- extern void elv_unregister_queue(struct request_queue *q);
- extern int elv_may_queue(struct request_queue *, int);
-+extern void elv_abort_queue(struct request_queue *);
- extern void elv_completed_request(struct request_queue *, struct request *);
- extern int elv_set_request(struct request_queue *, struct request *, gfp_t);
- extern void elv_put_request(struct request_queue *, struct request *);