From: Lukas Czerner <lczerner@redhat.com>
To: linux-ext4@vger.kernel.org
Cc: linkinjeon@gmail.com, Lukas Czerner <lczerner@redhat.com>
Subject: [PATCH 5/5] ext4: Fix extent merging in ext4_ext_shift_path_extents()
Date: Wed, 16 Apr 2014 20:33:02 +0200 [thread overview]
Message-ID: <1397673182-5326-5-git-send-email-lczerner@redhat.com> (raw)
In-Reply-To: <1397673182-5326-1-git-send-email-lczerner@redhat.com>
There is a bug in ext4_ext_shift_path_extents() where if we actually
manage to merge a extent we would skip shifting the next extent. This
will result in in one extent in the extent tree not being properly
shifted.
This is causing failure in various xfstests tests using fsx or fsstress
with collapse range support. It will also cause file system corruption
which looks something like:
e2fsck 1.42.9 (4-Feb-2014)
Pass 1: Checking inodes, blocks, and sizes
Inode 20 has out of order extents
(invalid logical block 3, physical block 492938, len 2)
Clear? yes
...
when running e2fsck.
It's also very easily reproducible just by running fsx without any
parameters. I can usually hit the problem within a minute.
Fix it by increasing ex_start only if we're not merging the extent.
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
---
fs/ext4/extents.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 84bb668..5fa31cb 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -5230,13 +5230,14 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift,
while (ex_start <= ex_last) {
ex_start->ee_block -= shift;
- if (ex_start >
- EXT_FIRST_EXTENT(path[depth].p_hdr)) {
- if (ext4_ext_try_to_merge_right(inode,
- path, ex_start - 1))
- ex_last--;
- }
- ex_start++;
+ /* Try to merge to the left. */
+ if ((ex_start >
+ EXT_FIRST_EXTENT(path[depth].p_hdr)) &&
+ ext4_ext_try_to_merge_right(inode,
+ path, ex_start - 1))
+ ex_last--;
+ else
+ ex_start++;
}
err = ext4_ext_dirty(handle, inode, path + depth);
if (err)
--
1.8.3.1
next prev parent reply other threads:[~2014-04-16 18:33 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-16 18:32 [PATCH 1/5] ext4: Use filemap_write_and_wait_range() correctly in collapse range Lukas Czerner
2014-04-16 18:32 ` [PATCH 2/5] ext4: fix removing status extents in ext4_collapse_range() Lukas Czerner
2014-04-16 18:33 ` [PATCH 3/5] ext4: No need to truncate pagecache twice in collapse range Lukas Czerner
2014-04-18 14:49 ` Theodore Ts'o
2014-04-16 18:33 ` [PATCH 4/5] ext4: Discard preallocations after removing space Lukas Czerner
2014-04-16 18:33 ` Lukas Czerner [this message]
2014-04-16 18:38 ` [PATCH 1/5] ext4: Use filemap_write_and_wait_range() correctly in collapse range Lukáš Czerner
2014-04-18 15:03 ` Theodore Ts'o
2014-04-16 20:20 ` Lukáš Czerner
2014-04-18 14:42 ` Theodore Ts'o
[not found] <004501cf5a00$18bec8d0$4a3c5a70$@samsung.com>
2014-04-17 5:55 ` [PATCH 5/5] ext4: Fix extent merging in ext4_ext_shift_path_extents() Namjae Jeon
2014-04-18 14:55 ` Theodore Ts'o
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1397673182-5326-5-git-send-email-lczerner@redhat.com \
--to=lczerner@redhat.com \
--cc=linkinjeon@gmail.com \
--cc=linux-ext4@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).