]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
raid5-cache: refactor bio allocation
authorChristoph Hellwig <hch@lst.de>
Mon, 5 Oct 2015 07:31:11 +0000 (09:31 +0200)
committerNeilBrown <neilb@suse.com>
Sun, 1 Nov 2015 02:48:28 +0000 (13:48 +1100)
Split out a helper to allocate a bio for log writes.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/raid5-cache.c

index 29db786557d98a01dd4930e4fa07114a9e939e12..59a4640f09e55ba1f2338601e4e7acc507e8955d 100644 (file)
@@ -276,11 +276,25 @@ static void r5l_submit_current_io(struct r5l_log *log)
        }
 }
 
+static struct bio *r5l_bio_alloc(struct r5l_log *log, struct r5l_io_unit *io)
+{
+       struct bio *bio = bio_kmalloc(GFP_NOIO | __GFP_NOFAIL, BIO_MAX_PAGES);
+
+       bio->bi_rw = WRITE;
+       bio->bi_bdev = log->rdev->bdev;
+       bio->bi_iter.bi_sector = log->log_start;
+       bio->bi_end_io = r5l_log_endio;
+       bio->bi_private = io;
+
+       bio_list_add(&io->bios, bio);
+       atomic_inc(&io->pending_io);
+       return bio;
+}
+
 static struct r5l_io_unit *r5l_new_meta(struct r5l_log *log)
 {
        struct r5l_io_unit *io;
        struct r5l_meta_block *block;
-       struct bio *bio;
 
        io = r5l_alloc_io_unit(log);
 
@@ -294,17 +308,8 @@ static struct r5l_io_unit *r5l_new_meta(struct r5l_log *log)
        io->meta_offset = sizeof(struct r5l_meta_block);
        io->seq = log->seq;
 
-       bio = bio_kmalloc(GFP_NOIO | __GFP_NOFAIL, BIO_MAX_PAGES);
-       io->current_bio = bio;
-       bio->bi_rw = WRITE;
-       bio->bi_bdev = log->rdev->bdev;
-       bio->bi_iter.bi_sector = log->log_start;
-       bio_add_page(bio, io->meta_page, PAGE_SIZE, 0);
-       bio->bi_end_io = r5l_log_endio;
-       bio->bi_private = io;
-
-       bio_list_add(&io->bios, bio);
-       atomic_inc(&io->pending_io);
+       io->current_bio = r5l_bio_alloc(log, io);
+       bio_add_page(io->current_bio, io->meta_page, PAGE_SIZE, 0);
 
        log->seq++;
        log->log_start = r5l_ring_add(log, log->log_start, BLOCK_SECTORS);
@@ -358,19 +363,9 @@ static void r5l_append_payload_page(struct r5l_log *log, struct page *page)
        struct r5l_io_unit *io = log->current_io;
 
 alloc_bio:
-       if (!io->current_bio) {
-               struct bio *bio;
-
-               bio = bio_kmalloc(GFP_NOIO | __GFP_NOFAIL, BIO_MAX_PAGES);
-               bio->bi_rw = WRITE;
-               bio->bi_bdev = log->rdev->bdev;
-               bio->bi_iter.bi_sector = log->log_start;
-               bio->bi_end_io = r5l_log_endio;
-               bio->bi_private = io;
-               bio_list_add(&io->bios, bio);
-               atomic_inc(&io->pending_io);
-               io->current_bio = bio;
-       }
+       if (!io->current_bio)
+               io->current_bio = r5l_bio_alloc(log, io);
+
        if (!bio_add_page(io->current_bio, page, PAGE_SIZE, 0)) {
                io->current_bio = NULL;
                goto alloc_bio;