]>
Commit | Line | Data |
---|---|---|
1 | Subject: block: Add interface to abort queued requests | |
2 | From: Mike Anderson <andmike@linux.vnet.ibm.com> | |
3 | Date: Thu Oct 9 08:56:13 2008 +0200: | |
4 | Git: 11914a53d2ec2974a565311af327b8983d8c820d | |
5 | References: FATE#304151,bnc#417544 | |
6 | ||
7 | Adapted for SLES11, based on the original commit. | |
8 | ||
9 | Signed-off-by: Mike Anderson <andmike@linux.vnet.ibm.com> | |
10 | Signed-off-by: Jens Axboe <jens.axboe@oracle.com> | |
11 | Signed-off-by: Hannes Reinecke <hare@suse.de> | |
12 | ||
13 | --- | |
14 | block/blk-timeout.c | 22 ++++++++++++++++++++++ | |
15 | block/elevator.c | 13 +++++++++++++ | |
16 | include/linux/blkdev.h | 1 + | |
17 | include/linux/blktrace_api.h | 2 ++ | |
18 | include/linux/elevator.h | 1 + | |
19 | 5 files changed, 39 insertions(+) | |
20 | ||
21 | --- a/block/blk-timeout.c | |
22 | +++ b/block/blk-timeout.c | |
23 | @@ -153,3 +153,25 @@ void blk_add_timer(struct request *req) | |
24 | time_before(expiry, q->timeout.expires)) | |
25 | mod_timer(&q->timeout, expiry); | |
26 | } | |
27 | + | |
28 | +/** | |
29 | + * blk_abort_queue -- Abort all request on given queue | |
30 | + * @queue: pointer to queue | |
31 | + * | |
32 | + */ | |
33 | +void blk_abort_queue(struct request_queue *q) | |
34 | +{ | |
35 | + unsigned long flags; | |
36 | + struct request *rq, *tmp; | |
37 | + | |
38 | + spin_lock_irqsave(q->queue_lock, flags); | |
39 | + | |
40 | + elv_abort_queue(q); | |
41 | + | |
42 | + list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list) | |
43 | + blk_abort_request(rq); | |
44 | + | |
45 | + spin_unlock_irqrestore(q->queue_lock, flags); | |
46 | + | |
47 | +} | |
48 | +EXPORT_SYMBOL_GPL(blk_abort_queue); | |
49 | --- a/block/elevator.c | |
50 | +++ b/block/elevator.c | |
51 | @@ -922,6 +922,19 @@ int elv_may_queue(struct request_queue * | |
52 | return ELV_MQUEUE_MAY; | |
53 | } | |
54 | ||
55 | +void elv_abort_queue(struct request_queue *q) | |
56 | +{ | |
57 | + struct request *rq; | |
58 | + | |
59 | + while (!list_empty(&q->queue_head)) { | |
60 | + rq = list_entry_rq(q->queue_head.next); | |
61 | + rq->cmd_flags |= REQ_QUIET; | |
62 | + blk_add_trace_rq(q, rq, BLK_TA_ABORT); | |
63 | + end_queued_request(rq, 0); | |
64 | + } | |
65 | +} | |
66 | +EXPORT_SYMBOL(elv_abort_queue); | |
67 | + | |
68 | void elv_completed_request(struct request_queue *q, struct request *rq) | |
69 | { | |
70 | elevator_t *e = q->elevator; | |
71 | --- a/include/linux/blkdev.h | |
72 | +++ b/include/linux/blkdev.h | |
73 | @@ -780,6 +780,7 @@ extern int blk_end_request_callback(stru | |
74 | extern void blk_complete_request(struct request *); | |
75 | extern void __blk_complete_request(struct request *); | |
76 | extern void blk_abort_request(struct request *); | |
77 | +extern void blk_abort_queue(struct request_queue *); | |
78 | ||
79 | /* | |
80 | * blk_end_request() takes bytes instead of sectors as a complete size. | |
81 | --- a/include/linux/blktrace_api.h | |
82 | +++ b/include/linux/blktrace_api.h | |
83 | @@ -51,6 +51,7 @@ enum blktrace_act { | |
84 | __BLK_TA_SPLIT, /* bio was split */ | |
85 | __BLK_TA_BOUNCE, /* bio was bounced */ | |
86 | __BLK_TA_REMAP, /* bio was remapped */ | |
87 | + __BLK_TA_ABORT, /* request aborted */ | |
88 | __BLK_TA_DRV_DATA, /* driver-specific binary data */ | |
89 | }; | |
90 | ||
91 | @@ -82,6 +83,7 @@ enum blktrace_notify { | |
92 | #define BLK_TA_SPLIT (__BLK_TA_SPLIT) | |
93 | #define BLK_TA_BOUNCE (__BLK_TA_BOUNCE) | |
94 | #define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE)) | |
95 | +#define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE)) | |
96 | #define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA)) | |
97 | ||
98 | #define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) | |
99 | --- a/include/linux/elevator.h | |
100 | +++ b/include/linux/elevator.h | |
101 | @@ -112,6 +112,7 @@ extern struct request *elv_latter_reques | |
102 | extern int elv_register_queue(struct request_queue *q); | |
103 | extern void elv_unregister_queue(struct request_queue *q); | |
104 | extern int elv_may_queue(struct request_queue *, int); | |
105 | +extern void elv_abort_queue(struct request_queue *); | |
106 | extern void elv_completed_request(struct request_queue *, struct request *); | |
107 | extern int elv_set_request(struct request_queue *, struct request *, gfp_t); | |
108 | extern void elv_put_request(struct request_queue *, struct request *); |