git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sh: Add SDHI power control support to Ecovec
[safe/jmp/linux-2.6]
/
block
/
elevator.c
diff --git
a/block/elevator.c
b/block/elevator.c
index
b03b875
..
a847046
100644
(file)
--- a/
block/elevator.c
+++ b/
block/elevator.c
@@
-33,17
+33,16
@@
#include <linux/compiler.h>
#include <linux/delay.h>
#include <linux/blktrace_api.h>
#include <linux/compiler.h>
#include <linux/delay.h>
#include <linux/blktrace_api.h>
-#include <trace/block.h>
#include <linux/hash.h>
#include <linux/uaccess.h>
#include <linux/hash.h>
#include <linux/uaccess.h>
+#include <trace/events/block.h>
+
#include "blk.h"
static DEFINE_SPINLOCK(elv_list_lock);
static LIST_HEAD(elv_list);
#include "blk.h"
static DEFINE_SPINLOCK(elv_list_lock);
static LIST_HEAD(elv_list);
-DEFINE_TRACE(block_rq_abort);
-
/*
* Merge hash stuff.
*/
/*
* Merge hash stuff.
*/
@@
-52,10
+51,7
@@
static const int elv_hash_shift = 6;
#define ELV_HASH_FN(sec) \
(hash_long(ELV_HASH_BLOCK((sec)), elv_hash_shift))
#define ELV_HASH_ENTRIES (1 << elv_hash_shift)
#define ELV_HASH_FN(sec) \
(hash_long(ELV_HASH_BLOCK((sec)), elv_hash_shift))
#define ELV_HASH_ENTRIES (1 << elv_hash_shift)
-#define rq_hash_key(rq) ((rq)->sector + (rq)->nr_sectors)
-
-DEFINE_TRACE(block_rq_insert);
-DEFINE_TRACE(block_rq_issue);
+#define rq_hash_key(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq))
/*
* Query io scheduler to see if the current process issuing bio may be
/*
* Query io scheduler to see if the current process issuing bio may be
@@
-83,7
+79,8
@@
int elv_rq_merge_ok(struct request *rq, struct bio *bio)
/*
* Don't merge file system requests and discard requests
*/
/*
* Don't merge file system requests and discard requests
*/
- if (bio_discard(bio) != bio_discard(rq->bio))
+ if (bio_rw_flagged(bio, BIO_RW_DISCARD) !=
+ bio_rw_flagged(rq->bio, BIO_RW_DISCARD))
return 0;
/*
return 0;
/*
@@
-119,9
+116,9
@@
static inline int elv_try_merge(struct request *__rq, struct bio *bio)
* we can merge and sequence is ok, check if it's possible
*/
if (elv_rq_merge_ok(__rq, bio)) {
* we can merge and sequence is ok, check if it's possible
*/
if (elv_rq_merge_ok(__rq, bio)) {
- if (
__rq->sector + __rq->nr_sectors
== bio->bi_sector)
+ if (
blk_rq_pos(__rq) + blk_rq_sectors(__rq)
== bio->bi_sector)
ret = ELEVATOR_BACK_MERGE;
ret = ELEVATOR_BACK_MERGE;
- else if (
__rq->sector
- bio_sectors(bio) == bio->bi_sector)
+ else if (
blk_rq_pos(__rq)
- bio_sectors(bio) == bio->bi_sector)
ret = ELEVATOR_FRONT_MERGE;
}
ret = ELEVATOR_FRONT_MERGE;
}
@@
-370,9
+367,9
@@
struct request *elv_rb_add(struct rb_root *root, struct request *rq)
parent = *p;
__rq = rb_entry(parent, struct request, rb_node);
parent = *p;
__rq = rb_entry(parent, struct request, rb_node);
- if (
rq->sector < __rq->sector
)
+ if (
blk_rq_pos(rq) < blk_rq_pos(__rq)
)
p = &(*p)->rb_left;
p = &(*p)->rb_left;
- else if (
rq->sector > __rq->sector
)
+ else if (
blk_rq_pos(rq) > blk_rq_pos(__rq)
)
p = &(*p)->rb_right;
else
return __rq;
p = &(*p)->rb_right;
else
return __rq;
@@
-400,9
+397,9
@@
struct request *elv_rb_find(struct rb_root *root, sector_t sector)
while (n) {
rq = rb_entry(n, struct request, rb_node);
while (n) {
rq = rb_entry(n, struct request, rb_node);
- if (sector <
rq->sector
)
+ if (sector <
blk_rq_pos(rq)
)
n = n->rb_left;
n = n->rb_left;
- else if (sector >
rq->sector
)
+ else if (sector >
blk_rq_pos(rq)
)
n = n->rb_right;
else
return rq;
n = n->rb_right;
else
return rq;
@@
-441,14
+438,14
@@
void elv_dispatch_sort(struct request_queue *q, struct request *rq)
break;
if (pos->cmd_flags & stop_flags)
break;
break;
if (pos->cmd_flags & stop_flags)
break;
- if (
rq->sector
>= boundary) {
- if (
pos->sector
< boundary)
+ if (
blk_rq_pos(rq)
>= boundary) {
+ if (
blk_rq_pos(pos)
< boundary)
continue;
} else {
continue;
} else {
- if (
pos->sector
>= boundary)
+ if (
blk_rq_pos(pos)
>= boundary)
break;
}
break;
}
- if (
rq->sector >= pos->sector
)
+ if (
blk_rq_pos(rq) >= blk_rq_pos(pos)
)
break;
}
break;
}
@@
-546,7
+543,7
@@
void elv_requeue_request(struct request_queue *q, struct request *rq)
* in_flight count again
*/
if (blk_account_rq(rq)) {
* in_flight count again
*/
if (blk_account_rq(rq)) {
- q->in_flight--;
+ q->in_flight
[rq_is_sync(rq)]
--;
if (blk_sorted_rq(rq))
elv_deactivate_rq(q, rq);
}
if (blk_sorted_rq(rq))
elv_deactivate_rq(q, rq);
}
@@
-575,6
+572,9
@@
void elv_drain_elevator(struct request_queue *q)
*/
void elv_quiesce_start(struct request_queue *q)
{
*/
void elv_quiesce_start(struct request_queue *q)
{
+ if (!q->elevator)
+ return;
+
queue_flag_set(QUEUE_FLAG_ELVSWITCH, q);
/*
queue_flag_set(QUEUE_FLAG_ELVSWITCH, q);
/*
@@
-685,7
+685,7
@@
void elv_insert(struct request_queue *q, struct request *rq, int where)
if (unplug_it && blk_queue_plugged(q)) {
int nrq = q->rq.count[BLK_RW_SYNC] + q->rq.count[BLK_RW_ASYNC]
if (unplug_it && blk_queue_plugged(q)) {
int nrq = q->rq.count[BLK_RW_SYNC] + q->rq.count[BLK_RW_ASYNC]
-
- q->in_flight
;
+
- queue_in_flight(q)
;
if (nrq >= q->unplug_thresh)
__generic_unplug_device(q);
if (nrq >= q->unplug_thresh)
__generic_unplug_device(q);
@@
-810,7
+810,12
@@
void elv_abort_queue(struct request_queue *q)
rq = list_entry_rq(q->queue_head.next);
rq->cmd_flags |= REQ_QUIET;
trace_block_rq_abort(q, rq);
rq = list_entry_rq(q->queue_head.next);
rq->cmd_flags |= REQ_QUIET;
trace_block_rq_abort(q, rq);
- __blk_end_request(rq, -EIO, blk_rq_bytes(rq));
+ /*
+ * Mark this request as started so we don't trigger
+ * any debug logic in the end I/O path.
+ */
+ blk_start_request(rq);
+ __blk_end_request_all(rq, -EIO);
}
}
EXPORT_SYMBOL(elv_abort_queue);
}
}
EXPORT_SYMBOL(elv_abort_queue);
@@
-823,7
+828,7
@@
void elv_completed_request(struct request_queue *q, struct request *rq)
* request is released from the driver, io must be done
*/
if (blk_account_rq(rq)) {
* request is released from the driver, io must be done
*/
if (blk_account_rq(rq)) {
- q->in_flight--;
+ q->in_flight
[rq_is_sync(rq)]
--;
if (blk_sorted_rq(rq) && e->ops->elevator_completed_req_fn)
e->ops->elevator_completed_req_fn(q, rq);
}
if (blk_sorted_rq(rq) && e->ops->elevator_completed_req_fn)
e->ops->elevator_completed_req_fn(q, rq);
}
@@
-838,7
+843,7
@@
void elv_completed_request(struct request_queue *q, struct request *rq)
if (!list_empty(&q->queue_head))
next = list_entry_rq(q->queue_head.next);
if (!list_empty(&q->queue_head))
next = list_entry_rq(q->queue_head.next);
- if (!q
->in_flight
&&
+ if (!q
ueue_in_flight(q)
&&
blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN &&
(!next || blk_ordered_req_seq(next) > QUEUE_ORDSEQ_DRAIN)) {
blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0);
blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN &&
(!next || blk_ordered_req_seq(next) > QUEUE_ORDSEQ_DRAIN)) {
blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0);
@@
-1050,10
+1055,11
@@
ssize_t elv_iosched_store(struct request_queue *q, const char *name,
char elevator_name[ELV_NAME_MAX];
struct elevator_type *e;
char elevator_name[ELV_NAME_MAX];
struct elevator_type *e;
- strlcpy(elevator_name, name, sizeof(elevator_name));
-
strstrip(elevator_name)
;
+ if (!q->elevator)
+
return count
;
- e = elevator_get(elevator_name);
+ strlcpy(elevator_name, name, sizeof(elevator_name));
+ e = elevator_get(strstrip(elevator_name));
if (!e) {
printk(KERN_ERR "elevator: type %s not found\n", elevator_name);
return -EINVAL;
if (!e) {
printk(KERN_ERR "elevator: type %s not found\n", elevator_name);
return -EINVAL;
@@
-1073,10
+1079,15
@@
ssize_t elv_iosched_store(struct request_queue *q, const char *name,
ssize_t elv_iosched_show(struct request_queue *q, char *name)
{
struct elevator_queue *e = q->elevator;
ssize_t elv_iosched_show(struct request_queue *q, char *name)
{
struct elevator_queue *e = q->elevator;
- struct elevator_type *elv
= e->elevator_type
;
+ struct elevator_type *elv;
struct elevator_type *__e;
int len = 0;
struct elevator_type *__e;
int len = 0;
+ if (!q->elevator)
+ return sprintf(name, "none\n");
+
+ elv = e->elevator_type;
+
spin_lock(&elv_list_lock);
list_for_each_entry(__e, &elv_list, list) {
if (!strcmp(elv->elevator_name, __e->elevator_name))
spin_lock(&elv_list_lock);
list_for_each_entry(__e, &elv_list, list) {
if (!strcmp(elv->elevator_name, __e->elevator_name))