jbd2: switch to check format version in superblock directly
authorZhang Yi <yi.zhang@huawei.com>
Wed, 15 Mar 2023 01:31:26 +0000 (09:31 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 26 Jun 2023 23:35:13 +0000 (19:35 -0400)
We should only check and set extented features if journal format version
is 2, and now we check the in memory copy of the superblock
'journal->j_format_version', which relys on the parameter initialization
sequence, switch to use the h_blocktype in superblock cloud be more
clear.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20230315013128.3911115-5-chengzhihao1@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/jbd2/journal.c
include/linux/jbd2.h

index 8ae4191..8d5fe67 100644 (file)
@@ -2062,10 +2062,12 @@ int jbd2_journal_load(journal_t *journal)
                return err;
 
        sb = journal->j_superblock;
-       /* If this is a V2 superblock, then we have to check the
-        * features flags on it. */
 
-       if (journal->j_format_version >= 2) {
+       /*
+        * If this is a V2 superblock, then we have to check the
+        * features flags on it.
+        */
+       if (jbd2_format_support_feature(journal)) {
                if ((sb->s_feature_ro_compat &
                     ~cpu_to_be32(JBD2_KNOWN_ROCOMPAT_FEATURES)) ||
                    (sb->s_feature_incompat &
@@ -2227,7 +2229,7 @@ int jbd2_journal_check_used_features(journal_t *journal, unsigned long compat,
        if (journal->j_format_version == 0 &&
            journal_get_superblock(journal) != 0)
                return 0;
-       if (journal->j_format_version == 1)
+       if (!jbd2_format_support_feature(journal))
                return 0;
 
        sb = journal->j_superblock;
@@ -2257,11 +2259,7 @@ int jbd2_journal_check_available_features(journal_t *journal, unsigned long comp
        if (!compat && !ro && !incompat)
                return 1;
 
-       /* We can support any known requested features iff the
-        * superblock is in version 2.  Otherwise we fail to support any
-        * extended sb features. */
-
-       if (journal->j_format_version != 2)
+       if (!jbd2_format_support_feature(journal))
                return 0;
 
        if ((compat   & JBD2_KNOWN_COMPAT_FEATURES) == compat &&
index a91cf9c..1ffcea5 100644 (file)
@@ -1313,11 +1313,22 @@ struct journal_s
                rwsem_release(&j->j_trans_commit_map, _THIS_IP_); \
        } while (0)
 
+/*
+ * We can support any known requested features iff the
+ * superblock is not in version 1.  Otherwise we fail to support any
+ * extended sb features.
+ */
+static inline bool jbd2_format_support_feature(journal_t *j)
+{
+       return j->j_superblock->s_header.h_blocktype !=
+                                       cpu_to_be32(JBD2_SUPERBLOCK_V1);
+}
+
 /* journal feature predicate functions */
 #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
 static inline bool jbd2_has_feature_##name(journal_t *j) \
 { \
-       return ((j)->j_format_version >= 2 && \
+       return (jbd2_format_support_feature(j) && \
                ((j)->j_superblock->s_feature_compat & \
                 cpu_to_be32(JBD2_FEATURE_COMPAT_##flagname)) != 0); \
 } \
@@ -1335,7 +1346,7 @@ static inline void jbd2_clear_feature_##name(journal_t *j) \
 #define JBD2_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
 static inline bool jbd2_has_feature_##name(journal_t *j) \
 { \
-       return ((j)->j_format_version >= 2 && \
+       return (jbd2_format_support_feature(j) && \
                ((j)->j_superblock->s_feature_ro_compat & \
                 cpu_to_be32(JBD2_FEATURE_RO_COMPAT_##flagname)) != 0); \
 } \
@@ -1353,7 +1364,7 @@ static inline void jbd2_clear_feature_##name(journal_t *j) \
 #define JBD2_FEATURE_INCOMPAT_FUNCS(name, flagname) \
 static inline bool jbd2_has_feature_##name(journal_t *j) \
 { \
-       return ((j)->j_format_version >= 2 && \
+       return (jbd2_format_support_feature(j) && \
                ((j)->j_superblock->s_feature_incompat & \
                 cpu_to_be32(JBD2_FEATURE_INCOMPAT_##flagname)) != 0); \
 } \