[Ocfs2-tools-devel] [PATCH 4/9] libocfs2: Set and clear journal features.

Joel Becker joel.becker at oracle.com
Tue Sep 9 17:57:11 PDT 2008


This adds functions to set and clear feature bits in the journal
superblock.  Features are checked against the known feature set.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 include/ocfs2/ocfs2.h |    4 +++
 libocfs2/mkjournal.c  |   55 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
index bdeadb9..8a7e865 100644
--- a/include/ocfs2/ocfs2.h
+++ b/include/ocfs2/ocfs2.h
@@ -289,6 +289,10 @@ errcode_t ocfs2_write_journal_superblock(ocfs2_filesys *fs, uint64_t blkno,
 					 char *jsb_buf);
 errcode_t ocfs2_make_journal(ocfs2_filesys *fs, uint64_t blkno,
 			     uint32_t clusters);
+errcode_t ocfs2_journal_clear_features(journal_superblock_t *jsb,
+				       ocfs2_fs_options *features);
+errcode_t ocfs2_journal_set_features(journal_superblock_t *jsb,
+				     ocfs2_fs_options *features);
 extern size_t ocfs2_journal_tag_bytes(journal_superblock_t *jsb);
 extern uint64_t ocfs2_journal_tag_block(journal_block_tag_t *tag,
 					size_t tag_bytes);
diff --git a/libocfs2/mkjournal.c b/libocfs2/mkjournal.c
index e14a34d..35835f1 100644
--- a/libocfs2/mkjournal.c
+++ b/libocfs2/mkjournal.c
@@ -50,6 +50,61 @@ uint64_t ocfs2_journal_tag_block(journal_block_tag_t *tag, size_t tag_bytes)
 	return blockno;
 }
 
+/* Returns true if we support these journal features */
+static int ocfs2_journal_check_available_features(journal_superblock_t *jsb,
+						  ocfs2_fs_options *features)
+{
+	if (!features->opt_compat && !features->opt_ro_compat &&
+	    !features->opt_incompat)
+		return 1;
+
+	if (jsb->s_header.h_blocktype != JBD2_SUPERBLOCK_V2)
+		return 0;
+
+	if ((features->opt_compat & JBD2_KNOWN_COMPAT_FEATURES) !=
+	    features->opt_compat)
+		return 0;
+
+	if ((features->opt_ro_compat & JBD2_KNOWN_ROCOMPAT_FEATURES) !=
+	    features->opt_ro_compat)
+		return 0;
+
+	if ((features->opt_incompat & JBD2_KNOWN_INCOMPAT_FEATURES) !=
+	    features->opt_incompat)
+		return 0;
+
+	return 1;
+}
+
+errcode_t ocfs2_journal_set_features(journal_superblock_t *jsb,
+				     ocfs2_fs_options *features)
+{
+
+	if (!ocfs2_journal_check_available_features(jsb, features))
+		return OCFS2_ET_UNSUPP_FEATURE;
+
+
+	jsb->s_feature_compat |= features->opt_compat;
+	jsb->s_feature_ro_compat |= features->opt_ro_compat;
+	jsb->s_feature_incompat |= features->opt_incompat;
+
+	return 0;
+}
+
+errcode_t ocfs2_journal_clear_features(journal_superblock_t *jsb,
+				       ocfs2_fs_options *features)
+{
+
+	if (!ocfs2_journal_check_available_features(jsb, features))
+		return OCFS2_ET_UNSUPP_FEATURE;
+
+	jsb->s_feature_compat &= ~(features->opt_compat);
+	jsb->s_feature_ro_compat &= ~(features->opt_ro_compat);
+	jsb->s_feature_incompat &= ~(features->opt_incompat);
+
+	return 0;
+}
+
 void ocfs2_swap_journal_superblock(journal_superblock_t *jsb)
 {
 	if (cpu_is_big_endian)
-- 
1.5.6.3




More information about the Ocfs2-tools-devel mailing list