ext4: define ext4_journal_destroy wrapper
authorOjaswin Mujoo <ojaswin@linux.ibm.com>
Tue, 18 Mar 2025 07:52:55 +0000 (13:22 +0530)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 21 Mar 2025 05:12:33 +0000 (01:12 -0400)
Define an ext4 wrapper over jbd2_journal_destroy to make sure we
have consistent behavior during journal destruction. This will also
come useful in the next patch where we add some ext4 specific logic
in the destroy path.

Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Baokun Li <libaokun1@huawei.com>
Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Link: https://patch.msgid.link/c3ba78c5c419757e6d5f2d8ebb4a8ce9d21da86a.1742279837.git.ojaswin@linux.ibm.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/ext4_jbd2.h
fs/ext4/super.c

index 3f2596c9e5f254613e048f088f42573e2be296fa..9b3c9df02a396db3815ef10bf207999e10ddb0b7 100644 (file)
@@ -429,4 +429,18 @@ static inline int ext4_should_dioread_nolock(struct inode *inode)
        return 1;
 }
 
+/*
+ * Pass journal explicitly as it may not be cached in the sbi->s_journal in some
+ * cases
+ */
+static inline int ext4_journal_destroy(struct ext4_sb_info *sbi, journal_t *journal)
+{
+       int err = 0;
+
+       err = jbd2_journal_destroy(journal);
+       sbi->s_journal = NULL;
+
+       return err;
+}
+
 #endif /* _EXT4_JBD2_H */
index 8cafcd3e9f5fe1a6f8092a1ae44e0e2a13526525..0fd801ca78626072b93a110d4821cb8a0c5a369f 100644 (file)
@@ -1296,8 +1296,7 @@ static void ext4_put_super(struct super_block *sb)
 
        if (sbi->s_journal) {
                aborted = is_journal_aborted(sbi->s_journal);
-               err = jbd2_journal_destroy(sbi->s_journal);
-               sbi->s_journal = NULL;
+               err = ext4_journal_destroy(sbi, sbi->s_journal);
                if ((err < 0) && !aborted) {
                        ext4_abort(sb, -err, "Couldn't clean up the journal");
                }
@@ -4974,8 +4973,7 @@ static int ext4_load_and_init_journal(struct super_block *sb,
 out:
        /* flush s_sb_upd_work before destroying the journal. */
        flush_work(&sbi->s_sb_upd_work);
-       jbd2_journal_destroy(sbi->s_journal);
-       sbi->s_journal = NULL;
+       ext4_journal_destroy(sbi, sbi->s_journal);
        return -EINVAL;
 }
 
@@ -5673,8 +5671,7 @@ failed_mount_wq:
        if (sbi->s_journal) {
                /* flush s_sb_upd_work before journal destroy. */
                flush_work(&sbi->s_sb_upd_work);
-               jbd2_journal_destroy(sbi->s_journal);
-               sbi->s_journal = NULL;
+               ext4_journal_destroy(sbi, sbi->s_journal);
        }
 failed_mount3a:
        ext4_es_unregister_shrinker(sbi);
@@ -5975,7 +5972,7 @@ static journal_t *ext4_open_dev_journal(struct super_block *sb,
        return journal;
 
 out_journal:
-       jbd2_journal_destroy(journal);
+       ext4_journal_destroy(EXT4_SB(sb), journal);
 out_bdev:
        bdev_fput(bdev_file);
        return ERR_PTR(errno);
@@ -6092,8 +6089,7 @@ static int ext4_load_journal(struct super_block *sb,
        EXT4_SB(sb)->s_journal = journal;
        err = ext4_clear_journal_err(sb, es);
        if (err) {
-               EXT4_SB(sb)->s_journal = NULL;
-               jbd2_journal_destroy(journal);
+               ext4_journal_destroy(EXT4_SB(sb), journal);
                return err;
        }
 
@@ -6111,7 +6107,7 @@ static int ext4_load_journal(struct super_block *sb,
        return 0;
 
 err_out:
-       jbd2_journal_destroy(journal);
+       ext4_journal_destroy(EXT4_SB(sb), journal);
        return err;
 }