The commit is pushed to "branch-rh9-5.14.0-427.106.1.vz9.90.x-ovz" and will 
appear at [email protected]:openvz/vzkernel.git
after rh9-5.14.0-427.106.1.vz9.90.1
------>
commit 5de87b23170c4a4b55d42ae45bef7583028c2324
Author: Tony Solomonik <[email protected]>
Date:   Thu Jan 29 11:15:04 2026 +0000

    ms/Add do_ftruncate that truncates a struct file
    
    do_sys_ftruncate receives a file descriptor, fgets the struct file, and
    finally actually truncates the file.
    
    do_ftruncate allows for passing in a file directly, with the caller
    already holding a reference to it.
    
    Signed-off-by: Tony Solomonik <[email protected]>
    Reviewed-by: Christian Brauner <[email protected]>
    Link: 
https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jens Axboe <[email protected]>
    (cherry picked from commit 5f0d594c602f870e3a3872f7ea42bf846a1d26cf)
    
    https://virtuozzo.atlassian.net/browse/VSTOR-123292
    Signed-off-by: Vasileios Almpanis <[email protected]>
    
    Feature: fix ms/fs
    ======
    Patchset description:
    dm-ploop: truncate helpers cleanup and read-only table fix
    
      - Add a new do_ftruncate() helper that operates directly on a struct
        file, allowing in-kernel callers to truncate files without going
        through file descriptor based interfaces.
      - Export do_ftruncate() so it can be used by other kernel subsystems.
      - Revert the recently introduced vfs_truncate2() helper, which becomes
        redundant after exporting do_ftruncate() and adds unnecessary API
        surface.
      - Fix dm-ploop target constructor logic to avoid preallocating
        clusters when the table is created in read-only mode. Userspace
        may still pass the optional fallo_new_clu argument, but
        preallocation must be skipped for read-only ploop devices.
---
 fs/internal.h |  1 +
 fs/open.c     | 53 ++++++++++++++++++++++++++++-------------------------
 2 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/fs/internal.h b/fs/internal.h
index d4f05a3aa34af..2fbfd5863397a 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -138,6 +138,7 @@ extern struct open_how build_open_how(int flags, umode_t 
mode);
 extern int build_open_flags(const struct open_how *how, struct open_flags *op);
 extern struct file *__close_fd_get_file(unsigned int fd);
 
+long do_ftruncate(struct file *file, loff_t length, int small);
 long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
 int chmod_common(const struct path *path, umode_t mode);
 int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
diff --git a/fs/open.c b/fs/open.c
index 8d30f25f3a593..b82f5fc333d7f 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -153,49 +153,52 @@ COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, 
path, compat_off_t, length
 }
 #endif
 
-long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
+long do_ftruncate(struct file *file, loff_t length, int small)
 {
        struct inode *inode;
        struct dentry *dentry;
-       struct fd f;
        int error;
 
-       error = -EINVAL;
-       if (length < 0)
-               goto out;
-       error = -EBADF;
-       f = fdget(fd);
-       if (!f.file)
-               goto out;
-
        /* explicitly opened as large or we are on 64-bit box */
-       if (f.file->f_flags & O_LARGEFILE)
+       if (file->f_flags & O_LARGEFILE)
                small = 0;
 
-       dentry = f.file->f_path.dentry;
+       dentry = file->f_path.dentry;
        inode = dentry->d_inode;
-       error = -EINVAL;
-       if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE))
-               goto out_putf;
+       if (!S_ISREG(inode->i_mode) || !(file->f_mode & FMODE_WRITE))
+               return -EINVAL;
 
-       error = -EINVAL;
        /* Cannot ftruncate over 2^31 bytes without large file support */
        if (small && length > MAX_NON_LFS)
-               goto out_putf;
+               return -EINVAL;
 
-       error = -EPERM;
        /* Check IS_APPEND on real upper inode */
-       if (IS_APPEND(file_inode(f.file)))
-               goto out_putf;
+       if (IS_APPEND(file_inode(file)))
+               return -EPERM;
        sb_start_write(inode->i_sb);
-       error = security_path_truncate(&f.file->f_path);
+       error = security_path_truncate(&file->f_path);
        if (!error)
-               error = do_truncate(file_mnt_user_ns(f.file), dentry, length,
-                                   ATTR_MTIME | ATTR_CTIME, f.file);
+               error = do_truncate(file_mnt_user_ns(file), dentry, length,
+                                   ATTR_MTIME | ATTR_CTIME, file);
        sb_end_write(inode->i_sb);
-out_putf:
+
+       return error;
+}
+
+long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
+{
+       struct fd f;
+       int error;
+
+       if (length < 0)
+               return -EINVAL;
+       f = fdget(fd);
+       if (!f.file)
+               return -EBADF;
+
+       error = do_ftruncate(f.file, length, small);
+
        fdput(f);
-out:
        return error;
 }
 
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to