diff mbox

[v2,2/2] ext4: Do not populate extents tree with outdated offsets while shifting extents

Message ID 20170106202601.32722-3-roman.penyaev@profitbricks.com
State Awaiting Upstream, archived
Headers show

Commit Message

Roman Pen Jan. 6, 2017, 8:26 p.m. UTC
Inside ext4_ext_shift_extents() function ext4_find_extent() is called
without EXT4_EX_NOCACHE flag, which should prevent cache population.

This leads to oudated offsets in the extents tree and wrong blocks
afterwards.

Patch fixes the problem providing EXT4_EX_NOCACHE flag for each
ext4_find_extents() call inside ext4_ext_shift_extents function.

Signed-off-by: Roman Pen <roman.penyaev@profitbricks.com>
Cc: Namjae Jeon <namjae.jeon@samsung.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Cc: linux-ext4@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 fs/ext4/extents.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

Comments

Theodore Ts'o Jan. 7, 2017, 9:27 p.m. UTC | #1
On Fri, Jan 06, 2017 at 09:26:01PM +0100, Roman Pen wrote:
> Inside ext4_ext_shift_extents() function ext4_find_extent() is called
> without EXT4_EX_NOCACHE flag, which should prevent cache population.
> 
> This leads to oudated offsets in the extents tree and wrong blocks
> afterwards.
> 
> Patch fixes the problem providing EXT4_EX_NOCACHE flag for each
> ext4_find_extents() call inside ext4_ext_shift_extents function.
> 
> Signed-off-by: Roman Pen <roman.penyaev@profitbricks.com>

Thanks, applied.

					- Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Roman Pen Jan. 9, 2017, 12:36 p.m. UTC | #2
On Sat, Jan 7, 2017 at 10:27 PM, Theodore Ts'o <tytso@mit.edu> wrote:
> On Fri, Jan 06, 2017 at 09:26:01PM +0100, Roman Pen wrote:
>> Inside ext4_ext_shift_extents() function ext4_find_extent() is called
>> without EXT4_EX_NOCACHE flag, which should prevent cache population.
>>
>> This leads to oudated offsets in the extents tree and wrong blocks
>> afterwards.
>>
>> Patch fixes the problem providing EXT4_EX_NOCACHE flag for each
>> ext4_find_extents() call inside ext4_ext_shift_extents function.
>>
>> Signed-off-by: Roman Pen <roman.penyaev@profitbricks.com>
>
> Thanks, applied.

Could you please provide with the SHA1 of the patch in your branch?
I want to make an exact reference in a new test of the xfstest which
covers that bug.

--
Roman
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 4d3014b5a3f9..2a97dff87b96 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -5334,7 +5334,8 @@  ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
 	ext4_lblk_t stop, *iterator, ex_start, ex_end;
 
 	/* Let path point to the last extent */
-	path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0);
+	path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL,
+				EXT4_EX_NOCACHE);
 	if (IS_ERR(path))
 		return PTR_ERR(path);
 
@@ -5350,7 +5351,8 @@  ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
 	 * sure the hole is big enough to accommodate the shift.
 	*/
 	if (SHIFT == SHIFT_LEFT) {
-		path = ext4_find_extent(inode, start - 1, &path, 0);
+		path = ext4_find_extent(inode, start - 1, &path,
+					EXT4_EX_NOCACHE);
 		if (IS_ERR(path))
 			return PTR_ERR(path);
 		depth = path->p_depth;
@@ -5388,7 +5390,8 @@  ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
 	 * becomes NULL to indicate the end of the loop.
 	 */
 	while (iterator && start <= stop) {
-		path = ext4_find_extent(inode, *iterator, &path, 0);
+		path = ext4_find_extent(inode, *iterator, &path,
+					EXT4_EX_NOCACHE);
 		if (IS_ERR(path))
 			return PTR_ERR(path);
 		depth = path->p_depth;