[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