Unverified Commit 604e996d authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!14475 ext4: correct behaviors under errors=remount-ro mode

Merge Pull Request from: @ci-robot 
 
PR sync from: Baokun Li <libaokun1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/NM6VJGKKWMM5HX6QY3BC7CPXIGILJCDA/ 
Baokun Li (8):
  sb_writers: fix kabi broken
  Revert "ext4: don't set SB_RDONLY after filesystem errors"
  Revert "ext4: replace read-only check for shutdown check in mmp code"
  Revert "ext4: drop read-only check from ext4_force_commit()"
  Revert "ext4: drop read-only check in ext4_write_inode()"
  Revert "ext4: drop read-only check in ext4_init_inode_table()"
  Revert "ext4: warn on read-only filesystem in
    ext4_journal_check_start()"
  Revert "ext4: drop EXT4_MF_FS_ABORTED flag"

Jan Kara (1):
  fs: fix a hungtask problem when freeze/unfreeze fs


-- 
2.46.1
 
https://gitee.com/openeuler/kernel/issues/IBEQJ3 
 
Link:https://gitee.com/openeuler/kernel/pulls/14475

 

Reviewed-by: default avatarzhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 5971c544 f9a4843c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1821,6 +1821,7 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
 */
enum {
	EXT4_MF_MNTDIR_SAMPLED,
	EXT4_MF_FS_ABORTED,	/* Fatal error detected */
	EXT4_MF_FC_INELIGIBLE	/* Fast commit ineligible */
};

+1 −2
Original line number Diff line number Diff line
@@ -71,9 +71,8 @@ static int ext4_journal_check_start(struct super_block *sb)
	if (unlikely(ext4_forced_shutdown(sb)))
		return -EIO;

	if (WARN_ON_ONCE(sb_rdonly(sb)))
	if (sb_rdonly(sb))
		return -EROFS;

	WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
	journal = EXT4_SB(sb)->s_journal;
	/*
+4 −3
Original line number Diff line number Diff line
@@ -131,6 +131,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
	int ret = 0, err;
	bool needs_barrier = false;
	struct inode *inode = file->f_mapping->host;
	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);

	if (unlikely(ext4_forced_shutdown(inode->i_sb)))
		return -EIO;
@@ -140,14 +141,14 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
	trace_ext4_sync_file_enter(file, datasync);

	if (sb_rdonly(inode->i_sb)) {
		/* Make sure that we read updated s_ext4_flags value */
		/* Make sure that we read updated s_mount_flags value */
		smp_rmb();
		if (ext4_forced_shutdown(inode->i_sb))
		if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))
			ret = -EROFS;
		goto out;
	}

	if (!EXT4_SB(inode->i_sb)->s_journal) {
	if (!sbi->s_journal) {
		ret = ext4_fsync_nojournal(file, start, end, datasync,
					   &needs_barrier);
		if (needs_barrier)
+6 −0
Original line number Diff line number Diff line
@@ -1533,6 +1533,12 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,
	int num, ret = 0, used_blks = 0;
	unsigned long used_inos = 0;

	/* This should not happen, but just to be sure check this */
	if (sb_rdonly(sb)) {
		ret = 1;
		goto out;
	}

	gdp = ext4_get_group_desc(sb, group, &group_desc_bh);
	if (!gdp || !grp)
		goto out;
+7 −4
Original line number Diff line number Diff line
@@ -2293,7 +2293,8 @@ static int mpage_map_and_submit_extent(handle_t *handle,
		if (err < 0) {
			struct super_block *sb = inode->i_sb;

			if (ext4_forced_shutdown(sb))
			if (ext4_forced_shutdown(sb) ||
			    ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
				goto invalidate_dirty_pages;
			/*
			 * Let the uper layers retry transient errors.
@@ -2616,13 +2617,14 @@ static int ext4_do_writepages(struct mpage_da_data *mpd)
	 * If the filesystem has aborted, it is read-only, so return
	 * right away instead of dumping stack traces later on that
	 * will obscure the real source of the problem.  We test
	 * fs shutdown state instead of sb->s_flag's SB_RDONLY because
	 * EXT4_MF_FS_ABORTED instead of sb->s_flag's SB_RDONLY because
	 * the latter could be true if the filesystem is mounted
	 * read-only, and in that case, ext4_writepages should
	 * *never* be called, so if that ever happens, we would want
	 * the stack trace.
	 */
	if (unlikely(ext4_forced_shutdown(mapping->host->i_sb))) {
	if (unlikely(ext4_forced_shutdown(mapping->host->i_sb) ||
		     ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))) {
		ret = -EROFS;
		goto out_writepages;
	}
@@ -5809,7 +5811,8 @@ int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
{
	int err;

	if (WARN_ON_ONCE(current->flags & PF_MEMALLOC))
	if (WARN_ON_ONCE(current->flags & PF_MEMALLOC) ||
	    sb_rdonly(inode->i_sb))
		return 0;

	if (unlikely(ext4_forced_shutdown(inode->i_sb)))
Loading