lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <615FBFB6.9030208@huawei.com> Date: Fri, 8 Oct 2021 11:49:10 +0800 From: yebin <yebin10@...wei.com> To: Jan Kara <jack@...e.cz> CC: <tytso@....edu>, <adilger.kernel@...ger.ca>, <linux-ext4@...r.kernel.org>, <linux-kernel@...r.kernel.org> Subject: Re: [PATCH -next v2 6/6] ext4: fix possible store wrong check interval value in disk when umount On 2021/10/7 21:12, Jan Kara wrote: > On Sat 11-09-21 17:00:59, Ye Bin wrote: >> Test follow steps: >> 1. mkfs.ext4 /dev/sda -O mmp >> 2. mount /dev/sda /mnt >> 3. wait for about 1 minute >> 4. umount mnt >> 5. debugfs /dev/sda >> 6. dump_mmp >> 7. fsck.ext4 /dev/sda >> >> I found 'check_interval' is range in [5, 10]. And sometime run fsck >> print "MMP interval is 10 seconds and total wait time is 42 seconds. >> Please wait...". >> kmmpd: >> ... >> if (diff < mmp_update_interval * HZ) >> schedule_timeout_interruptible(mmp_update_interval * HZ - diff); >> diff = jiffies - last_update_time; >> ... >> mmp_check_interval = max(min(EXT4_MMP_CHECK_MULT * diff / HZ, >> EXT4_MMP_MAX_CHECK_INTERVAL), >> EXT4_MMP_MIN_CHECK_INTERVAL); >> mmp->mmp_check_interval = cpu_to_le16(mmp_check_interval); >> ... >> We will call ext4_stop_mmpd to stop kmmpd kthread when umount, and >> schedule_timeout_interruptible will be interrupted, so 'diff' maybe >> little than mmp_update_interval. Then mmp_check_interval will range >> in [EXT4_MMP_MAX_CHECK_INTERVAL, EXT4_MMP_CHECK_MULT * diff / HZ]. >> To solve this issue, if 'diff' little then mmp_update_interval * HZ >> just break loop, don't update check interval. >> >> Signed-off-by: Ye Bin <yebin10@...wei.com> >> --- >> fs/ext4/mmp.c | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c >> index a0d47a906faa..f39e1fa0c6db 100644 >> --- a/fs/ext4/mmp.c >> +++ b/fs/ext4/mmp.c >> @@ -205,6 +205,14 @@ static int kmmpd(void *data) >> schedule_timeout_interruptible(mmp_update_interval * >> HZ - diff); >> diff = jiffies - last_update_time; >> + /* If 'diff' little 'than mmp_update_interval * HZ', it >> + * means someone call ext4_stop_mmpd to stop kmmpd >> + * kthread. We don't need to update mmp_check_interval >> + * any more, as 'diff' is not exact value. >> + */ >> + if (unlikely(diff < mmp_update_interval * HZ && >> + kthread_should_stop())) >> + break; >> } > So in this case, mmp_check_interval would be EXT4_MMP_MIN_CHECK_INTERVAL. I > don't quite understand what the practical problem is - the fsck message? > That will happen anytime mmp_check_interval is >= 10 AFAICT and I don't > quite see how that is connected to this condition... Can you explain a bit > more please? > > Honza I just think 'mmp_check_interval' is not reflect real check interval, and also sometime run fsck print "MMP interval is 10 seconds and total wait time is 42 seconds. Please wait...", but sometime not.
Powered by blists - more mailing lists