Patch "dm log writes: fix bug with too large bios" has been added to the 4.7-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dm log writes: fix bug with too large bios
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dm-log-writes-fix-bug-with-too-large-bios.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7efb367320f56fc4d549875b6f3a6940018ef2e5Mon Sep 17 00:00:00 2001
From: Mikulas Patocka <[email protected]>
Date: Tue, 30 Aug 2016 16:20:55 -0400
Subject: dm log writes: fix bug with too large bios
From: Mikulas Patocka <[email protected]>
commit 7efb367320f56fc4d549875b6f3a6940018ef2e5 upstream.
bio_alloc() can allocate a bio with at most BIO_MAX_PAGES (256) vector entries. However, the incoming bio may have more vector entries if it was allocated by other means. For example, bcache submits bios with more than BIO_MAX_PAGES entries. This results in bio_alloc() failure.
To avoid the failure, change the code so that it allocates bio with at most BIO_MAX_PAGES entries. If the incoming bio has more entries, bio_add_page() will fail and a new bio will be allocated - the code that handles bio_add_page() failure already exists in the dm-log-writes target.
--- drivers/md/dm-log-writes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/md/dm-log-writes.c +2 -2
@@ -259,7 +259,7 @@ static int log_one_block(struct log_writ sector++;atomic_inc (&lc->io_blocks); - bio =bio_alloc (GFP_KERNEL , block->vec_cnt); + bio =bio_alloc (GFP_KERNEL ,min (block->vec_cnt,BIO_MAX_PAGES ));if (!bio) {DMERR ("Couldn't alloc log bio" ); goto error;
@@ -280,7 +280,7 @@ static int log_one_block(struct log_writif (ret != block->vecs[i].bv_len) {atomic_inc (&lc->io_blocks);submit_bio (WRITE , bio); - bio =bio_alloc (GFP_KERNEL , block->vec_cnt - i); + bio =bio_alloc (GFP_KERNEL ,min (block->vec_cnt - i,BIO_MAX_PAGES ));if (!bio) {DMERR ("Couldn't alloc log bio" ); goto error;
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/dm-log-writes-fix-bug-with-too-large-bios.patch