diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fuse/file.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 504e61b7fd75..e3fee88831d4 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -2171,6 +2171,37 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
2171 | return ret; | 2171 | return ret; |
2172 | } | 2172 | } |
2173 | 2173 | ||
2174 | long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | ||
2175 | loff_t length) | ||
2176 | { | ||
2177 | struct fuse_file *ff = file->private_data; | ||
2178 | struct fuse_conn *fc = ff->fc; | ||
2179 | struct fuse_req *req; | ||
2180 | struct fuse_fallocate_in inarg = { | ||
2181 | .fh = ff->fh, | ||
2182 | .offset = offset, | ||
2183 | .length = length, | ||
2184 | .mode = mode | ||
2185 | }; | ||
2186 | int err; | ||
2187 | |||
2188 | req = fuse_get_req(fc); | ||
2189 | if (IS_ERR(req)) | ||
2190 | return PTR_ERR(req); | ||
2191 | |||
2192 | req->in.h.opcode = FUSE_FALLOCATE; | ||
2193 | req->in.h.nodeid = ff->nodeid; | ||
2194 | req->in.numargs = 1; | ||
2195 | req->in.args[0].size = sizeof(inarg); | ||
2196 | req->in.args[0].value = &inarg; | ||
2197 | fuse_request_send(fc, req); | ||
2198 | err = req->out.h.error; | ||
2199 | fuse_put_request(fc, req); | ||
2200 | |||
2201 | return err; | ||
2202 | } | ||
2203 | EXPORT_SYMBOL_GPL(fuse_file_fallocate); | ||
2204 | |||
2174 | static const struct file_operations fuse_file_operations = { | 2205 | static const struct file_operations fuse_file_operations = { |
2175 | .llseek = fuse_file_llseek, | 2206 | .llseek = fuse_file_llseek, |
2176 | .read = do_sync_read, | 2207 | .read = do_sync_read, |
@@ -2188,6 +2219,7 @@ static const struct file_operations fuse_file_operations = { | |||
2188 | .unlocked_ioctl = fuse_file_ioctl, | 2219 | .unlocked_ioctl = fuse_file_ioctl, |
2189 | .compat_ioctl = fuse_file_compat_ioctl, | 2220 | .compat_ioctl = fuse_file_compat_ioctl, |
2190 | .poll = fuse_file_poll, | 2221 | .poll = fuse_file_poll, |
2222 | .fallocate = fuse_file_fallocate, | ||
2191 | }; | 2223 | }; |
2192 | 2224 | ||
2193 | static const struct file_operations fuse_direct_io_file_operations = { | 2225 | static const struct file_operations fuse_direct_io_file_operations = { |
@@ -2204,6 +2236,7 @@ static const struct file_operations fuse_direct_io_file_operations = { | |||
2204 | .unlocked_ioctl = fuse_file_ioctl, | 2236 | .unlocked_ioctl = fuse_file_ioctl, |
2205 | .compat_ioctl = fuse_file_compat_ioctl, | 2237 | .compat_ioctl = fuse_file_compat_ioctl, |
2206 | .poll = fuse_file_poll, | 2238 | .poll = fuse_file_poll, |
2239 | .fallocate = fuse_file_fallocate, | ||
2207 | /* no splice_read */ | 2240 | /* no splice_read */ |
2208 | }; | 2241 | }; |
2209 | 2242 | ||