[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <9404b417-73ea-c80c-5313-30f159378675@huawei.com>
Date: Mon, 8 Jun 2020 11:32:11 +0800
From: "zhangyi (F)" <yi.zhang@...wei.com>
To: <tytso@....edu>, <jack@...e.cz>
CC: <linux-ext4@...r.kernel.org>, <adilger.kernel@...ger.ca>,
<zhangxiaoxu5@...wei.com>
Subject: Re: [PATCH 00/10] ext4: fix inconsistency since reading old metadata
from disk
Hiļ¼Ted and Jan, any suggestions of this patch set?
Thanks,
Yi.
On 2020/5/26 15:17, zhangyi (F) wrote:
> Background
> ==========
>
> This patch set point to fix the inconsistency problem which has been
> discussed and partial fixed in [1].
>
> Now, the problem is on the unstable storage which has a flaky transport
> (e.g. iSCSI transport may disconnect few seconds and reconnect due to
> the bad network environment), if we failed to async write metadata in
> background, the end write routine in block layer will clear the buffer's
> uptodate flag, but the data in such buffer is actually uptodate. Finally
> we may read "old && inconsistent" metadata from the disk when we get the
> buffer later because not only the uptodate flag was cleared but also we
> do not check the write io error flag, or even worse the buffer has been
> freed due to memory presure.
>
> Fortunately, if the jbd2 do checkpoint after async IO error happens,
> the checkpoint routine will check the write_io_error flag and abort the
> the journal if detect IO error. And in the journal recover case, the
> recover code will invoke sync_blockdev() after recover complete, it will
> also detect IO error and refuse to mount the filesystem.
>
> Current ext4 have already deal with this problem in __ext4_get_inode_loc()
> and commit 7963e5ac90125 ("ext4: treat buffers with write errors as
> containing valid data"), but it's not enough.
>
> [1] https://lore.kernel.org/linux-ext4/20190823030207.GC8130@mit.edu/
>
> Description
> ===========
>
> This patch set add and rework 7 wrapper functions of getting metadata
> blocks, replace all sb_bread() / sb_getblk*() / ext4_bread() and
> sb_breadahead*(). Add buffer_write_io_error() checking into them, if
> the buffer isn't uptodate and write_io_error flag was set, which means
> that the buffer has been failed to write out to disk, re-add the
> uptodate flag to prevent subsequent read operation.
>
> - ext4_sb_getblk(): works the same as sb_getblk(), use to replace all
> sb_getblk() used for newly allocated blocks and getting buffers.
> - ext4_sb_getblk_locked(): works the same as sb_getblk() except check &
> fix buffer uotpdate flag, use to replace all sb_getblk() used for
> getting buffers to read.
> - ext4_sb_getblk_gfp(): gfp version of ext4_sb_getblk().
> - ext4_sb_getblk_locked_gfp(): gfp version of ext4_sb_getblk_locked().
> - ext4_sb_bread(): get buffer and submit read bio if buffer is actually
> not uptodate.
> - ext4_sb_bread_unmovable(): unmovable version of ext4_sb_bread().
> - ext4_sb_breadahead_unmovable(): works the same to ext4_sb_bread_unmovable()
> except skip submit read bio if failed to lock the buffer.
>
> Patch 1-2: do some small change in ext4 inode eio simulation and add a
> helper in buffer.c, just prepare for below patches.
> Patch 3: add the ext4_sb_*() function to deal with the write_io_error
> flag in buffer.
> Patch 4-8: replace all sb_*() with ext4_sb_*() in ext4.
> Patch 9: deal with the buffer shrinking case, abort jbd2/fs when
> shrinking a buffer with write_io_error flag.
> Patch 10: just do some cleanup.
>
> After this patch set, we need to use above 7 wrapper functions to
> get/read metadata block instead of invoke sb_*() functions defined in
> fs/buffer.h.
>
> Test
> ====
>
> This patch set is based on linux-5.7-rc7 and has been tests by xfstests
> in auto mode.
>
> Thanks,
> Yi.
>
>
> zhangyi (F) (10):
> ext4: move inode eio simulation behind io completeion
> fs: pick out ll_rw_one_block() helper function
> ext4: add ext4_sb_getblk*() wrapper functions
> ext4: replace sb_getblk() with ext4_sb_getblk_locked()
> ext4: replace sb_bread*() with ext4_sb_bread*()
> ext4: replace sb_getblk() with ext4_sb_getblk()
> ext4: switch to use ext4_sb_getblk_locked() in ext4_getblk()
> ext4: replace sb_breadahead() with ext4_sb_breadahead()
> ext4: abort the filesystem while freeing the write error io buffer
> ext4: remove unused parameter in jbd2_journal_try_to_free_buffers()
>
> fs/buffer.c | 41 ++++++----
> fs/ext4/balloc.c | 6 +-
> fs/ext4/ext4.h | 60 ++++++++++++---
> fs/ext4/extents.c | 13 ++--
> fs/ext4/ialloc.c | 6 +-
> fs/ext4/indirect.c | 13 ++--
> fs/ext4/inline.c | 2 +-
> fs/ext4/inode.c | 53 +++++--------
> fs/ext4/mmp.c | 2 +-
> fs/ext4/resize.c | 24 +++---
> fs/ext4/super.c | 145 +++++++++++++++++++++++++++++++-----
> fs/ext4/xattr.c | 4 +-
> fs/jbd2/transaction.c | 20 +++--
> include/linux/buffer_head.h | 1 +
> include/linux/jbd2.h | 3 +-
> 15 files changed, 277 insertions(+), 116 deletions(-)
>
Powered by blists - more mailing lists