Whamcloud - gitweb
debugfs: fix printing of xattrs with ea_in_inode values
[tools/e2fsprogs.git] / debugfs / journal.c
index 82d5bca..c16daa5 100644 (file)
@@ -23,8 +23,8 @@
 #endif
 
 #define E2FSCK_INCLUDE_INLINE_FUNCS
-#include "jfs_user.h"
 #include "uuid/uuid.h"
+#include "journal.h"
 
 #ifdef CONFIG_JBD_DEBUG                /* Enabled by configure --enable-jfs-debug */
 static int bh_count = 0;
@@ -245,11 +245,17 @@ void wait_on_buffer(struct buffer_head *bh)
 
 static void ext2fs_clear_recover(ext2_filsys fs, int error)
 {
-       fs->super->s_feature_incompat &= ~EXT3_FEATURE_INCOMPAT_RECOVER;
+       ext2fs_clear_feature_journal_needs_recovery(fs->super);
 
        /* if we had an error doing journal recovery, we need a full fsck */
        if (error)
                fs->super->s_state &= ~EXT2_VALID_FS;
+       /*
+        * 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;
        ext2fs_mark_super_dirty(fs);
 }
 
@@ -451,8 +457,7 @@ try_backup_journal:
                        ext2fs_swap_super(&jsuper);
 #endif
                if (jsuper.s_magic != EXT2_SUPER_MAGIC ||
-                   !(jsuper.s_feature_incompat &
-                     EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)) {
+                   !ext2fs_has_feature_journal_dev(&jsuper)) {
                        retval = EXT2_ET_LOAD_EXT_JOURNAL;
                        brelse(bh);
                        goto errout;
@@ -466,8 +471,7 @@ try_backup_journal:
                }
 
                /* Check the superblock checksum */
-               if (jsuper.s_feature_ro_compat &
-                   EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) {
+               if (ext2fs_has_feature_metadata_csum(&jsuper)) {
                        struct struct_ext2_filsys fsx;
                        struct ext2_super_block superx;
                        void *p;
@@ -476,8 +480,7 @@ try_backup_journal:
                        memcpy(&fsx, fs, sizeof(fsx));
                        memcpy(&superx, fs->super, sizeof(superx));
                        fsx.super = &superx;
-                       fsx.super->s_feature_ro_compat |=
-                                       EXT4_FEATURE_RO_COMPAT_METADATA_CSUM;
+                       ext2fs_set_feature_metadata_csum(fsx.super);
                        if (!ext2fs_superblock_csum_verify(&fsx, p)) {
                                retval = EXT2_ET_LOAD_EXT_JOURNAL;
                                brelse(bh);
@@ -522,10 +525,8 @@ errout:
 static errcode_t ext2fs_journal_fix_bad_inode(ext2_filsys fs)
 {
        struct ext2_super_block *sb = fs->super;
-       int recover = fs->super->s_feature_incompat &
-               EXT3_FEATURE_INCOMPAT_RECOVER;
-       int has_journal = fs->super->s_feature_compat &
-               EXT3_FEATURE_COMPAT_HAS_JOURNAL;
+       int recover = ext2fs_has_feature_journal_needs_recovery(fs->super);
+       int has_journal = ext2fs_has_feature_journal(fs->super);
 
        if (has_journal || sb->s_journal_inum) {
                /* The journal inode is bogus, remove and force full fsck */
@@ -588,7 +589,7 @@ static errcode_t ext2fs_journal_load(journal_t *journal)
        case JFS_DESCRIPTOR_BLOCK:
        case JFS_COMMIT_BLOCK:
        case JFS_REVOKE_BLOCK:
-               return EXT2_ET_CORRUPT_SUPERBLOCK;
+               return EXT2_ET_CORRUPT_JOURNAL_SB;
 
        /* If we don't understand the superblock major type, but there
         * is a magic number, then it is likely to be a new format we
@@ -604,17 +605,16 @@ static errcode_t ext2fs_journal_load(journal_t *journal)
                return EXT2_ET_RO_UNSUPP_FEATURE;
 
        /* Checksum v1-3 are mutually exclusive features. */
-       if (JFS_HAS_INCOMPAT_FEATURE(journal, JFS_FEATURE_INCOMPAT_CSUM_V2) &&
-           JFS_HAS_INCOMPAT_FEATURE(journal, JFS_FEATURE_INCOMPAT_CSUM_V3))
-               return EXT2_ET_CORRUPT_SUPERBLOCK;
+       if (jfs_has_feature_csum2(journal) && jfs_has_feature_csum3(journal))
+               return EXT2_ET_CORRUPT_JOURNAL_SB;
 
        if (journal_has_csum_v2or3(journal) &&
-           JFS_HAS_COMPAT_FEATURE(journal, JFS_FEATURE_COMPAT_CHECKSUM))
-               return EXT2_ET_CORRUPT_SUPERBLOCK;
+           jfs_has_feature_checksum(journal))
+               return EXT2_ET_CORRUPT_JOURNAL_SB;
 
        if (!ext2fs_journal_verify_csum_type(journal, jsb) ||
            !ext2fs_journal_sb_csum_verify(journal, jsb))
-               return EXT2_ET_CORRUPT_SUPERBLOCK;
+               return EXT2_ET_CORRUPT_JOURNAL_SB;
 
        if (journal_has_csum_v2or3(journal))
                journal->j_csum_seed = jbd2_chksum(journal, ~0, jsb->s_uuid,
@@ -624,12 +624,12 @@ static errcode_t ext2fs_journal_load(journal_t *journal)
         * format to be able to proceed safely, so any other checks that
         * fail we should attempt to recover from. */
        if (jsb->s_blocksize != htonl(journal->j_blocksize))
-               return EXT2_ET_CORRUPT_SUPERBLOCK;
+               return EXT2_ET_CORRUPT_JOURNAL_SB;
 
        if (ntohl(jsb->s_maxlen) < journal->j_maxlen)
                journal->j_maxlen = ntohl(jsb->s_maxlen);
        else if (ntohl(jsb->s_maxlen) > journal->j_maxlen)
-               return EXT2_ET_CORRUPT_SUPERBLOCK;
+               return EXT2_ET_CORRUPT_JOURNAL_SB;
 
        journal->j_tail_sequence = ntohl(jsb->s_sequence);
        journal->j_transaction_sequence = journal->j_tail_sequence;
@@ -640,7 +640,7 @@ static errcode_t ext2fs_journal_load(journal_t *journal)
        return 0;
 }
 
-void ext2fs_journal_release(ext2_filsys fs, journal_t *journal,
+static void ext2fs_journal_release(ext2_filsys fs, journal_t *journal,
                                   int reset, int drop)
 {
        journal_superblock_t *jsb;
@@ -661,6 +661,8 @@ void ext2fs_journal_release(ext2_filsys fs, journal_t *journal,
                if (fs->io != fs->journal_io)
                        io_channel_close(fs->journal_io);
                fs->journal_io = NULL;
+               free(fs->journal_name);
+               fs->journal_name = NULL;
        }
 
 #ifndef USE_INODE_IO
@@ -676,16 +678,15 @@ void ext2fs_journal_release(ext2_filsys fs, journal_t *journal,
  * This function makes sure that the superblock fields regarding the
  * journal are consistent.
  */
-errcode_t ext2fs_check_ext3_journal(ext2_filsys fs)
+static errcode_t ext2fs_check_ext3_journal(ext2_filsys fs)
 {
        struct ext2_super_block *sb = fs->super;
        journal_t *journal;
-       int recover = fs->super->s_feature_incompat &
-               EXT3_FEATURE_INCOMPAT_RECOVER;
+       int recover = ext2fs_has_feature_journal_needs_recovery(fs->super);
        errcode_t retval;
 
        /* If we don't have any journal features, don't do anything more */
-       if (!(sb->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL) &&
+       if (!ext2fs_has_feature_journal(sb) &&
            !recover && sb->s_journal_inum == 0 && sb->s_journal_dev == 0 &&
            uuid_is_null(sb->s_journal_uuid))
                return 0;
@@ -703,13 +704,13 @@ errcode_t ext2fs_check_ext3_journal(ext2_filsys fs)
         * needs_recovery set but has_journal clear.  We can't get in a loop
         * with -y, -n, or -p, only if a user isn't making up their mind.
         */
-       if (!(sb->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL)) {
+       if (!ext2fs_has_feature_journal(sb)) {
                retval = EXT2_ET_JOURNAL_FLAGS_WRONG;
                goto err;
        }
 
-       if (sb->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL &&
-           !(sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_RECOVER) &&
+       if (ext2fs_has_feature_journal(sb) &&
+           !ext2fs_has_feature_journal_needs_recovery(sb) &&
            journal->j_superblock->s_start != 0) {
                retval = EXT2_ET_JOURNAL_FLAGS_WRONG;
                goto err;
@@ -720,7 +721,7 @@ errcode_t ext2fs_check_ext3_journal(ext2_filsys fs)
         * the journal's errno is set; if so, we need to mark the file
         * system as being corrupt and clear the journal's s_errno.
         */
-       if (!(sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_RECOVER) &&
+       if (!ext2fs_has_feature_journal_needs_recovery(sb) &&
            journal->j_superblock->s_errno) {
                fs->super->s_state |= EXT2_ERROR_FS;
                ext2fs_mark_super_dirty(fs);
@@ -798,14 +799,14 @@ errcode_t ext2fs_run_ext3_journal(ext2_filsys *fsp)
                kbytes_written = stats->bytes_written >> 10;
 
        ext2fs_mmp_stop(fs);
-       fsname = strdup(fs->device_name);
+       fsname = fs->device_name;
+       fs->device_name = NULL;
        fsflags = fs->flags;
        fsblocksize = fs->blocksize;
        ext2fs_free(fs);
-       retval = ext2fs_open(fsname, fsflags,
-                            0, fsblocksize, io_ptr,
-                            fsp);
-       free(fsname);
+       *fsp = NULL;
+       retval = ext2fs_open(fsname, fsflags, 0, fsblocksize, io_ptr, fsp);
+       ext2fs_free_mem(&fsname);
        if (retval)
                return retval;
 
@@ -929,7 +930,7 @@ void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag,
        csum32 = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&seq, sizeof(seq));
        csum32 = jbd2_chksum(j, csum32, bh->b_data, bh->b_size);
 
-       if (JFS_HAS_INCOMPAT_FEATURE(j, JFS_FEATURE_INCOMPAT_CSUM_V3))
+       if (jfs_has_feature_csum3(j))
                tag3->t_checksum = ext2fs_cpu_to_be32(csum32);
        else
                tag->t_checksum = ext2fs_cpu_to_be16(csum32);