49 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/kernel.h>3#include <linux/errno.h>4#include <linux/fs.h>5#include <linux/file.h>6#include <linux/mm.h>7#include <linux/slab.h>8#include <linux/syscalls.h>9#include <linux/io_uring.h>10 11#include <uapi/linux/io_uring.h>12 13#include "../fs/internal.h"14 15#include "io_uring.h"16#include "truncate.h"17 18struct io_ftrunc {19 struct file *file;20 loff_t len;21};22 23int io_ftruncate_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)24{25 struct io_ftrunc *ft = io_kiocb_to_cmd(req, struct io_ftrunc);26 27 if (sqe->rw_flags || sqe->addr || sqe->len || sqe->buf_index ||28 sqe->splice_fd_in || sqe->addr3)29 return -EINVAL;30 31 ft->len = READ_ONCE(sqe->off);32 33 req->flags |= REQ_F_FORCE_ASYNC;34 return 0;35}36 37int io_ftruncate(struct io_kiocb *req, unsigned int issue_flags)38{39 struct io_ftrunc *ft = io_kiocb_to_cmd(req, struct io_ftrunc);40 int ret;41 42 WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);43 44 ret = do_ftruncate(req->file, ft->len, 1);45 46 io_req_set_res(req, ret, 0);47 return IOU_OK;48}49