mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
ext4: factor out ext4_load_and_init_journal()
This patch group the journal load and initialize code together and factor out ext4_load_and_init_journal(). This patch also removes the lable 'no_journal' which is not needed after refactor. Signed-off-by: Jason Yan <yanaijie@huawei.com> Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> Link: https://lore.kernel.org/r/20220916141527.1012715-13-yanaijie@huawei.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
a4e6a511d7
commit
9c1dd22d74
157
fs/ext4/super.c
157
fs/ext4/super.c
@ -4800,6 +4800,93 @@ static int ext4_group_desc_init(struct super_block *sb,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ext4_load_and_init_journal(struct super_block *sb,
|
||||
struct ext4_super_block *es,
|
||||
struct ext4_fs_context *ctx)
|
||||
{
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
int err;
|
||||
|
||||
err = ext4_load_journal(sb, es, ctx->journal_devnum);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (ext4_has_feature_64bit(sb) &&
|
||||
!jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
|
||||
JBD2_FEATURE_INCOMPAT_64BIT)) {
|
||||
ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!set_journal_csum_feature_set(sb)) {
|
||||
ext4_msg(sb, KERN_ERR, "Failed to set journal checksum "
|
||||
"feature set");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&
|
||||
!jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
|
||||
JBD2_FEATURE_INCOMPAT_FAST_COMMIT)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Failed to set fast commit journal feature");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* We have now updated the journal if required, so we can
|
||||
* validate the data journaling mode. */
|
||||
switch (test_opt(sb, DATA_FLAGS)) {
|
||||
case 0:
|
||||
/* No mode set, assume a default based on the journal
|
||||
* capabilities: ORDERED_DATA if the journal can
|
||||
* cope, else JOURNAL_DATA
|
||||
*/
|
||||
if (jbd2_journal_check_available_features
|
||||
(sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
|
||||
set_opt(sb, ORDERED_DATA);
|
||||
sbi->s_def_mount_opt |= EXT4_MOUNT_ORDERED_DATA;
|
||||
} else {
|
||||
set_opt(sb, JOURNAL_DATA);
|
||||
sbi->s_def_mount_opt |= EXT4_MOUNT_JOURNAL_DATA;
|
||||
}
|
||||
break;
|
||||
|
||||
case EXT4_MOUNT_ORDERED_DATA:
|
||||
case EXT4_MOUNT_WRITEBACK_DATA:
|
||||
if (!jbd2_journal_check_available_features
|
||||
(sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
|
||||
ext4_msg(sb, KERN_ERR, "Journal does not support "
|
||||
"requested data journaling mode");
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA &&
|
||||
test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
|
||||
ext4_msg(sb, KERN_ERR, "can't mount with "
|
||||
"journal_async_commit in data=ordered mode");
|
||||
goto out;
|
||||
}
|
||||
|
||||
set_task_ioprio(sbi->s_journal->j_task, ctx->journal_ioprio);
|
||||
|
||||
sbi->s_journal->j_submit_inode_data_buffers =
|
||||
ext4_journal_submit_inode_data_buffers;
|
||||
sbi->s_journal->j_finish_inode_data_buffers =
|
||||
ext4_journal_finish_inode_data_buffers;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
/* flush s_error_work before journal destroy. */
|
||||
flush_work(&sbi->s_error_work);
|
||||
jbd2_journal_destroy(sbi->s_journal);
|
||||
sbi->s_journal = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
|
||||
{
|
||||
struct buffer_head *bh;
|
||||
@ -5162,7 +5249,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
|
||||
* root first: it may be modified in the journal!
|
||||
*/
|
||||
if (!test_opt(sb, NOLOAD) && ext4_has_feature_journal(sb)) {
|
||||
err = ext4_load_journal(sb, es, ctx->journal_devnum);
|
||||
err = ext4_load_and_init_journal(sb, es, ctx);
|
||||
if (err)
|
||||
goto failed_mount3a;
|
||||
} else if (test_opt(sb, NOLOAD) && !sb_rdonly(sb) &&
|
||||
@ -5200,76 +5287,8 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
|
||||
clear_opt2(sb, JOURNAL_FAST_COMMIT);
|
||||
sbi->s_journal = NULL;
|
||||
needs_recovery = 0;
|
||||
goto no_journal;
|
||||
}
|
||||
|
||||
if (ext4_has_feature_64bit(sb) &&
|
||||
!jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
|
||||
JBD2_FEATURE_INCOMPAT_64BIT)) {
|
||||
ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature");
|
||||
goto failed_mount_wq;
|
||||
}
|
||||
|
||||
if (!set_journal_csum_feature_set(sb)) {
|
||||
ext4_msg(sb, KERN_ERR, "Failed to set journal checksum "
|
||||
"feature set");
|
||||
goto failed_mount_wq;
|
||||
}
|
||||
|
||||
if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&
|
||||
!jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
|
||||
JBD2_FEATURE_INCOMPAT_FAST_COMMIT)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Failed to set fast commit journal feature");
|
||||
goto failed_mount_wq;
|
||||
}
|
||||
|
||||
/* We have now updated the journal if required, so we can
|
||||
* validate the data journaling mode. */
|
||||
switch (test_opt(sb, DATA_FLAGS)) {
|
||||
case 0:
|
||||
/* No mode set, assume a default based on the journal
|
||||
* capabilities: ORDERED_DATA if the journal can
|
||||
* cope, else JOURNAL_DATA
|
||||
*/
|
||||
if (jbd2_journal_check_available_features
|
||||
(sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
|
||||
set_opt(sb, ORDERED_DATA);
|
||||
sbi->s_def_mount_opt |= EXT4_MOUNT_ORDERED_DATA;
|
||||
} else {
|
||||
set_opt(sb, JOURNAL_DATA);
|
||||
sbi->s_def_mount_opt |= EXT4_MOUNT_JOURNAL_DATA;
|
||||
}
|
||||
break;
|
||||
|
||||
case EXT4_MOUNT_ORDERED_DATA:
|
||||
case EXT4_MOUNT_WRITEBACK_DATA:
|
||||
if (!jbd2_journal_check_available_features
|
||||
(sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
|
||||
ext4_msg(sb, KERN_ERR, "Journal does not support "
|
||||
"requested data journaling mode");
|
||||
goto failed_mount_wq;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA &&
|
||||
test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
|
||||
ext4_msg(sb, KERN_ERR, "can't mount with "
|
||||
"journal_async_commit in data=ordered mode");
|
||||
goto failed_mount_wq;
|
||||
}
|
||||
|
||||
set_task_ioprio(sbi->s_journal->j_task, ctx->journal_ioprio);
|
||||
|
||||
sbi->s_journal->j_submit_inode_data_buffers =
|
||||
ext4_journal_submit_inode_data_buffers;
|
||||
sbi->s_journal->j_finish_inode_data_buffers =
|
||||
ext4_journal_finish_inode_data_buffers;
|
||||
|
||||
no_journal:
|
||||
if (!test_opt(sb, NO_MBCACHE)) {
|
||||
sbi->s_ea_block_cache = ext4_xattr_create_cache();
|
||||
if (!sbi->s_ea_block_cache) {
|
||||
|
Loading…
Reference in New Issue
Block a user