diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2009-04-17 02:41:21 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-04-28 01:37:28 -0400 |
commit | e686307fdc84f249490e6c9da92fcb2424491f14 (patch) | |
tree | d0174abe1f71a4435bf4b7a5822bfdc7dcf650aa /drivers/block | |
parent | e93b9fb7d85da4fd9d5171649e5ddcac1dd572bf (diff) |
loop: use BIO list management functions
Now that the bio list management stuff is generic, convert loop to use
bio lists instead of its own private bio list implementation.
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/loop.c | 26 |
1 files changed, 7 insertions, 19 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index ddae80825899..9ca4bb014657 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -511,11 +511,7 @@ out: | |||
511 | */ | 511 | */ |
512 | static void loop_add_bio(struct loop_device *lo, struct bio *bio) | 512 | static void loop_add_bio(struct loop_device *lo, struct bio *bio) |
513 | { | 513 | { |
514 | if (lo->lo_biotail) { | 514 | bio_list_add(&lo->lo_bio_list, bio); |
515 | lo->lo_biotail->bi_next = bio; | ||
516 | lo->lo_biotail = bio; | ||
517 | } else | ||
518 | lo->lo_bio = lo->lo_biotail = bio; | ||
519 | } | 515 | } |
520 | 516 | ||
521 | /* | 517 | /* |
@@ -523,16 +519,7 @@ static void loop_add_bio(struct loop_device *lo, struct bio *bio) | |||
523 | */ | 519 | */ |
524 | static struct bio *loop_get_bio(struct loop_device *lo) | 520 | static struct bio *loop_get_bio(struct loop_device *lo) |
525 | { | 521 | { |
526 | struct bio *bio; | 522 | return bio_list_pop(&lo->lo_bio_list); |
527 | |||
528 | if ((bio = lo->lo_bio)) { | ||
529 | if (bio == lo->lo_biotail) | ||
530 | lo->lo_biotail = NULL; | ||
531 | lo->lo_bio = bio->bi_next; | ||
532 | bio->bi_next = NULL; | ||
533 | } | ||
534 | |||
535 | return bio; | ||
536 | } | 523 | } |
537 | 524 | ||
538 | static int loop_make_request(struct request_queue *q, struct bio *old_bio) | 525 | static int loop_make_request(struct request_queue *q, struct bio *old_bio) |
@@ -609,12 +596,13 @@ static int loop_thread(void *data) | |||
609 | 596 | ||
610 | set_user_nice(current, -20); | 597 | set_user_nice(current, -20); |
611 | 598 | ||
612 | while (!kthread_should_stop() || lo->lo_bio) { | 599 | while (!kthread_should_stop() || !bio_list_empty(&lo->lo_bio_list)) { |
613 | 600 | ||
614 | wait_event_interruptible(lo->lo_event, | 601 | wait_event_interruptible(lo->lo_event, |
615 | lo->lo_bio || kthread_should_stop()); | 602 | !bio_list_empty(&lo->lo_bio_list) || |
603 | kthread_should_stop()); | ||
616 | 604 | ||
617 | if (!lo->lo_bio) | 605 | if (bio_list_empty(&lo->lo_bio_list)) |
618 | continue; | 606 | continue; |
619 | spin_lock_irq(&lo->lo_lock); | 607 | spin_lock_irq(&lo->lo_lock); |
620 | bio = loop_get_bio(lo); | 608 | bio = loop_get_bio(lo); |
@@ -841,7 +829,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, | |||
841 | lo->old_gfp_mask = mapping_gfp_mask(mapping); | 829 | lo->old_gfp_mask = mapping_gfp_mask(mapping); |
842 | mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); | 830 | mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); |
843 | 831 | ||
844 | lo->lo_bio = lo->lo_biotail = NULL; | 832 | bio_list_init(&lo->lo_bio_list); |
845 | 833 | ||
846 | /* | 834 | /* |
847 | * set queue make_request_fn, and add limits based on lower level | 835 | * set queue make_request_fn, and add limits based on lower level |