summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2003-07-25 00:39:23 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-07-25 00:39:23 -0700
commite45635ccc6445e19ca197853ea9ec555ec5ca25a (patch)
tree05ee4c3863df3396148b431ac344a0df5a94dcfb /drivers/block
parentfe216eade3c29fe8c0c7cf316b8c7fc1c074861f (diff)
[PATCH] read-ahead and failfast
Here's the patch to enable failfast flag in the bio submission code, and use it for multipath and readahead.
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/ll_rw_blk.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
index f9678d95a043..f6ca4f797e73 100644
--- a/drivers/block/ll_rw_blk.c
+++ b/drivers/block/ll_rw_blk.c
@@ -689,7 +689,7 @@ void blk_queue_invalidate_tags(request_queue_t *q)
static char *rq_flags[] = {
"REQ_RW",
- "REQ_RW_AHEAD",
+ "REQ_FAILFAST",
"REQ_SOFTBARRIER",
"REQ_HARDBARRIER",
"REQ_CMD",
@@ -706,6 +706,10 @@ static char *rq_flags[] = {
"REQ_DRIVE_CMD",
"REQ_DRIVE_TASK",
"REQ_DRIVE_TASKFILE",
+ "REQ_PREEMPT",
+ "REQ_PM_SUSPEND",
+ "REQ_PM_RESUME",
+ "REQ_PM_SHUTDOWN",
};
void blk_dump_rq_flags(struct request *rq, char *msg)
@@ -1793,7 +1797,7 @@ void __blk_attempt_remerge(request_queue_t *q, struct request *rq)
static int __make_request(request_queue_t *q, struct bio *bio)
{
struct request *req, *freereq = NULL;
- int el_ret, rw, nr_sectors, cur_nr_sectors, barrier;
+ int el_ret, rw, nr_sectors, cur_nr_sectors, barrier, ra;
struct list_head *insert_here;
sector_t sector;
@@ -1814,6 +1818,8 @@ static int __make_request(request_queue_t *q, struct bio *bio)
barrier = test_bit(BIO_RW_BARRIER, &bio->bi_rw);
+ ra = bio_flagged(bio, BIO_RW_AHEAD) || current->flags & PF_READAHEAD;
+
again:
insert_here = NULL;
spin_lock_irq(q->queue_lock);
@@ -1901,7 +1907,7 @@ get_rq:
/*
* READA bit set
*/
- if (bio_flagged(bio, BIO_RW_AHEAD))
+ if (ra)
goto end_io;
freereq = get_request_wait(q, rw);
@@ -1921,6 +1927,12 @@ get_rq:
if (barrier)
req->flags |= (REQ_HARDBARRIER | REQ_NOMERGE);
+ /*
+ * don't stack up retries for read ahead
+ */
+ if (ra)
+ req->flags |= REQ_FAILFAST;
+
req->errors = 0;
req->hard_sector = req->sector = sector;
req->hard_nr_sectors = req->nr_sectors = nr_sectors;