Patch "fs/mpage.c: fix mpage_writepage() for pages with buffers" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
fs/mpage.c: fix mpage_writepage() for pages with buffers
to the 4.9-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:
fs-mpage.c-fix-mpage_writepage-for-pages-with-buffers.patch
and it can be found in the queue-4.9 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
f892760aa66a2d657deaf59538fb69433036767cMon Sep 17 00:00:00 2001
From: Matthew Wilcox <[email protected]>
Date: Fri, 13 Oct 2017 15:58:15 -0700
Subject: fs/mpage.c: fix mpage_writepage() for pages with buffers
From: Matthew Wilcox <[email protected]>
commit f892760aa66a2d657deaf59538fb69433036767c upstream.
When using FAT on a block device which supports rw_page, we can hit BUG_ON(!PageLocked(page)) in try_to_free_buffers(). This is because we call clean_buffers() after unlocking the page we've written. Introduce a new clean_page_buffers() which cleans all buffers associated with a page and call it from within bdev_write_page().
--- fs/block_dev.c | 6 ++++-- fs/mpage.c | 14 +++++++++++--- include/linux/buffer_head.h | 1 + 3 files changed, 16 insertions(+), 5 deletions(-)
fs/block_dev.c +4 -2
@@ -450,10 +450,12 @@ int bdev_write_page(struct block_deviceset_page_writeback (page); result = ops->rw_page (bdev, sector +get_start_sect (bdev), page, true); -if (result) +if (result) {end_page_writeback (page); -else + }else { +clean_page_buffers (page);unlock_page (page); + }blk_queue_exit (bdev->bd_queue);return result; }
fs/mpage.c +11 -3
@@ -466,6 +466,16 @@ static void clean_buffers(struct page *ptry_to_free_buffers (page); } +/* +* For situations where we want to clean all buffers attached to a page. +* We don't need to calculate how many buffers are attached to the page, +* we just need to specify a number larger than the maximum number of buffers. +*/ +void clean_page_buffers (struct page *page) +{ +clean_buffers (page, ~0U ); +} +static int __mpage_writepage (struct page *page,struct writeback_control *wbc,void *data) {
@@ -604,10 +614,8 @@ alloc_new:if (bio ==NULL ) {if (first_unmapped == blocks_per_page) {if (!bdev_write_page (bdev, blocks[0 ] << (blkbits -9 ), - page, wbc)) { -clean_buffers (page, first_unmapped); + page, wbc)) goto out; - } } bio =mpage_alloc (bdev, blocks[0 ] << (blkbits -9 ),BIO_MAX_PAGES ,GFP_NOFS |__GFP_HIGH);
include/linux/buffer_head.h +1 -0
@@ -226,6 +226,7 @@ int generic_write_end(struct file *, str loff_t, unsigned, unsigned, struct page *, void *);void page_zero_new_buffers (struct page *page,unsigned from,unsigned to); +void clean_page_buffers (struct page *page);int cont_write_begin (struct file *,struct address_space *,loff_t ,unsigned ,unsigned ,struct page **,void **,get_block_t *,loff_t *);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/fs-mpage.c-fix-mpage_writepage-for-pages-with-buffers.patch