47 lines
1.6 KiB
Diff
47 lines
1.6 KiB
Diff
From 9f00d109efeaf4d12d56c8e46cd13af80e344f97 Mon Sep 17 00:00:00 2001
|
|
From: Dmitry Monakhov <dmonakhov@openvz.org>
|
|
Date: Fri, 5 Oct 2012 11:32:02 -0400
|
|
Subject: [PATCH 12/13] ext4: serialize fallocate with
|
|
ext4_convert_unwritten_extents
|
|
|
|
Fallocate should wait for pended ext4_convert_unwritten_extents()
|
|
otherwise following race may happen:
|
|
|
|
ftruncate( ,12288);
|
|
fallocate( ,0, 4096)
|
|
io_sibmit( ,0, 4096); /* Write to fallocated area, split extent if needed */
|
|
fallocate( ,0, 8192); /* Grow extent and broke assumption about extent */
|
|
|
|
Later kwork completion will do:
|
|
->ext4_convert_unwritten_extents (0, 4096)
|
|
->ext4_map_blocks(handle, inode, &map, EXT4_GET_BLOCKS_IO_CONVERT_EXT);
|
|
->ext4_ext_map_blocks() /* Will find new extent: ex = [0,2] !!!!!! */
|
|
->ext4_ext_handle_uninitialized_extents()
|
|
->ext4_convert_unwritten_extents_endio()
|
|
/* convert [0,2] extent to initialized, but only[0,1] was written */
|
|
|
|
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
|
|
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
|
(cherry picked from commit 60d4616f3dc63371b3dc367e5e88fd4b4f037f65)
|
|
---
|
|
fs/ext4/extents.c | 3 +++
|
|
1 file changed, 3 insertions(+)
|
|
|
|
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
|
|
index 37f46eb..ea2db86 100644
|
|
--- a/fs/ext4/extents.c
|
|
+++ b/fs/ext4/extents.c
|
|
@@ -4410,6 +4410,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
|
|
*/
|
|
if (len <= EXT_UNINIT_MAX_LEN << blkbits)
|
|
flags |= EXT4_GET_BLOCKS_NO_NORMALIZE;
|
|
+
|
|
+ /* Prevent race condition between unwritten */
|
|
+ ext4_flush_unwritten_io(inode);
|
|
retry:
|
|
while (ret >= 0 && ret < max_blocks) {
|
|
map.m_lblk = map.m_lblk + ret;
|
|
--
|
|
1.7.12.rc0.22.gcdd159b
|
|
|