@@ -402,7 +402,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
ext4_fsblk_t blk;
struct ext4_group_info *grp;
- if (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(sb, EXT4_FC_REPLAY))
return 0;
grp = ext4_get_group_info(sb, block_group);
@@ -1817,6 +1817,20 @@ static inline int ext4_test_mount_flag(struct super_block *sb, int bit)
return test_bit(bit, &EXT4_SB(sb)->s_mount_flags);
}
+static inline void ext4_set_mount_state(struct super_block *sb, int state)
+{
+ EXT4_SB(sb)->s_mount_state |= state;
+}
+
+static inline void ext4_clear_mount_state(struct super_block *sb, int state)
+{
+ EXT4_SB(sb)->s_mount_state &= ~state;
+}
+
+static inline int ext4_test_mount_state(struct super_block *sb, int state)
+{
+ return EXT4_SB(sb)->s_mount_state & state;
+}
/*
* Simulate_fail codes
@@ -106,7 +106,7 @@ handle_t *__ext4_journal_start_sb(struct inode *inode,
return ERR_PTR(err);
journal = EXT4_SB(sb)->s_journal;
- if (!journal || (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY))
+ if (!journal || ext4_test_mount_state(sb, EXT4_FC_REPLAY))
return ext4_get_nojournal();
return jbd2__journal_start(journal, blocks, rsv_blocks, revoke_creds,
GFP_NOFS, type, line);
@@ -309,7 +309,7 @@ void ext4_es_find_extent_range(struct inode *inode,
ext4_lblk_t lblk, ext4_lblk_t end,
struct extent_status *es)
{
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return;
trace_ext4_es_find_extent_range_enter(inode, lblk);
@@ -362,7 +362,7 @@ bool ext4_es_scan_range(struct inode *inode,
{
bool ret;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return false;
read_lock(&EXT4_I(inode)->i_es_lock);
@@ -408,7 +408,7 @@ bool ext4_es_scan_clu(struct inode *inode,
{
bool ret;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return false;
read_lock(&EXT4_I(inode)->i_es_lock);
@@ -842,7 +842,7 @@ void ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
struct extent_status *es1 = NULL;
struct extent_status *es2 = NULL;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return;
es_debug("add [%u/%u) %llu %x to extent status tree of inode %lu\n",
@@ -917,7 +917,7 @@ void ext4_es_cache_extent(struct inode *inode, ext4_lblk_t lblk,
struct extent_status newes;
ext4_lblk_t end = lblk + len - 1;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return;
newes.es_lblk = lblk;
@@ -955,7 +955,7 @@ int ext4_es_lookup_extent(struct inode *inode, ext4_lblk_t lblk,
struct rb_node *node;
int found = 0;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return 0;
trace_ext4_es_lookup_extent_enter(inode, lblk);
@@ -1468,7 +1468,7 @@ void ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk,
int reserved = 0;
struct extent_status *es = NULL;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return;
trace_ext4_es_remove_extent(inode, lblk, len);
@@ -2024,7 +2024,7 @@ void ext4_es_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk,
struct extent_status *es1 = NULL;
struct extent_status *es2 = NULL;
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
return;
es_debug("add [%u/1) delayed to extent status tree of inode %lu\n",
@@ -232,7 +232,7 @@ __releases(&EXT4_SB(inode->i_sb)->s_fc_lock)
static bool ext4_fc_disabled(struct super_block *sb)
{
return (!test_opt2(sb, JOURNAL_FAST_COMMIT) ||
- (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY));
+ ext4_test_mount_state(sb, EXT4_FC_REPLAY));
}
/*
@@ -1975,7 +1975,7 @@ void ext4_fc_replay_cleanup(struct super_block *sb)
{
struct ext4_sb_info *sbi = EXT4_SB(sb);
- sbi->s_mount_state &= ~EXT4_FC_REPLAY;
+ ext4_clear_mount_state(sb, EXT4_FC_REPLAY);
kfree(sbi->s_fc_replay_state.fc_regions);
kfree(sbi->s_fc_replay_state.fc_modified_inodes);
}
@@ -2165,7 +2165,7 @@ static int ext4_fc_replay(journal_t *journal, struct buffer_head *bh,
if (state->fc_current_pass != pass) {
state->fc_current_pass = pass;
- sbi->s_mount_state |= EXT4_FC_REPLAY;
+ ext4_set_mount_state(sb, EXT4_FC_REPLAY);
}
if (!sbi->s_fc_replay_state.fc_replay_num_tags) {
ext4_debug("Replay stops\n");
@@ -84,7 +84,7 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
ext4_fsblk_t blk;
struct ext4_group_info *grp;
- if (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(sb, EXT4_FC_REPLAY))
return 0;
grp = ext4_get_group_info(sb, block_group);
@@ -291,7 +291,7 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)
bitmap_bh = NULL;
goto error_return;
}
- if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY)) {
grp = ext4_get_group_info(sb, block_group);
if (!grp || unlikely(EXT4_MB_GRP_IBITMAP_CORRUPT(grp))) {
fatal = -EFSCORRUPTED;
@@ -1040,7 +1040,7 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap,
if (ext4_free_inodes_count(sb, gdp) == 0)
goto next_group;
- if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY)) {
grp = ext4_get_group_info(sb, group);
/*
* Skip groups with already-known suspicious inode
@@ -1053,7 +1053,7 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap,
brelse(inode_bitmap_bh);
inode_bitmap_bh = ext4_read_inode_bitmap(sb, group);
/* Skip groups with suspicious inode tables */
- if (((!(sbi->s_mount_state & EXT4_FC_REPLAY))
+ if (((ext4_test_mount_state(sb, EXT4_FC_REPLAY))
&& EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) ||
IS_ERR(inode_bitmap_bh)) {
inode_bitmap_bh = NULL;
@@ -1073,7 +1073,7 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap,
goto next_group;
}
- if ((!(sbi->s_mount_state & EXT4_FC_REPLAY)) && !handle) {
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY) && !handle) {
BUG_ON(nblocks <= 0);
handle = __ext4_journal_start_sb(NULL, dir->i_sb,
line_no, handle_type, nblocks, 0,
@@ -1181,7 +1181,7 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap,
int free;
struct ext4_group_info *grp = NULL;
- if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY)) {
grp = ext4_get_group_info(sb, group);
if (!grp) {
err = -EFSCORRUPTED;
@@ -1207,7 +1207,7 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap,
if (ino > free)
ext4_itable_unused_set(sb, gdp,
(EXT4_INODES_PER_GROUP(sb) - ino));
- if (!(sbi->s_mount_state & EXT4_FC_REPLAY))
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY))
up_read(&grp->alloc_sem);
} else {
ext4_lock_group(sb, group);
@@ -502,7 +502,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
return -EFSCORRUPTED;
/* Lookup extent status tree firstly */
- if (!(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) &&
+ if (!ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY) &&
ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es)) {
if (ext4_es_is_written(&es) || ext4_es_is_unwritten(&es)) {
map->m_pblk = ext4_es_pblock(&es) +
@@ -810,7 +810,7 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
bool nowait = map_flags & EXT4_GET_BLOCKS_CACHED_NOWAIT;
int err;
- ASSERT((EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ ASSERT(ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY)
|| handle != NULL || create == 0);
ASSERT(create == 0 || !nowait);
@@ -831,7 +831,7 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
return ERR_PTR(-ENOMEM);
if (map.m_flags & EXT4_MAP_NEW) {
ASSERT(create != 0);
- ASSERT((EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ ASSERT(ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY)
|| (handle != NULL));
/*
@@ -4723,7 +4723,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
if ((!ext4_inode_csum_verify(inode, raw_inode, ei) ||
ext4_simulate_fail(sb, EXT4_SIM_INODE_CRC)) &&
- (!(EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY))) {
+ (!ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))) {
ext4_error_inode_err(inode, function, line, 0,
EFSBADCRC, "iget: checksum invalid");
ret = -EFSBADCRC;
@@ -4760,7 +4760,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
*/
if (inode->i_nlink == 0) {
if ((inode->i_mode == 0 || flags & EXT4_IGET_SPECIAL ||
- !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) &&
+ !ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY)) &&
ino != EXT4_BOOT_LOADER_INO) {
/* this inode is deleted or unallocated */
if (flags & EXT4_IGET_SPECIAL) {
@@ -4884,7 +4884,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
goto bad_inode;
} else if (!ext4_has_inline_data(inode)) {
/* validate the block references in the inode */
- if (!(EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY) &&
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY) &&
(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
(S_ISLNK(inode->i_mode) &&
!ext4_inode_is_fast_symlink(inode)))) {
@@ -1911,7 +1911,7 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b,
blocknr = ext4_group_first_block_no(sb, e4b->bd_group);
blocknr += EXT4_C2B(sbi, block);
- if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {
+ if (!ext4_test_mount_state(sb, EXT4_FC_REPLAY)) {
ext4_grp_locked_error(sb, e4b->bd_group,
inode ? inode->i_ino : 0,
blocknr,
@@ -5538,7 +5538,7 @@ void ext4_discard_preallocations(struct inode *inode, unsigned int needed)
return;
}
- if (EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(sb, EXT4_FC_REPLAY))
return;
mb_debug(sb, "discard preallocation for inode %lu\n",
@@ -6175,7 +6175,7 @@ ext4_fsblk_t ext4_mb_new_blocks(handle_t *handle,
sbi = EXT4_SB(sb);
trace_ext4_request_blocks(ar);
- if (sbi->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(sb, EXT4_FC_REPLAY))
return ext4_mb_new_blocks_simple(ar, errp);
/* Allow to use superuser reservation for quota file */
@@ -6672,7 +6672,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
block = bh->b_blocknr;
}
- if (sbi->s_mount_state & EXT4_FC_REPLAY) {
+ if (ext4_test_mount_state(sb, EXT4_FC_REPLAY)) {
ext4_free_blocks_simple(inode, block, EXT4_NUM_B2C(sbi, count));
return;
}
@@ -3251,7 +3251,7 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
* the inode. That's because it might have gotten
* renamed to a different inode number
*/
- if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+ if (ext4_test_mount_state(inode->i_sb, EXT4_FC_REPLAY))
skip_remove_dentry = 1;
else
goto out_bh;
@@ -3996,7 +3996,7 @@ static int ext4_rename(struct mnt_idmap *idmap, struct inode *old_dir,
if (new.inode)
ext4_fc_track_unlink(handle, new.dentry);
if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&
- !(EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY) &&
+ !(ext4_test_mount_state(sb, EXT4_FC_REPLAY)) &&
!(ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE))) {
__ext4_fc_track_link(handle, old.inode, new.dentry);
__ext4_fc_track_unlink(handle, old.inode, old.dentry);
@@ -233,7 +233,8 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode)
struct ext4_iloc iloc;
int err = 0;
- if (!sbi->s_journal && !(sbi->s_mount_state & EXT4_ORPHAN_FS))
+ if (!sbi->s_journal &&
+ !ext4_test_mount_state(inode->i_sb, EXT4_ORPHAN_FS))
return 0;
WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) &&
@@ -408,7 +409,7 @@ void ext4_orphan_cleanup(struct super_block *sb, struct ext4_super_block *es)
return;
}
- if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
+ if (ext4_test_mount_state(sb, EXT4_ERROR_FS)) {
/* don't clear list on RO mount w/ errors */
if (es->s_last_orphan && !(s_flags & SB_RDONLY)) {
ext4_msg(sb, KERN_INFO, "Errors on filesystem, "
@@ -458,7 +459,7 @@ void ext4_orphan_cleanup(struct super_block *sb, struct ext4_super_block *es)
* We may have encountered an error during cleanup; if
* so, skip the rest.
*/
- if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
+ if (ext4_test_mount_state(sb, EXT4_ERROR_FS)) {
ext4_debug("Skipping orphan recovery on fs with errors.\n");
es->s_last_orphan = 0;
break;
@@ -79,7 +79,7 @@ int ext4_resize_begin(struct super_block *sb)
* We are not allowed to do online-resizing on a filesystem mounted
* with error, because it can destroy the filesystem easily.
*/
- if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
+ if (ext4_test_mount_state(sb, EXT4_ERROR_FS)) {
ext4_warning(sb, "There are errors in the filesystem, "
"so online resizing is not allowed");
return -EPERM;
@@ -1230,7 +1230,7 @@ static void update_backups(struct super_block *sb, sector_t blk_off, char *data,
if (err) {
ext4_warning(sb, "can't update backup for group %u (err %d), "
"forcing fsck on next reboot", group, err);
- sbi->s_mount_state &= ~EXT4_VALID_FS;
+ ext4_clear_mount_state(sb, EXT4_VALID_FS);
sbi->s_es->s_state &= cpu_to_le16(~EXT4_VALID_FS);
mark_buffer_dirty(sbi->s_sbh);
}
@@ -652,7 +652,7 @@ static void ext4_handle_error(struct super_block *sb, bool force_ro, int error,
journal_t *journal = EXT4_SB(sb)->s_journal;
bool continue_fs = !force_ro && test_opt(sb, ERRORS_CONT);
- EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
+ ext4_set_mount_state(sb, EXT4_ERROR_FS);
if (test_opt(sb, WARN_ON_ERROR))
WARN_ON_ONCE(1);
@@ -1014,7 +1014,7 @@ __acquires(bitlock)
if (test_opt(sb, ERRORS_CONT)) {
if (test_opt(sb, WARN_ON_ERROR))
WARN_ON_ONCE(1);
- EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
+ ext4_set_mount_state(sb, EXT4_ERROR_FS);
if (!bdev_read_only(sb->s_bdev)) {
save_error_info(sb, EFSCORRUPTED, ino, block, function,
line);
@@ -3090,10 +3090,10 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es,
}
if (read_only)
goto done;
- if (!(sbi->s_mount_state & EXT4_VALID_FS))
+ if (!ext4_test_mount_state(sb, EXT4_VALID_FS))
ext4_msg(sb, KERN_WARNING, "warning: mounting unchecked fs, "
"running e2fsck is recommended");
- else if (sbi->s_mount_state & EXT4_ERROR_FS)
+ else if (ext4_test_mount_state(sb, EXT4_ERROR_FS))
ext4_msg(sb, KERN_WARNING,
"warning: mounting fs with errors, "
"running e2fsck is recommended");
@@ -5573,9 +5573,9 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
&sbi->s_bdev_wb_err);
sb->s_bdev->bd_super = sb;
- EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
+ ext4_set_mount_state(sb, EXT4_ORPHAN_FS);
ext4_orphan_cleanup(sb, es);
- EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
+ ext4_clear_mount_state(sb, EXT4_ORPHAN_FS);
/*
* Update the checksum after updating free space/inode counters and
* ext4_orphan_cleanup. Otherwise the superblock can have an incorrect
@@ -6023,8 +6023,8 @@ static int ext4_load_journal(struct super_block *sb,
}
kfree(save);
orig_state = es->s_state;
- es->s_state |= cpu_to_le16(EXT4_SB(sb)->s_mount_state &
- EXT4_ERROR_FS);
+ es->s_state |= cpu_to_le16(ext4_test_mount_state(sb,
+ EXT4_ERROR_FS));
if (orig_state != es->s_state)
changed = true;
/* Write out restored error information to the superblock */
@@ -6263,7 +6263,7 @@ static int ext4_clear_journal_err(struct super_block *sb,
ext4_warning(sb, "Filesystem error recorded "
"from previous mount: %s", errstr);
- EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
+ ext4_set_mount_state(sb, EXT4_ERROR_FS);
es->s_state |= cpu_to_le16(EXT4_ERROR_FS);
j_errno = ext4_commit_super(sb);
if (j_errno)
@@ -6544,7 +6544,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
* mark the partition as valid again.
*/
if (!(es->s_state & cpu_to_le16(EXT4_VALID_FS)) &&
- (sbi->s_mount_state & EXT4_VALID_FS))
+ (ext4_test_mount_state(sb, EXT4_VALID_FS)))
es->s_state = cpu_to_le16(sbi->s_mount_state);
if (sbi->s_journal) {