Commit be112e74 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim
Browse files

f2fs: fix to propagate error from f2fs_enable_checkpoint()



In order to let userspace detect such error rather than suffering
silent failure.

Fixes: 4354994f ("f2fs: checkpoint disabling")
Cc: stable@kernel.org
Signed-off-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 89c16629
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -2632,10 +2632,11 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
	return err;
}

static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
static int f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
{
	unsigned int nr_pages = get_pages(sbi, F2FS_DIRTY_DATA) / 16;
	long long start, writeback, end;
	int ret;

	f2fs_info(sbi, "f2fs_enable_checkpoint() starts, meta: %lld, node: %lld, data: %lld",
					get_pages(sbi, F2FS_DIRTY_META),
@@ -2669,7 +2670,9 @@ static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
	set_sbi_flag(sbi, SBI_IS_DIRTY);
	f2fs_up_write(&sbi->gc_lock);

	f2fs_sync_fs(sbi->sb, 1);
	ret = f2fs_sync_fs(sbi->sb, 1);
	if (ret)
		f2fs_err(sbi, "%s sync_fs failed, ret: %d", __func__, ret);

	/* Let's ensure there's no pending checkpoint anymore */
	f2fs_flush_ckpt_thread(sbi);
@@ -2679,6 +2682,7 @@ static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
	f2fs_info(sbi, "f2fs_enable_checkpoint() finishes, writeback:%llu, sync:%llu",
					ktime_ms_delta(writeback, start),
					ktime_ms_delta(end, writeback));
	return ret;
}

static int __f2fs_remount(struct fs_context *fc, struct super_block *sb)
@@ -2892,7 +2896,9 @@ static int __f2fs_remount(struct fs_context *fc, struct super_block *sb)
				goto restore_discard;
			need_enable_checkpoint = true;
		} else {
			f2fs_enable_checkpoint(sbi);
			err = f2fs_enable_checkpoint(sbi);
			if (err)
				goto restore_discard;
			need_disable_checkpoint = true;
		}
	}
@@ -2935,7 +2941,8 @@ static int __f2fs_remount(struct fs_context *fc, struct super_block *sb)
	return 0;
restore_checkpoint:
	if (need_enable_checkpoint) {
		f2fs_enable_checkpoint(sbi);
		if (f2fs_enable_checkpoint(sbi))
			f2fs_warn(sbi, "checkpoint has not been enabled");
	} else if (need_disable_checkpoint) {
		if (f2fs_disable_checkpoint(sbi))
			f2fs_warn(sbi, "checkpoint has not been disabled");
@@ -5212,13 +5219,12 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc)
	if (err)
		goto sync_free_meta;

	if (test_opt(sbi, DISABLE_CHECKPOINT)) {
	if (test_opt(sbi, DISABLE_CHECKPOINT))
		err = f2fs_disable_checkpoint(sbi);
	else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG))
		err = f2fs_enable_checkpoint(sbi);
	if (err)
		goto sync_free_meta;
	} else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)) {
		f2fs_enable_checkpoint(sbi);
	}

	/*
	 * If filesystem is not mounted as read-only then