diff options
Diffstat (limited to '')
-rw-r--r-- | debugfs/journal.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/debugfs/journal.c b/debugfs/journal.c index 5bac0d3..04611ac 100644 --- a/debugfs/journal.c +++ b/debugfs/journal.c @@ -245,6 +245,8 @@ void wait_on_buffer(struct buffer_head *bh) static void ext2fs_clear_recover(ext2_filsys fs, int error) { + time_t s_mtime; + ext2fs_clear_feature_journal_needs_recovery(fs->super); /* if we had an error doing journal recovery, we need a full fsck */ @@ -254,8 +256,9 @@ static void ext2fs_clear_recover(ext2_filsys fs, int error) * If we replayed the journal by definition the file system * was mounted since the last time it was checked */ - if (fs->super->s_lastcheck >= fs->super->s_mtime) - fs->super->s_lastcheck = fs->super->s_mtime - 1; + s_mtime = ext2fs_get_tstamp(fs->super, s_mtime); + if (ext2fs_get_tstamp(fs->super, s_lastcheck) >= s_mtime) + ext2fs_set_tstamp(fs->super, s_lastcheck, s_mtime - 1); ext2fs_mark_super_dirty(fs); } @@ -789,6 +792,8 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp) char *fsname; int fsflags; int fsblocksize; + char *save; + __u16 s_error_state; if (!(fs->flags & EXT2_FLAG_RW)) return EXT2_ET_FILE_RO; @@ -808,6 +813,12 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp) if (stats && stats->bytes_written) kbytes_written = stats->bytes_written >> 10; + save = malloc(EXT4_S_ERR_LEN); + if (save) + memcpy(save, ((char *) fs->super) + EXT4_S_ERR_START, + EXT4_S_ERR_LEN); + s_error_state = fs->super->s_state & EXT2_ERROR_FS; + ext2fs_mmp_stop(fs); fsname = fs->device_name; fs->device_name = NULL; @@ -818,11 +829,15 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp) retval = ext2fs_open(fsname, fsflags, 0, fsblocksize, io_ptr, fsp); ext2fs_free_mem(&fsname); if (retval) - return retval; + goto outfree; fs = *fsp; fs->flags |= EXT2_FLAG_MASTER_SB_ONLY; fs->super->s_kbytes_written += kbytes_written; + fs->super->s_state |= s_error_state; + if (save) + memcpy(((char *) fs->super) + EXT4_S_ERR_START, save, + EXT4_S_ERR_LEN); /* Set the superblock flags */ ext2fs_clear_recover(fs, recover_retval != 0); @@ -832,6 +847,9 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp) * the EXT2_ERROR_FS flag in the fs superblock if needed. */ retval = ext2fs_check_ext3_journal(fs); + +outfree: + free(save); return retval ? retval : recover_retval; } |