#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;
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);
}
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;
}
/* 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;
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);
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 */
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
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,
* 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;
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;
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
* 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;
* 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;
* 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);
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;
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);