* [PATCH] f2fs: avoid NULL checkpoint thread access in sysfs
@ 2026-07-24 9:05 Wenjie Qi
2026-08-03 7:53 ` Chao Yu
0 siblings, 1 reply; 3+ messages in thread
From: Wenjie Qi @ 2026-07-24 9:05 UTC (permalink / raw)
To: jaegeuk, chao; +Cc: linux-f2fs-devel, linux-kernel, qiwenjie, qwjhust, stable
checkpoint_merge is set by default, but the checkpoint merge thread is not
created for read-only mounts. The ckpt_thread_ioprio sysfs store path uses
the mount option to decide whether to update the task ioprio. On such
mounts, writing the node passes a NULL task to set_task_ioprio().
Keep storing the requested ioprio, but apply it only when the checkpoint
thread exists. Take s_umount for ckpt_thread_ioprio and
critical_task_priority too, matching the existing protection for GC thread
entries.
Fixes: e65920661708 ("f2fs: add ckpt_thread_ioprio sysfs node")
Cc: stable@kernel.org
Signed-off-by: Wenjie Qi <qiwenjie@xiaomi.com>
---
Reproducer:
mount -o ro -t f2fs /dev/vdb /mnt/f2fs
echo be,4 > /sys/fs/f2fs/vdb/ckpt_thread_ioprio
Baseline dmesg:
Oops: general protection fault
KASAN: null-ptr-deref in range [0x00000000000007b0-0x00000000000007b7]
RIP: set_task_ioprio+0x8b/0x360
Call Trace:
f2fs_sbi_store+0x2af/0x2580
kernfs_fop_write_iter+0x360/0x620
vfs_write+0x5f8/0xf50
ksys_write+0xf9/0x1d0
do_syscall_64+0x5f/0x550
fs/f2fs/sysfs.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index be92c05a5420..0294544d3d34 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -557,7 +557,7 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
return -EINVAL;
cprc->ckpt_thread_ioprio = IOPRIO_PRIO_VALUE(class, level);
- if (test_opt(sbi, MERGE_CHECKPOINT)) {
+ if (cprc->f2fs_issue_ckpt) {
ret = set_task_ioprio(cprc->f2fs_issue_ckpt,
cprc->ckpt_thread_ioprio);
if (ret)
@@ -1007,13 +1007,16 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
ssize_t ret;
bool gc_entry = (!strcmp(a->attr.name, "gc_urgent") ||
a->struct_type == GC_THREAD);
+ bool thread_entry = gc_entry ||
+ !strcmp(a->attr.name, "ckpt_thread_ioprio") ||
+ !strcmp(a->attr.name, "critical_task_priority");
- if (gc_entry) {
+ if (thread_entry) {
if (!down_read_trylock(&sbi->sb->s_umount))
return -EAGAIN;
}
ret = __sbi_store(a, sbi, buf, count);
- if (gc_entry)
+ if (thread_entry)
up_read(&sbi->sb->s_umount);
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] f2fs: avoid NULL checkpoint thread access in sysfs
2026-07-24 9:05 [PATCH] f2fs: avoid NULL checkpoint thread access in sysfs Wenjie Qi
@ 2026-08-03 7:53 ` Chao Yu
2026-08-03 9:09 ` Wenjie Qi
0 siblings, 1 reply; 3+ messages in thread
From: Chao Yu @ 2026-08-03 7:53 UTC (permalink / raw)
To: Wenjie Qi, jaegeuk; +Cc: chao, linux-f2fs-devel, linux-kernel, qiwenjie, stable
On 7/24/26 17:05, Wenjie Qi wrote:
> checkpoint_merge is set by default, but the checkpoint merge thread is not
> created for read-only mounts. The ckpt_thread_ioprio sysfs store path uses
> the mount option to decide whether to update the task ioprio. On such
> mounts, writing the node passes a NULL task to set_task_ioprio().
>
> Keep storing the requested ioprio, but apply it only when the checkpoint
> thread exists. Take s_umount for ckpt_thread_ioprio and
> critical_task_priority too, matching the existing protection for GC thread
> entries.
>
> Fixes: e65920661708 ("f2fs: add ckpt_thread_ioprio sysfs node")
> Cc: stable@kernel.org
> Signed-off-by: Wenjie Qi <qiwenjie@xiaomi.com>
> ---
> Reproducer:
> mount -o ro -t f2fs /dev/vdb /mnt/f2fs
> echo be,4 > /sys/fs/f2fs/vdb/ckpt_thread_ioprio
>
> Baseline dmesg:
> Oops: general protection fault
> KASAN: null-ptr-deref in range [0x00000000000007b0-0x00000000000007b7]
> RIP: set_task_ioprio+0x8b/0x360
> Call Trace:
> f2fs_sbi_store+0x2af/0x2580
> kernfs_fop_write_iter+0x360/0x620
> vfs_write+0x5f8/0xf50
> ksys_write+0xf9/0x1d0
> do_syscall_64+0x5f/0x550
>
> fs/f2fs/sysfs.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
> index be92c05a5420..0294544d3d34 100644
> --- a/fs/f2fs/sysfs.c
> +++ b/fs/f2fs/sysfs.c
> @@ -557,7 +557,7 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
> return -EINVAL;
>
> cprc->ckpt_thread_ioprio = IOPRIO_PRIO_VALUE(class, level);
> - if (test_opt(sbi, MERGE_CHECKPOINT)) {
> + if (cprc->f2fs_issue_ckpt) {
> ret = set_task_ioprio(cprc->f2fs_issue_ckpt,
> cprc->ckpt_thread_ioprio);
> if (ret)
> @@ -1007,13 +1007,16 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
> ssize_t ret;
> bool gc_entry = (!strcmp(a->attr.name, "gc_urgent") ||
> a->struct_type == GC_THREAD);
> + bool thread_entry = gc_entry ||
> + !strcmp(a->attr.name, "ckpt_thread_ioprio") ||
> + !strcmp(a->attr.name, "critical_task_priority");
Oh, seems you fixed another race issue in this patch as well?
"mount -o remount,ro" vs "echo xx > critical_task_priority"
Can you fix this in a separated patch?
>
> - if (gc_entry) {
> + if (thread_entry) {
bool thread_entry = !strcmp(a->attr.name, "ckpt_thread_ioprio") ||
!strcmp(a->attr.name, "critical_task_priority");
if (gc_entry || thread_entry)
> if (!down_read_trylock(&sbi->sb->s_umount))
> return -EAGAIN;
> }
> ret = __sbi_store(a, sbi, buf, count);
> - if (gc_entry)
> + if (thread_entry)
if (gc_entry || thread_entry)
Thanks,
> up_read(&sbi->sb->s_umount);
>
> return ret;
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] f2fs: avoid NULL checkpoint thread access in sysfs
2026-08-03 7:53 ` Chao Yu
@ 2026-08-03 9:09 ` Wenjie Qi
0 siblings, 0 replies; 3+ messages in thread
From: Wenjie Qi @ 2026-08-03 9:09 UTC (permalink / raw)
To: Chao Yu; +Cc: jaegeuk, linux-f2fs-devel, linux-kernel, qiwenjie, stable
Yes. This patch also extends the existing s_umount protection to
ckpt_thread_ioprio and critical_task_priority, which is a separate
remount-vs-sysfs race issue.
I'll split it:
- keep only the NULL f2fs_issue_ckpt fix in this patch
- send the s_umount protection for ckpt_thread_ioprio and
critical_task_priority as a separate patch
On Mon, Aug 3, 2026 at 3:53 PM Chao Yu <chao@kernel.org> wrote:
>
> On 7/24/26 17:05, Wenjie Qi wrote:
> > checkpoint_merge is set by default, but the checkpoint merge thread is not
> > created for read-only mounts. The ckpt_thread_ioprio sysfs store path uses
> > the mount option to decide whether to update the task ioprio. On such
> > mounts, writing the node passes a NULL task to set_task_ioprio().
> >
> > Keep storing the requested ioprio, but apply it only when the checkpoint
> > thread exists. Take s_umount for ckpt_thread_ioprio and
> > critical_task_priority too, matching the existing protection for GC thread
> > entries.
> >
> > Fixes: e65920661708 ("f2fs: add ckpt_thread_ioprio sysfs node")
> > Cc: stable@kernel.org
> > Signed-off-by: Wenjie Qi <qiwenjie@xiaomi.com>
> > ---
> > Reproducer:
> > mount -o ro -t f2fs /dev/vdb /mnt/f2fs
> > echo be,4 > /sys/fs/f2fs/vdb/ckpt_thread_ioprio
> >
> > Baseline dmesg:
> > Oops: general protection fault
> > KASAN: null-ptr-deref in range [0x00000000000007b0-0x00000000000007b7]
> > RIP: set_task_ioprio+0x8b/0x360
> > Call Trace:
> > f2fs_sbi_store+0x2af/0x2580
> > kernfs_fop_write_iter+0x360/0x620
> > vfs_write+0x5f8/0xf50
> > ksys_write+0xf9/0x1d0
> > do_syscall_64+0x5f/0x550
> >
> > fs/f2fs/sysfs.c | 9 ++++++---
> > 1 file changed, 6 insertions(+), 3 deletions(-)
> >
> > diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
> > index be92c05a5420..0294544d3d34 100644
> > --- a/fs/f2fs/sysfs.c
> > +++ b/fs/f2fs/sysfs.c
> > @@ -557,7 +557,7 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
> > return -EINVAL;
> >
> > cprc->ckpt_thread_ioprio = IOPRIO_PRIO_VALUE(class, level);
> > - if (test_opt(sbi, MERGE_CHECKPOINT)) {
> > + if (cprc->f2fs_issue_ckpt) {
> > ret = set_task_ioprio(cprc->f2fs_issue_ckpt,
> > cprc->ckpt_thread_ioprio);
> > if (ret)
> > @@ -1007,13 +1007,16 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
> > ssize_t ret;
> > bool gc_entry = (!strcmp(a->attr.name, "gc_urgent") ||
> > a->struct_type == GC_THREAD);
> > + bool thread_entry = gc_entry ||
> > + !strcmp(a->attr.name, "ckpt_thread_ioprio") ||
> > + !strcmp(a->attr.name, "critical_task_priority");
>
> Oh, seems you fixed another race issue in this patch as well?
>
> "mount -o remount,ro" vs "echo xx > critical_task_priority"
>
> Can you fix this in a separated patch?
>
> >
> > - if (gc_entry) {
> > + if (thread_entry) {
>
> bool thread_entry = !strcmp(a->attr.name, "ckpt_thread_ioprio") ||
> !strcmp(a->attr.name, "critical_task_priority");
>
> if (gc_entry || thread_entry)
>
> > if (!down_read_trylock(&sbi->sb->s_umount))
> > return -EAGAIN;
> > }
> > ret = __sbi_store(a, sbi, buf, count);
> > - if (gc_entry)
> > + if (thread_entry)
>
> if (gc_entry || thread_entry)
>
> Thanks,
>
> > up_read(&sbi->sb->s_umount);
> >
> > return ret;
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-03 9:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-24 9:05 [PATCH] f2fs: avoid NULL checkpoint thread access in sysfs Wenjie Qi
2026-08-03 7:53 ` Chao Yu
2026-08-03 9:09 ` Wenjie Qi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox