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