Re: [f2fs-dev] [PATCH v4 2/2] f2fs: don't allow unaligned truncation to smaller/equal size on pinned file
From: wangzijie
Date: Sun Jun 29 2025 - 23:06:14 EST
>On 6/24/25 11:59, wangzijie wrote:
>> To prevent scattered pin block generation, don't allow non-section aligned truncation
>> to smaller or equal size on pinned file. But for truncation to larger size, after
>> commit 3fdd89b452c2("f2fs: prevent writing without fallocate() for pinned files"),
>> we only support overwrite IO to pinned file, so we don't need to consider
>> attr->ia_size > i_size case.
>
>Zijie, can you take a look generic/494? suspect that it is caused by this change.
>
>generic/494 3s ... - output mismatch (see /share/git/fstests/results//generic/494.out.bad)
> --- tests/generic/494.out 2025-01-12 21:57:40.279440664 +0800
> +++ /share/git/fstests/results//generic/494.out.bad 2025-06-30 10:01:37.000000000 +0800
> @@ -2,7 +2,7 @@
> Format and mount
> Initialize file
> Try to truncate
> -ftruncate: Text file busy
> +ftruncate: Invalid argument
> Try to punch hole
> fallocate: Text file busy
> ...
> (Run 'diff -u /share/git/fstests/tests/generic/494.out /share/git/fstests/results//generic/494.out.bad' to see the entire diff)
>Ran: generic/494
>Failures: generic/494
>Failed 1 of 1 tests
>
>Thanks,
Hi, Chao
generic/494 swapon file and try to ftruncate.
Before this change
swap_acticate:
set_inode_flag(inode, FI_PIN_FILE)
ftruncate:
setattr_prepare
-inode_newsize_ok
--return -ETXTBSY for SWAPFILE
After this change:
swap_acticate:
set_inode_flag(inode, FI_PIN_FILE)
ftruncate:
prevent unaligned truncation before setattr_prepare()
return -EINVAL
Sorry for this. Maybe I should apply this check after setattr_prepare()? Or do
you have some suggestions?
>>
>> Signed-off-by: wangzijie <wangzijie1@xxxxxxxxx>
>> ---
>> v4:
>> - convert sbi first and apply change
>> ---
>> fs/f2fs/file.c | 11 +++++++++++
>> 1 file changed, 11 insertions(+)
>>
>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
>> index 209f43653..4809f0fd6 100644
>> --- a/fs/f2fs/file.c
>> +++ b/fs/f2fs/file.c
>> @@ -1048,6 +1048,17 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
>> !IS_ALIGNED(attr->ia_size,
>> F2FS_BLK_TO_BYTES(fi->i_cluster_size)))
>> return -EINVAL;
>> + /*
>> + * To prevent scattered pin block generation, we don't allow
>> + * smaller/equal size unaligned truncation for pinned file.
>> + * We only support overwrite IO to pinned file, so don't
>> + * care about larger size truncation.
>> + */
>> + if (f2fs_is_pinned_file(inode) &&
>> + attr->ia_size <= i_size_read(inode) &&
>> + !IS_ALIGNED(attr->ia_size,
>> + F2FS_BLK_TO_BYTES(CAP_BLKS_PER_SEC(sbi))))
>> + return -EINVAL;
>> }
>>
>> err = setattr_prepare(idmap, dentry, attr);