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 PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 16 Aug 2021 14:57:36 +0800 From: yangerkun <yangerkun@...wei.com> To: Theodore Ts'o <tytso@....edu>, Ext4 Developers List <linux-ext4@...r.kernel.org> CC: <yukuai3@...wei.com> Subject: Re: [PATCH] ext4: if zeroout fails fall back to splitting the extent node 在 2021/8/14 10:15, yangerkun 写道: > > > 在 2021/8/14 5:27, Theodore Ts'o 写道: >> If the underlying storage device is using thin-provisioning, it's >> possible for a zeroout operation to return ENOSPC. >> >> Commit df22291ff0fd ("ext4: Retry block allocation if we have free blocks >> left") added logic to retry block allocation since we might get free >> block >> after we commit a transaction. But the ENOSPC from thin-provisioning >> will confuse ext4, and lead to an infinite loop. >> >> Since using zeroout instead of splitting the extent node is an >> optimization, if it fails, we might as well fall back to splitting the >> extent node. >> >> Reported-by: yangerkun <yangerkun@...wei.com> >> Signed-off-by: Theodore Ts'o <tytso@....edu> >> --- >> >> I've run this through my battery of tests, and it doesn't cause any >> regressions. Yangerkun, can you test this and see if this works for >> you? > > Will do it. Thanks for the patch, it can help us to pass the testcase. And after some review, it's really a better fix for me. Thanks, Kun. > >> >> fs/ext4/extents.c | 5 +++-- >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c >> index 92ad64b89d9b..501516cadc1b 100644 >> --- a/fs/ext4/extents.c >> +++ b/fs/ext4/extents.c >> @@ -3569,7 +3569,7 @@ static int >> ext4_ext_convert_to_initialized(handle_t *handle, >> split_map.m_len - ee_block); >> err = ext4_ext_zeroout(inode, &zero_ex1); >> if (err) >> - goto out; >> + goto fallback; >> split_map.m_len = allocated; >> } >> if (split_map.m_lblk - ee_block + split_map.m_len < >> @@ -3583,7 +3583,7 @@ static int >> ext4_ext_convert_to_initialized(handle_t *handle, >> ext4_ext_pblock(ex)); >> err = ext4_ext_zeroout(inode, &zero_ex2); >> if (err) >> - goto out; >> + goto fallback; >> } >> split_map.m_len += split_map.m_lblk - ee_block; >> @@ -3592,6 +3592,7 @@ static int >> ext4_ext_convert_to_initialized(handle_t *handle, >> } >> } >> +fallback: >> err = ext4_split_extent(handle, inode, ppath, &split_map, >> split_flag, >> flags); >> if (err > 0) >> > .
Powered by blists - more mailing lists