jbd2: abort journal when detecting metadata writeback error of fs dev
authorZhihao Cheng <chengzhihao1@huawei.com>
Wed, 13 Dec 2023 01:32:23 +0000 (09:32 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 5 Jan 2024 04:42:21 +0000 (23:42 -0500)
This is a replacement solution of commit bc71726c725767 ("ext4: abort
the filesystem if failed to async write metadata buffer"), JBD2 can
detect metadata writeback error of fs dev by 'j_fs_dev_wb_err'.

Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20231213013224.2100050-5-chengzhihao1@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/jbd2/transaction.c

index 5f08b5fd105a311584ffd1694667eb187f0e3975..cb0b8d6fc0c6dbfc98fca854d737bb979188c5c4 100644 (file)
@@ -1231,11 +1231,25 @@ out:
 int jbd2_journal_get_write_access(handle_t *handle, struct buffer_head *bh)
 {
        struct journal_head *jh;
+       journal_t *journal;
        int rc;
 
        if (is_handle_aborted(handle))
                return -EROFS;
 
+       journal = handle->h_transaction->t_journal;
+       if (jbd2_check_fs_dev_write_error(journal)) {
+               /*
+                * If the fs dev has writeback errors, it may have failed
+                * to async write out metadata buffers in the background.
+                * In this case, we could read old data from disk and write
+                * it out again, which may lead to on-disk filesystem
+                * inconsistency. Aborting journal can avoid it happen.
+                */
+               jbd2_journal_abort(journal, -EIO);
+               return -EIO;
+       }
+
        if (jbd2_write_access_granted(handle, bh, false))
                return 0;