Commit e686307fdc84f249490e6c9da92fcb2424491f14
Committed by
Jens Axboe
1 parent
e93b9fb7d8
Exists in
master
and in
7 other branches
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>
Showing 3 changed files with 9 additions and 22 deletions Side-by-side Diff
drivers/block/loop.c
... | ... | @@ -511,11 +511,7 @@ |
511 | 511 | */ |
512 | 512 | static void loop_add_bio(struct loop_device *lo, struct bio *bio) |
513 | 513 | { |
514 | - if (lo->lo_biotail) { | |
515 | - lo->lo_biotail->bi_next = bio; | |
516 | - lo->lo_biotail = bio; | |
517 | - } else | |
518 | - lo->lo_bio = lo->lo_biotail = bio; | |
514 | + bio_list_add(&lo->lo_bio_list, bio); | |
519 | 515 | } |
520 | 516 | |
521 | 517 | /* |
... | ... | @@ -523,16 +519,7 @@ |
523 | 519 | */ |
524 | 520 | static struct bio *loop_get_bio(struct loop_device *lo) |
525 | 521 | { |
526 | - struct bio *bio; | |
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; | |
522 | + return bio_list_pop(&lo->lo_bio_list); | |
536 | 523 | } |
537 | 524 | |
538 | 525 | static int loop_make_request(struct request_queue *q, struct bio *old_bio) |
539 | 526 | |
540 | 527 | |
... | ... | @@ -609,12 +596,13 @@ |
609 | 596 | |
610 | 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 | 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 | 606 | continue; |
619 | 607 | spin_lock_irq(&lo->lo_lock); |
620 | 608 | bio = loop_get_bio(lo); |
... | ... | @@ -841,7 +829,7 @@ |
841 | 829 | lo->old_gfp_mask = mapping_gfp_mask(mapping); |
842 | 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 | 835 | * set queue make_request_fn, and add limits based on lower level |
include/linux/bio.h
... | ... | @@ -506,7 +506,7 @@ |
506 | 506 | } |
507 | 507 | |
508 | 508 | /* |
509 | - * BIO list managment for use by remapping drivers (e.g. DM or MD). | |
509 | + * BIO list management for use by remapping drivers (e.g. DM or MD) and loop. | |
510 | 510 | * |
511 | 511 | * A bio_list anchors a singly-linked list of bios chained through the bi_next |
512 | 512 | * member of the bio. The bio_list also caches the last list member to allow |
include/linux/loop.h