mirror of https://gitee.com/openkylin/linux.git
[PATCH] ocfs2: fix oops in mmap_truncate testing
This patch fixes a mmap_truncate bug which was found by ocfs2 test suite. In an ocfs2 cluster more than 1 node, run program mmap_truncate, which races mmap writes and truncates from multiple processes. While the test is running, a stat from another node forces writeout, causing an oops in ocfs2_get_block() because it sees a buffer to write which isn't allocated. This patch fixed the bug by clear dirty and uptodate bits in buffer, leave the buffer unmapped and return. Fix is suggested by Mark Fasheh, and I code up the patch. Signed-off-by: Coly Li <coyli@suse.de> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
parent
e752065175
commit
c0420ad2ca
|
@ -174,10 +174,17 @@ static int ocfs2_get_block(struct inode *inode, sector_t iblock,
|
|||
* need to use BH_New is when we're extending i_size on a file
|
||||
* system which doesn't support holes, in which case BH_New
|
||||
* allows block_prepare_write() to zero.
|
||||
*
|
||||
* If we see this on a sparse file system, then a truncate has
|
||||
* raced us and removed the cluster. In this case, we clear
|
||||
* the buffers dirty and uptodate bits and let the buffer code
|
||||
* ignore it as a hole.
|
||||
*/
|
||||
mlog_bug_on_msg(create && p_blkno == 0 && ocfs2_sparse_alloc(osb),
|
||||
"ino %lu, iblock %llu\n", inode->i_ino,
|
||||
(unsigned long long)iblock);
|
||||
if (create && p_blkno == 0 && ocfs2_sparse_alloc(osb)) {
|
||||
clear_buffer_dirty(bh_result);
|
||||
clear_buffer_uptodate(bh_result);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Treat the unwritten extent as a hole for zeroing purposes. */
|
||||
if (p_blkno && !(ext_flags & OCFS2_EXT_UNWRITTEN))
|
||||
|
|
Loading…
Reference in New Issue