Re: [f2fs-dev] [PATCH] f2fs: fix to avoid potential section-unaligned pinfile

Zhiguo Niu <[email protected]>
Newsgroups net.sourceforge.lists.linux-f2fs-devel,org.kernel.vger.linux-kernel
Message-ID <CAHJ8P3JFP6bdGfmHruanPFNgtHz8J7FYj0A1To7+iDpcsxzOaA@mail.gmail.com>
Chao Yu <[email protected]> 于2026年6月30日周二 19:02写道:
>
> On 6/30/26 16:50, Zhiguo Niu wrote:
> > Chao Yu via Linux-f2fs-devel <[email protected]>
> > 于2026年6月29日周一 19:52写道:
> >>
> >> Blocks of pinfile may not aligned to section size due to wrong use
> >> on pinfile, result in heavy overhead of GC, let avoid this by
> >> adding additional check condition in f2fs_setattr().
> >>
> >> - truncate -s 8mb pinfile
> >> : random checkpoint may persist filesize w/ inode
> >> - fallocate -o 0 -l 8mb pinfile
> >>  - f2fs_fallocate
> >>   - f2fs_expand_inode_data
> >>    - f2fs_allocate_pinning_section
> >>    - f2fs_map_blocks
> >>     - f2fs_map_lock
> >>     - __allocate_data_block
> >>     - file_need_truncate
> >>     : w/ FADVISE_TRUNC_BIT, we can expect unaligned mapping can be
> >>       truncated while open() if f2fs is not umount abnormally
> >>     - f2fs_map_unlock
> >>     : following f2fs checkpoint and sudden power-cut
> >>
> >> - mount
> >> - open pinfile
> >>  - f2fs_file_open
> >>   - finish_preallocate_blocks
> >>    - truncate_setsize
> >>    : filesize is 8mb
> >>    - f2fs_truncate
> >>    : can only truncate block outside filesize, rather than truncating
> >>      unaligned blocks inside filesize
> > Hi Chao,
> > 8MB is section alinged when fallocated by f2fs_allocate_pinning_section??
> > so How could there are unaligned blocks inside filesize?
>
> Zhiguo,
>
> As partial blkaddrs were persisted and recovered, see comments around
> f2fs_map_unlock().
>
> >>
> >> Fixes: f5a53edcf01e ("f2fs: support aligned pinned file")
> >> Cc: [email protected]
> >> Cc: Daeho Jeong <[email protected]>
> >> Signed-off-by: Chao Yu <[email protected]>
> >> ---
> >>  fs/f2fs/file.c | 28 +++++++++++++++++-----------
> >>  1 file changed, 17 insertions(+), 11 deletions(-)
> >>
> >> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> >> index f4facd409d9b..11cc8d79c235 100644
> >> --- a/fs/f2fs/file.c
> >> +++ b/fs/f2fs/file.c
> >> @@ -1107,17 +1107,23 @@ 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;
> >> +
> >> +               if (f2fs_is_pinned_file(inode)) {
> >> +                       /*
> >> +                        * It may break section-aligned fallocate recovery
> >> +                        * mechanism, so do not allow larger size truncation.
> >> +                        */
> >> +                       if (attr->ia_size > i_size_read(inode))
> >> +                               return -EINVAL;
> > Is it ok if we allow larger size truncation and also  limit it to
> > aligned "F2FS_BLK_TO_BYTES(CAP_BLKS_PER_SEC(sbi)"?
>
> No, I think above example will still suffer section-unaligned issue.
>
> Thanks,
Hi Chao,
got it and thanks for your explaination, so
Reviewed-by: Zhiguo Niu <[email protected]>
thanks!

>
> > thanks!
> >> +                       /*
> >> +                        * To prevent scattered pin block generation, we don't
> >> +                        * allow smaller/equal size unaligned truncation for
> >> +                        * pinned file.
> >> +                        */
> >> +                       else if (!IS_ALIGNED(attr->ia_size,
> >> +                               F2FS_BLK_TO_BYTES(CAP_BLKS_PER_SEC(sbi))))
> >> +                               return -EINVAL;
> >> +               }
> >>         }
> >>
> >>         if (is_quota_modification(idmap, inode, attr)) {
> >> --
> >> 2.49.0
> >>
> >>
> >>
> >> _______________________________________________
> >> Linux-f2fs-devel mailing list
> >> [email protected]
> >> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
>


_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.