mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-04-29 12:28:27 +02:00
f2fs: fix to propagate error from f2fs_enable_checkpoint()
In order to let userspace detect such error rather than suffering
silent failure.
Fixes: 4354994f09 ("f2fs: checkpoint disabling")
Cc: stable@kernel.org
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
+16
-10
@@ -2632,10 +2632,11 @@ restore_flag:
|
|||||||
return err;
|
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;
|
unsigned int nr_pages = get_pages(sbi, F2FS_DIRTY_DATA) / 16;
|
||||||
long long start, writeback, end;
|
long long start, writeback, end;
|
||||||
|
int ret;
|
||||||
|
|
||||||
f2fs_info(sbi, "f2fs_enable_checkpoint() starts, meta: %lld, node: %lld, data: %lld",
|
f2fs_info(sbi, "f2fs_enable_checkpoint() starts, meta: %lld, node: %lld, data: %lld",
|
||||||
get_pages(sbi, F2FS_DIRTY_META),
|
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);
|
set_sbi_flag(sbi, SBI_IS_DIRTY);
|
||||||
f2fs_up_write(&sbi->gc_lock);
|
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 */
|
/* Let's ensure there's no pending checkpoint anymore */
|
||||||
f2fs_flush_ckpt_thread(sbi);
|
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",
|
f2fs_info(sbi, "f2fs_enable_checkpoint() finishes, writeback:%llu, sync:%llu",
|
||||||
ktime_ms_delta(writeback, start),
|
ktime_ms_delta(writeback, start),
|
||||||
ktime_ms_delta(end, writeback));
|
ktime_ms_delta(end, writeback));
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __f2fs_remount(struct fs_context *fc, struct super_block *sb)
|
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;
|
goto restore_discard;
|
||||||
need_enable_checkpoint = true;
|
need_enable_checkpoint = true;
|
||||||
} else {
|
} else {
|
||||||
f2fs_enable_checkpoint(sbi);
|
err = f2fs_enable_checkpoint(sbi);
|
||||||
|
if (err)
|
||||||
|
goto restore_discard;
|
||||||
need_disable_checkpoint = true;
|
need_disable_checkpoint = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2935,7 +2941,8 @@ skip:
|
|||||||
return 0;
|
return 0;
|
||||||
restore_checkpoint:
|
restore_checkpoint:
|
||||||
if (need_enable_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) {
|
} else if (need_disable_checkpoint) {
|
||||||
if (f2fs_disable_checkpoint(sbi))
|
if (f2fs_disable_checkpoint(sbi))
|
||||||
f2fs_warn(sbi, "checkpoint has not been disabled");
|
f2fs_warn(sbi, "checkpoint has not been disabled");
|
||||||
@@ -5212,13 +5219,12 @@ reset_checkpoint:
|
|||||||
if (err)
|
if (err)
|
||||||
goto sync_free_meta;
|
goto sync_free_meta;
|
||||||
|
|
||||||
if (test_opt(sbi, DISABLE_CHECKPOINT)) {
|
if (test_opt(sbi, DISABLE_CHECKPOINT))
|
||||||
err = f2fs_disable_checkpoint(sbi);
|
err = f2fs_disable_checkpoint(sbi);
|
||||||
if (err)
|
else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG))
|
||||||
goto sync_free_meta;
|
err = f2fs_enable_checkpoint(sbi);
|
||||||
} else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)) {
|
if (err)
|
||||||
f2fs_enable_checkpoint(sbi);
|
goto sync_free_meta;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If filesystem is not mounted as read-only then
|
* If filesystem is not mounted as read-only then
|
||||||
|
|||||||
Reference in New Issue
Block a user