Patch "ext4: bugfix for mmaped pages in mpage_release_unused_pages()" has been added to the 4.8-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ext4: bugfix for mmaped pages in mpage_release_unused_pages()
to the 4.8-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:
ext4-bugfix-for-mmaped-pages-in-mpage_release_unused_pages.patch
and it can be found in the queue-4.8 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
4e800c0359d9a53e6bf0ab216954971b2515247fMon Sep 17 00:00:00 2001
From: wangguang <[email protected]>
Date: Thu, 15 Sep 2016 11:32:46 -0400
Subject: ext4: bugfix for mmaped pages in mpage_release_unused_pages()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: wangguang <[email protected]>
commit 4e800c0359d9a53e6bf0ab216954971b2515247f upstream.
Pages clear buffers after ext4 delayed block allocation failed, However, it does not clean its pte_dirty flag.
if the pages unmap ,in cording to the pte_dirty , unmap_page_range may try to call __set_page_dirty,
which may lead to the bugon at mpage_prepare_extent_to_map:head = page_buffers(page);.
This patch just call clear_page_dirty_for_io to clean pte_dirty at mpage_release_unused_pages for pages mmaped.
Steps to reproduce the bug:
(1) mmap a file in ext4
addr = (char *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); memset(addr, 'i', 4096);
(2) return EIO at
ext4_writepages->mpage_map_and_submit_extent->mpage_map_one_extent
which causes this log message to be print:
ext4_msg(sb, KERN_CRIT,
"Delayed block allocation failed for "
"inode %lu at logical offset %llu with"
" max blocks %u with error %d",
inode->i_ino,
(unsigned long long)map->m_lblk,
(unsigned)map->m_len, -err);(3)Unmap the addr cause warning at
__set_page_dirty:WARN_ON_ONCE(warn && !PageUptodate(page));
(4) wait for a minute,then bugon happen.
--- fs/ext4/inode.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ext4/inode.c +2 -0
@@ -1649,6 +1649,8 @@ static void mpage_release_unused_pages(sBUG_ON (!PageLocked (page));BUG_ON (PageWriteback (page));if (invalidate) { +if (page_mapped (page)) +clear_page_dirty_for_io (page);block_invalidatepage (page,0 ,PAGE_SIZE );ClearPageUptodate (page); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/ext4-bugfix-for-mmaped-pages-in-mpage_release_unused_pages.patch