Messages in this thread | | | Date | Tue, 6 Jul 2021 12:03:48 -0400 | From | "Theodore Ts'o" <> | Subject | Re: [PATCH 1/2] ext4: Fix use-after-free about sbi->s_mmp_tsk |
| |
On Tue, Jul 06, 2021 at 01:11:37PM +0200, Jan Kara wrote: > > --- a/fs/ext4/mmp.c > > +++ b/fs/ext4/mmp.c > > @@ -157,6 +157,17 @@ static int kmmpd(void *data) > > sizeof(mmp->mmp_nodename)); > > > > while (!kthread_should_stop()) { > > + if (!(le32_to_cpu(es->s_feature_incompat) & > > + EXT4_FEATURE_INCOMPAT_MMP)) { > > We can probably use ext4_has_feature_mmp() macro when changing this?
Ack, I'll make that change.
> > + if (sb_rdonly(sb)) { > > + if (!kthread_should_stop()) > > + schedule_timeout_interruptible(HZ); > > Cannot this effectively block remount RO for 1s when we wait for kmmpd to > exit? I think doing 'break' when we detected RO super is fine. We'll write > the mmp block and then wait for kthread_should_stop() condition as in any > other abort case. Am I missing something?
Yeah, we do want to update the mmp block when remounting the file system read-only. So breaking out to exit is the right thing to do here.
> > +wait_to_exit: > > + while (!kthread_should_stop()) > > + schedule(); > > This makes me a bit nervous that we could unnecessarily burn CPU for > potentially a long time (e.g. if somebody uses tune2fs to disable MMP, we > would be sitting in this loop until the fs in remounted / unmounted). So > maybe we should have something like: > > while (!kthread_should_stop()) { > set_task_state(TASK_INTERRUPTIBLE); > if (!kthread_should_stop()) > schedule(); > } > > This should safely synchronize with (and not miss wakeup from) > kthread_stop() since that first sets KTHREAD_SHOULD_STOP and after that > calls wake_up_process().
Yep, good catch. I'll fix this and send out revised patch.
- Ted
| |