[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