Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Akinobu Mita and committed by
Jens Axboe
e686307f e93b9fb7

+9 -22
+7 -19
drivers/block/loop.c
··· 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 /* ··· 519 523 */ 520 524 static struct bio *loop_get_bio(struct loop_device *lo) 521 525 { 522 - struct bio *bio; 523 - 524 - if ((bio = lo->lo_bio)) { 525 - if (bio == lo->lo_biotail) 526 - lo->lo_biotail = NULL; 527 - lo->lo_bio = bio->bi_next; 528 - bio->bi_next = NULL; 529 - } 530 - 531 - return bio; 526 + return bio_list_pop(&lo->lo_bio_list); 532 527 } 533 528 534 529 static int loop_make_request(struct request_queue *q, struct bio *old_bio) ··· 596 609 597 610 set_user_nice(current, -20); 598 611 599 - while (!kthread_should_stop() || lo->lo_bio) { 612 + while (!kthread_should_stop() || !bio_list_empty(&lo->lo_bio_list)) { 600 613 601 614 wait_event_interruptible(lo->lo_event, 602 - lo->lo_bio || kthread_should_stop()); 615 + !bio_list_empty(&lo->lo_bio_list) || 616 + kthread_should_stop()); 603 617 604 - if (!lo->lo_bio) 618 + if (bio_list_empty(&lo->lo_bio_list)) 605 619 continue; 606 620 spin_lock_irq(&lo->lo_lock); 607 621 bio = loop_get_bio(lo); ··· 829 841 lo->old_gfp_mask = mapping_gfp_mask(mapping); 830 842 mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); 831 843 832 - lo->lo_bio = lo->lo_biotail = NULL; 844 + bio_list_init(&lo->lo_bio_list); 833 845 834 846 /* 835 847 * set queue make_request_fn, and add limits based on lower level
+1 -1
include/linux/bio.h
··· 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
+1 -2
include/linux/loop.h
··· 56 56 gfp_t old_gfp_mask; 57 57 58 58 spinlock_t lo_lock; 59 - struct bio *lo_bio; 60 - struct bio *lo_biotail; 59 + struct bio_list lo_bio_list; 61 60 int lo_state; 62 61 struct mutex lo_ctl_mutex; 63 62 struct task_struct *lo_thread;