diff options
| author | ngkaho1234 <ngkaho1234@gmail.com> | 2016-04-28 17:31:33 +0000 |
|---|---|---|
| committer | ngkaho1234 <ngkaho1234@gmail.com> | 2016-04-28 17:31:54 +0000 |
| commit | 2a5abdbf8c1375f83edde31831cd8b0bb36bc6d8 (patch) | |
| tree | 84918af98cf779da90da49b8bbf7918d9bc9ccbb /src | |
| parent | d480c36c2b0ca911db32f94d83e6ec56fb03331b (diff) | |
ext4_journal: fix not wrapping blocks when recovering.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ext4_journal.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/ext4_journal.c b/src/ext4_journal.c index 60eaadc..1b5a99e 100644 --- a/src/ext4_journal.c +++ b/src/ext4_journal.c @@ -96,6 +96,14 @@ struct replay_arg { uint32_t this_trans_id; }; +/* Make sure we wrap around the log correctly! */ +#define wrap(sb, var) \ +do { \ + if (var >= jbd_get32((sb), maxlen)) \ + var -= (jbd_get32((sb), maxlen) - jbd_get32((sb), first)); \ +} while (0) + + static int jbd_revoke_entry_cmp(struct revoke_entry *a, struct revoke_entry *b) { @@ -816,6 +824,7 @@ static void jbd_display_block_tags(struct jbd_fs *jbd_fs, uint32_t *iblock = arg; ext4_dbg(DEBUG_JBD, "Block in block_tag: %" PRIu64 "\n", block); (*iblock)++; + wrap(&jbd_fs->sb, *iblock); (void)jbd_fs; (void)uuid; return; @@ -848,6 +857,7 @@ static void jbd_replay_block_tags(struct jbd_fs *jbd_fs, struct ext4_fs *fs = jbd_fs->inode_ref.fs; (*this_block)++; + wrap(&jbd_fs->sb, *this_block); /* We replay this block only if the current transaction id * is equal or greater than that in revoke entry.*/ @@ -940,12 +950,6 @@ static void jbd_destroy_revoke_tree(struct recover_info *info) } } -/* Make sure we wrap around the log correctly! */ -#define wrap(sb, var) \ -do { \ - if (var >= jbd_get32((sb), maxlen)) \ - var -= (jbd_get32((sb), maxlen) - jbd_get32((sb), first)); \ -} while (0) #define ACTION_SCAN 0 #define ACTION_REVOKE 1 |
