[Ocfs2-tools-devel] [PATCH 3/9] fsck.ocfs2: Replay 64bit journals.

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


Properly handle the new 64bit journal_block_tag_t.  This includes
fsck.ocfs2's replay and debugfs.ocfs2's display.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 debugfs.ocfs2/dump.c  |    8 +++++---
 fsck.ocfs2/journal.c  |   29 +++++++++++++++--------------
 include/ocfs2/jbd2.h  |    8 --------
 include/ocfs2/ocfs2.h |    3 +++
 libocfs2/mkjournal.c  |   16 ++++++++++++++++
 5 files changed, 39 insertions(+), 25 deletions(-)

diff --git a/debugfs.ocfs2/dump.c b/debugfs.ocfs2/dump.c
index fe69f3d..2efcf2b 100644
--- a/debugfs.ocfs2/dump.c
+++ b/debugfs.ocfs2/dump.c
@@ -527,7 +527,7 @@ void dump_jbd_block (FILE *out, journal_superblock_t *jsb,
 	uint32_t *blocknr;
 	char *uuid;
 	struct ocfs2_super_block *sb = OCFS2_RAW_SB(gbls.fs->fs_super);
-	int tag_bytes = journal_tag_bytes(jsb);
+	int tag_bytes = ocfs2_journal_tag_bytes(jsb);
 
 	tagflg = g_string_new (NULL);
 
@@ -545,8 +545,10 @@ void dump_jbd_block (FILE *out, journal_superblock_t *jsb,
 			tag = (journal_block_tag_t *) &blk[i];
 
 			get_tag_flag(ntohl(tag->t_flags), tagflg);
-			fprintf (out, "\t%2d. %-15u %-s\n",
-				 count, ntohl(tag->t_blocknr), tagflg->str);
+			fprintf (out, "\t%2d. %-15"PRIu64" %-s\n",
+				 count,
+                                 ocfs2_journal_tag_block(tag, tag_bytes),
+                                 tagflg->str);
 			g_string_truncate (tagflg, 0);
 
 			if (tag->t_flags & htonl(JBD2_FLAG_LAST_TAG))
diff --git a/fsck.ocfs2/journal.c b/fsck.ocfs2/journal.c
index ae00367..2770164 100644
--- a/fsck.ocfs2/journal.c
+++ b/fsck.ocfs2/journal.c
@@ -202,7 +202,7 @@ static errcode_t count_tags(ocfs2_filesys *fs, journal_superblock_t *jsb,
 {
 	char *tagp, *last;
 	journal_block_tag_t *tag;
-	int tag_bytes = journal_tag_bytes(jsb);
+	int tag_bytes = ocfs2_journal_tag_bytes(jsb);
 	uint64_t nr = 0;
 
 	if (jsb->s_blocksize < sizeof(journal_header_t) + tag_bytes)
@@ -215,7 +215,7 @@ static errcode_t count_tags(ocfs2_filesys *fs, journal_superblock_t *jsb,
 		tag = (journal_block_tag_t *)tagp;
 		nr++;
 		if (ocfs2_block_out_of_range(fs, 
-					     be32_to_cpu(tag->t_blocknr)))
+					     ocfs2_journal_tag_block(tag, tag_bytes)))
 			return OCFS2_ET_BAD_JOURNAL_TAG;
 
 		if (tag->t_flags & cpu_to_be32(JBD2_FLAG_LAST_TAG))
@@ -285,12 +285,14 @@ static errcode_t read_journal_block(ocfs2_filesys *fs,
 static errcode_t replay_blocks(ocfs2_filesys *fs, struct journal_info *ji,
 			       char *buf, uint64_t seq, uint64_t *next_block)
 {
-	journal_block_tag_t tag;
 	char *tagp;
+	journal_block_tag_t *tag;
 	size_t i, num;
 	char *io_buf = NULL;
 	errcode_t err, ret = 0;
-	int tag_bytes = journal_tag_bytes(ji->ji_jsb);
+	int tag_bytes = ocfs2_journal_tag_bytes(ji->ji_jsb);
+	uint32_t t_flags;
+	uint64_t block64;
 		
 	tagp = buf + sizeof(journal_header_t);
 	num = (ji->ji_jsb->s_blocksize - sizeof(journal_header_t)) / 
@@ -303,16 +305,16 @@ static errcode_t replay_blocks(ocfs2_filesys *fs, struct journal_info *ji,
 	}
 
 	for(i = 0; i < num; i++, tagp += tag_bytes, (*next_block)++) {
-		memcpy(&tag, tagp, tag_bytes);
-		tag.t_flags = be32_to_cpu(tag.t_flags);
-		tag.t_blocknr = be32_to_cpu(tag.t_blocknr);
+		tag = (journal_block_tag_t *)tagp;
+		t_flags = be32_to_cpu(tag->t_flags);
+		block64 = ocfs2_journal_tag_block(tag, tag_bytes);
 
 		*next_block = jwrap(ji->ji_jsb, *next_block);
 
 		verbosef("recovering journal block %"PRIu64" to disk block "
-			 "%"PRIu32"\n", *next_block, tag.t_blocknr);	
+			 "%"PRIu64"\n", *next_block, block64);
 
-		if (revoke_this_block(&ji->ji_revoke, tag.t_blocknr, seq))
+		if (revoke_this_block(&ji->ji_revoke, block64, seq))
 			goto skip_io;
 
 		err = read_journal_block(fs, ji, *next_block, io_buf, 1);
@@ -321,20 +323,19 @@ static errcode_t replay_blocks(ocfs2_filesys *fs, struct journal_info *ji,
 			goto skip_io;
 		}
 
-		if (tag.t_flags & JBD2_FLAG_ESCAPE) {
+		if (t_flags & JBD2_FLAG_ESCAPE) {
 			uint32_t magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
 			memcpy(io_buf, &magic, sizeof(magic));
 		}
 
-		err = io_write_block(fs->fs_io, tag.t_blocknr, 1, 
-				     io_buf);
+		err = io_write_block(fs->fs_io, block64, 1, io_buf);
 		if (err)
 			ret = err;
 
 	skip_io:
-		if (tag.t_flags & JBD2_FLAG_LAST_TAG)
+		if (t_flags & JBD2_FLAG_LAST_TAG)
 			i = num; /* be sure to increment next_block */
-		if (!(tag.t_flags & JBD2_FLAG_SAME_UUID))
+		if (!(t_flags & JBD2_FLAG_SAME_UUID))
 			tagp += 16;
 	}
 	
diff --git a/include/ocfs2/jbd2.h b/include/ocfs2/jbd2.h
index 734b75c..68a524d 100644
--- a/include/ocfs2/jbd2.h
+++ b/include/ocfs2/jbd2.h
@@ -176,12 +176,4 @@ typedef struct journal_superblock_s
 #define JBD2_KNOWN_ROCOMPAT_FEATURES	0
 #define JBD2_KNOWN_INCOMPAT_FEATURES	JBD2_FEATURE_INCOMPAT_REVOKE
 
-static inline size_t journal_tag_bytes(journal_superblock_t *jsb)
-{
-	if (JBD2_HAS_INCOMPAT_FEATURE(jsb, JBD2_FEATURE_INCOMPAT_64BIT))
-		return JBD2_TAG_SIZE64;
-	else
-		return JBD2_TAG_SIZE32;
-}
-
 #endif		/* _JBD2_H_ */
diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
index c184e5c..bdeadb9 100644
--- a/include/ocfs2/ocfs2.h
+++ b/include/ocfs2/ocfs2.h
@@ -289,6 +289,9 @@ 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);
+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);
 
 errcode_t ocfs2_read_extent_block(ocfs2_filesys *fs, uint64_t blkno,
        				  char *eb_buf);
diff --git a/libocfs2/mkjournal.c b/libocfs2/mkjournal.c
index 71bdfa4..e14a34d 100644
--- a/libocfs2/mkjournal.c
+++ b/libocfs2/mkjournal.c
@@ -34,6 +34,22 @@
 #include "ocfs2/byteorder.h"
 #include "ocfs2/ocfs2.h"
 
+size_t ocfs2_journal_tag_bytes(journal_superblock_t *jsb)
+{
+	if (JBD2_HAS_INCOMPAT_FEATURE(jsb, JBD2_FEATURE_INCOMPAT_64BIT))
+		return JBD2_TAG_SIZE64;
+	else
+		return JBD2_TAG_SIZE32;
+}
+
+uint64_t ocfs2_journal_tag_block(journal_block_tag_t *tag, size_t tag_bytes)
+{
+	uint64_t blockno = be32_to_cpu(tag->t_blocknr);
+	if (tag_bytes > JBD2_TAG_SIZE32)
+		blockno |= (uint64_t)be32_to_cpu(tag->t_blocknr_high) << 32;
+	return blockno;
+}
+
 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