|
9 | 9 | #include <linux/compat.h>
|
10 | 10 | #include <linux/fileattr.h>
|
11 | 11 |
|
12 |
| -static ssize_t fuse_send_ioctl(struct fuse_mount *fm, struct fuse_args *args) |
| 12 | +static ssize_t fuse_send_ioctl(struct fuse_mount *fm, struct fuse_args *args, |
| 13 | + struct fuse_ioctl_out *outarg) |
13 | 14 | {
|
14 |
| - ssize_t ret = fuse_simple_request(fm, args); |
| 15 | + ssize_t ret; |
| 16 | + |
| 17 | + args->out_args[0].size = sizeof(*outarg); |
| 18 | + args->out_args[0].value = outarg; |
| 19 | + |
| 20 | + ret = fuse_simple_request(fm, args); |
15 | 21 |
|
16 | 22 | /* Translate ENOSYS, which shouldn't be returned from fs */
|
17 | 23 | if (ret == -ENOSYS)
|
18 | 24 | ret = -ENOTTY;
|
19 | 25 |
|
| 26 | + if (ret >= 0 && outarg->result == -ENOSYS) |
| 27 | + outarg->result = -ENOTTY; |
| 28 | + |
20 | 29 | return ret;
|
21 | 30 | }
|
22 | 31 |
|
@@ -264,13 +273,11 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
|
264 | 273 | }
|
265 | 274 |
|
266 | 275 | ap.args.out_numargs = 2;
|
267 |
| - ap.args.out_args[0].size = sizeof(outarg); |
268 |
| - ap.args.out_args[0].value = &outarg; |
269 | 276 | ap.args.out_args[1].size = out_size;
|
270 | 277 | ap.args.out_pages = true;
|
271 | 278 | ap.args.out_argvar = true;
|
272 | 279 |
|
273 |
| - transferred = fuse_send_ioctl(fm, &ap.args); |
| 280 | + transferred = fuse_send_ioctl(fm, &ap.args, &outarg); |
274 | 281 | err = transferred;
|
275 | 282 | if (transferred < 0)
|
276 | 283 | goto out;
|
@@ -399,12 +406,10 @@ static int fuse_priv_ioctl(struct inode *inode, struct fuse_file *ff,
|
399 | 406 | args.in_args[1].size = inarg.in_size;
|
400 | 407 | args.in_args[1].value = ptr;
|
401 | 408 | args.out_numargs = 2;
|
402 |
| - args.out_args[0].size = sizeof(outarg); |
403 |
| - args.out_args[0].value = &outarg; |
404 | 409 | args.out_args[1].size = inarg.out_size;
|
405 | 410 | args.out_args[1].value = ptr;
|
406 | 411 |
|
407 |
| - err = fuse_send_ioctl(fm, &args); |
| 412 | + err = fuse_send_ioctl(fm, &args, &outarg); |
408 | 413 | if (!err) {
|
409 | 414 | if (outarg.result < 0)
|
410 | 415 | err = outarg.result;
|
|
0 commit comments