summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorngkaho1234 <ngkaho1234@gmail.com>2015-11-28 20:27:54 +0000
committerngkaho1234 <ngkaho1234@gmail.com>2015-11-28 20:27:54 +0000
commit6079bff96f2beb1343fe3664b4781b8a258bee6b (patch)
treef30e69af615fa62bd11a63cd99c4c2f875ff5188
parente0720c64b73449e31a960d09e2f06cfce3b2bdeb (diff)
ext4_journal: initial journal replay support part 2.
-rw-r--r--lwext4/ext4_journal.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/lwext4/ext4_journal.c b/lwext4/ext4_journal.c
index e6d9c83..2f0a095 100644
--- a/lwext4/ext4_journal.c
+++ b/lwext4/ext4_journal.c
@@ -343,6 +343,7 @@ static void jbd_replay_block_tags(struct jbd_fs *jbd_fs,
uint32_t *this_block = arg->this_block;
struct revoke_entry *revoke_entry;
struct ext4_block journal_block, ext4_block;
+ struct ext4_fs *fs = jbd_fs->inode_ref.fs;
ext4_dbg(DEBUG_JBD,
"Replaying block in block_tag: %" PRIu64 "\n",
block);
@@ -356,18 +357,37 @@ static void jbd_replay_block_tags(struct jbd_fs *jbd_fs,
if (r != EOK)
return;
- r = ext4_block_get_noread(jbd_fs->bdev, &ext4_block, block);
- if (r != EOK) {
- jbd_block_set(jbd_fs, &journal_block);
- return;
- }
+ if (block) {
+ r = ext4_block_get_noread(fs->bdev, &ext4_block, block);
+ if (r != EOK) {
+ jbd_block_set(jbd_fs, &journal_block);
+ return;
+ }
+
+ memcpy(ext4_block.data,
+ journal_block.data,
+ jbd_get32(&jbd_fs->sb, blocksize));
- memcpy(ext4_block.data,
- journal_block.data,
- jbd_get32(&jbd_fs->sb, blocksize));
+ ext4_block.dirty = true;
+ ext4_block_set(fs->bdev, &ext4_block);
+ } else {
+ uint16_t mount_count, state;
+ mount_count = ext4_get16(&fs->sb, mount_count);
+ state = ext4_get16(&fs->sb, state);
+ memcpy(&fs->sb,
+ journal_block.data,
+ EXT4_SUPERBLOCK_SIZE);
+
+ /* Mark system as mounted */
+ ext4_set16(&fs->sb, state, state);
+ r = ext4_sb_write(fs->bdev, &fs->sb);
+ if (r != EOK)
+ return;
+
+ /*Update mount count*/
+ ext4_set16(&fs->sb, mount_count, mount_count);
+ }
- ext4_block.dirty = true;
- ext4_block_set(jbd_fs->bdev, &ext4_block);
jbd_block_set(jbd_fs, &journal_block);
return;