[Devel] [PATCH RHEL7 COMMIT] ms/ext4: cleanup clean_bdev_aliases() calls
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Aug 22 14:36:33 MSK 2019
The commit is pushed to "branch-rh7-3.10.0-957.27.2.vz7.107.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-957.27.2.vz7.107.5
------>
commit 7f8dc61b5cec7a35f0dbe39901616b751a0bf092
Author: zhangyi (F) <yi.zhang at huawei.com>
Date: Thu Aug 22 14:36:31 2019 +0300
ms/ext4: cleanup clean_bdev_aliases() calls
Now, we have already handle all cases of forgetting buffer in
jbd2_journal_forget(), the buffer should not be mapped to blockdevice
when reallocating it. So this patch remove all clean_bdev_aliases() and
clean_bdev_bh_alias() calls which were invoked by ext4 explicitly.
https://jira.sw.ru/browse/PSBM-96719
Suggested-by: Jan Kara <jack at suse.cz>
Signed-off-by: zhangyi (F) <yi.zhang at huawei.com>
Signed-off-by: Theodore Ts'o <tytso at mit.edu>
Reviewed-by: Jan Kara <jack at suse.cz>
(cherry picked from commit 16e08b14a4550bb167c48e918b26ef0d4980e9d1)
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
=====================
Patchset description:
ext4/jbd2: port data corruption fixes from ms
While investigating the data corruption on vzt-ploop-check test, when we
detect one page in file which contains wrong data, we were lucky to have
exact the same pattern in bad page each time. So we've added a small
debug to fail on setting a dirty bit for a page if it contains the
pattern, in the begining of __set_page_dirty and
__set_page_dirty_nobuffers.
We've got a crash, which looks related with the ported patches:
crash> bt
PID: 17855 TASK: ffff8cfb19144000 CPU: 3 COMMAND: "jbd2/ploop45613"
#0 [ffff8cfcb6fdf8a0] machine_kexec at ffffffff9e2643c4
#1 [ffff8cfcb6fdf900] __crash_kexec at ffffffff9e32d672
#2 [ffff8cfcb6fdf9d0] crash_kexec at ffffffff9e32d760
#3 [ffff8cfcb6fdf9e8] oops_end at ffffffff9e99f858
#4 [ffff8cfcb6fdfa10] die at ffffffff9e22f88b
#5 [ffff8cfcb6fdfa40] do_trap at ffffffff9e99eee0
#6 [ffff8cfcb6fdfa90] do_invalid_op at ffffffff9e22c1d4
#7 [ffff8cfcb6fdfb40] invalid_op at ffffffff9e9a928e
[exception RIP: page_check_corruption_pattern+397]
RIP: ffffffff9e3d719d RSP: ffff8cfcb6fdfbf8 RFLAGS: 00010246
RAX: ffff8cfcb6fdffd8 RBX: 00007303b0607000 RCX: 000000010025603b
RDX: 0000000000000190 RSI: 0000000000000000 RDI: 0000000000000206
RBP: ffff8cfcb6fdfc10 R8: ffff8cfbe6c19e00 R9: 0000000000000001
R10: 0000000000000004 R11: 0000000000000005 R12: ffffe079873e7e40
R13: ffff8cfca7bc3ab0 R14: ffff8cfc351d5a90 R15: 0000000000000000
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
#8 [ffff8cfcb6fdfbf0] page_check_corruption_pattern at ffffffff9e3d70d6
#9 [ffff8cfcb6fdfc18] __set_page_dirty at ffffffff9e499cb5
#10 [ffff8cfcb6fdfc50] mark_buffer_dirty at ffffffff9e499efa
#11 [ffff8cfcb6fdfc70] __jbd2_journal_temp_unlink_buffer at ffffffffc048893a [jbd2]
#12 [ffff8cfcb6fdfc80] __jbd2_journal_refile_buffer at ffffffffc048ac08 [jbd2]
#13 [ffff8cfcb6fdfca8] jbd2_journal_commit_transaction at ffffffffc048c1e0 [jbd2]
#14 [ffff8cfcb6fdfe48] kjournald2 at ffffffffc0491f79 [jbd2]
#15 [ffff8cfcb6fdfec8] kthread at ffffffff9e2c4661
Before ("jbd2: clear dirty flag when revoking a buffer from an older
transaction") revoken buffer/page can be wrongly marked dirty, and later
be wrongly written to disk. Other patches from the same series might be
also helpful.
https://jira.sw.ru/browse/PSBM-96719
zhangyi (F) (3):
jbd2: clear dirty flag when revoking a buffer from an older
transaction
jbd2: discard dirty data when forgetting an un-journalled buffer
ext4: cleanup clean_bdev_aliases() calls
---
fs/ext4/extents.c | 21 +--------------------
fs/ext4/inode.c | 13 -------------
fs/ext4/page-io.c | 4 +---
3 files changed, 2 insertions(+), 36 deletions(-)
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index a7ae908d79d4..8cc3a45c121b 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3824,14 +3824,6 @@ static int ext4_convert_unwritten_extents_endio(handle_t *handle,
return err;
}
-static void unmap_underlying_metadata_blocks(struct block_device *bdev,
- sector_t block, int count)
-{
- int i;
- for (i = 0; i < count; i++)
- unmap_underlying_metadata(bdev, block + i);
-}
-
/*
* Handle EOFBLOCKS_FL flag, clearing it if necessary
*/
@@ -4127,19 +4119,8 @@ ext4_ext_handle_unwritten_extents(handle_t *handle, struct inode *inode,
} else
allocated = ret;
map->m_flags |= EXT4_MAP_NEW;
- /*
- * if we allocated more blocks than requested
- * we need to make sure we unmap the extra block
- * allocated. The actual needed block will get
- * unmapped later when we find the buffer_head marked
- * new.
- */
- if (allocated > map->m_len) {
- unmap_underlying_metadata_blocks(inode->i_sb->s_bdev,
- newblock + map->m_len,
- allocated - map->m_len);
+ if (allocated > map->m_len)
allocated = map->m_len;
- }
map->m_len = allocated;
/*
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index e396b27726b8..4551c55370ad 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -652,12 +652,6 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
if (flags & EXT4_GET_BLOCKS_ZERO &&
map->m_flags & EXT4_MAP_MAPPED &&
map->m_flags & EXT4_MAP_NEW) {
- ext4_lblk_t i;
-
- for (i = 0; i < map->m_len; i++) {
- unmap_underlying_metadata(inode->i_sb->s_bdev,
- map->m_pblk + i);
- }
ret = ext4_issue_zeroout(inode, map->m_lblk,
map->m_pblk, map->m_len);
if (ret) {
@@ -2142,13 +2136,6 @@ static int mpage_map_one_extent(handle_t *handle, struct mpage_da_data *mpd)
}
BUG_ON(map->m_len == 0);
- if (map->m_flags & EXT4_MAP_NEW) {
- struct block_device *bdev = inode->i_sb->s_bdev;
- int i;
-
- for (i = 0; i < map->m_len; i++)
- unmap_underlying_metadata(bdev, map->m_pblk + i);
- }
return 0;
}
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index 80da8695356e..2ed60c2ffd37 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -458,10 +458,8 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
ext4_io_submit(io);
continue;
}
- if (buffer_new(bh)) {
+ if (buffer_new(bh))
clear_buffer_new(bh);
- unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr);
- }
set_buffer_async_write(bh);
} while ((bh = bh->b_this_page) != head);
More information about the Devel
mailing list