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
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ