Merge tag 'for-6.9/io_uring-20240310' of git://git.kernel.dk/linux
Pull io_uring updates from Jens Axboe: - Make running of task_work internal loops more fair, and unify how the different methods deal with them (me) - Support for per-ring NAPI. The two minor networking patches are in a shared branch with netdev (Stefan) - Add support for truncate (Tony) - Export SQPOLL utilization stats (Xiaobing) - Multishot fixes (Pavel) - Fix for a race in manipulating the request flags via poll (Pavel) - Cleanup the multishot checking by making it generic, moving it out of opcode handlers (Pavel) - Various tweaks and cleanups (me, Kunwu, Alexander) * tag 'for-6.9/io_uring-20240310' of git://git.kernel.dk/linux: (53 commits) io_uring: Fix sqpoll utilization check racing with dying sqpoll io_uring/net: dedup io_recv_finish req completion io_uring: refactor DEFER_TASKRUN multishot checks io_uring: fix mshot io-wq checks io_uring/net: add io_req_msg_cleanup() helper io_uring/net: simplify msghd->msg_inq checking io_uring/kbuf: rename REQ_F_PARTIAL_IO to REQ_F_BL_NO_RECYCLE io_uring/net: remove dependency on REQ_F_PARTIAL_IO for sr->done_io io_uring/net: correctly handle multishot recvmsg retry setup io_uring/net: clear REQ_F_BL_EMPTY in the multishot retry handler io_uring: fix io_queue_proc modifying req->flags io_uring: fix mshot read defer taskrun cqe posting io_uring/net: fix overflow check in io_recvmsg_mshot_prep() io_uring/net: correct the type of variable io_uring/sqpoll: statistics of the true utilization of sq threads io_uring/net: move recv/recvmsg flags out of retry loop io_uring/kbuf: flag request if buffer pool is empty after buffer pick io_uring/net: improve the usercopy for sendmsg/recvmsg io_uring/net: move receive multishot out of the generic msghdr path io_uring/net: unify how recvmsg and sendmsg copy in the msghdr ...
This commit is contained in:
65
fs/open.c
65
fs/open.c
@@ -154,49 +154,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;
|
||||
int error;
|
||||
|
||||
/* explicitly opened as large or we are on 64-bit box */
|
||||
if (file->f_flags & O_LARGEFILE)
|
||||
small = 0;
|
||||
|
||||
dentry = file->f_path.dentry;
|
||||
inode = dentry->d_inode;
|
||||
if (!S_ISREG(inode->i_mode) || !(file->f_mode & FMODE_WRITE))
|
||||
return -EINVAL;
|
||||
|
||||
/* Cannot ftruncate over 2^31 bytes without large file support */
|
||||
if (small && length > MAX_NON_LFS)
|
||||
return -EINVAL;
|
||||
|
||||
/* Check IS_APPEND on real upper inode */
|
||||
if (IS_APPEND(file_inode(file)))
|
||||
return -EPERM;
|
||||
sb_start_write(inode->i_sb);
|
||||
error = security_file_truncate(file);
|
||||
if (!error)
|
||||
error = do_truncate(file_mnt_idmap(file), dentry, length,
|
||||
ATTR_MTIME | ATTR_CTIME, file);
|
||||
sb_end_write(inode->i_sb);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
|
||||
{
|
||||
struct fd f;
|
||||
int error;
|
||||
|
||||
error = -EINVAL;
|
||||
if (length < 0)
|
||||
goto out;
|
||||
error = -EBADF;
|
||||
return -EINVAL;
|
||||
f = fdget(fd);
|
||||
if (!f.file)
|
||||
goto out;
|
||||
return -EBADF;
|
||||
|
||||
/* explicitly opened as large or we are on 64-bit box */
|
||||
if (f.file->f_flags & O_LARGEFILE)
|
||||
small = 0;
|
||||
error = do_ftruncate(f.file, length, small);
|
||||
|
||||
dentry = f.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;
|
||||
|
||||
error = -EINVAL;
|
||||
/* Cannot ftruncate over 2^31 bytes without large file support */
|
||||
if (small && length > MAX_NON_LFS)
|
||||
goto out_putf;
|
||||
|
||||
error = -EPERM;
|
||||
/* Check IS_APPEND on real upper inode */
|
||||
if (IS_APPEND(file_inode(f.file)))
|
||||
goto out_putf;
|
||||
sb_start_write(inode->i_sb);
|
||||
error = security_file_truncate(f.file);
|
||||
if (!error)
|
||||
error = do_truncate(file_mnt_idmap(f.file), dentry, length,
|
||||
ATTR_MTIME | ATTR_CTIME, f.file);
|
||||
sb_end_write(inode->i_sb);
|
||||
out_putf:
|
||||
fdput(f);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user