Message ID | 20250317190809.678626-1-daeho43@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [f2fs-dev] f2fs: support zero sized file truncate for device aliasing files | expand |
On Mon, Mar 17, 2025 at 8:45 PM Chao Yu <chao@kernel.org> wrote: > > On 3/18/25 03:08, Daeho Jeong wrote: > > From: Daeho Jeong <daehojeong@google.com> > > > > support a file truncation to zero size for device aliasing files. > > > > Signed-off-by: Daeho Jeong <daehojeong@google.com> > > --- > > fs/f2fs/file.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > > index f92a9fba9991..7ae5a5af5ed9 100644 > > --- a/fs/f2fs/file.c > > +++ b/fs/f2fs/file.c > > @@ -1036,7 +1036,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, > > > > if ((attr->ia_valid & ATTR_SIZE)) { > > if (!f2fs_is_compress_backend_ready(inode) || > > - IS_DEVICE_ALIASING(inode)) > > + (IS_DEVICE_ALIASING(inode) && attr->ia_size)) > > return -EOPNOTSUPP; > > if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED) && > > !IS_ALIGNED(attr->ia_size, > > @@ -1117,6 +1117,9 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, > > if (err) > > return err; > > Daeho, > > If truncate(, 0) failed due to some reasons, maybe, the file was partially > truncated, should we tag it as inconsistent status to avoid its later access? > thoughts? Hmm, looks like I did it wrong. Instead of invoking f2fs_destroy_extent_tree(), I need to make the length of the extent to zero when truncating the file. Is it okay with you? > > Thanks, > > > > > + if (IS_DEVICE_ALIASING(inode)) > > + f2fs_destroy_extent_tree(inode); > > + > > spin_lock(&fi->i_size_lock); > > inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); > > fi->last_disk_size = i_size_read(inode); >
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index f92a9fba9991..7ae5a5af5ed9 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -1036,7 +1036,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if ((attr->ia_valid & ATTR_SIZE)) { if (!f2fs_is_compress_backend_ready(inode) || - IS_DEVICE_ALIASING(inode)) + (IS_DEVICE_ALIASING(inode) && attr->ia_size)) return -EOPNOTSUPP; if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED) && !IS_ALIGNED(attr->ia_size, @@ -1117,6 +1117,9 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, if (err) return err; + if (IS_DEVICE_ALIASING(inode)) + f2fs_destroy_extent_tree(inode); + spin_lock(&fi->i_size_lock); inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); fi->last_disk_size = i_size_read(inode);