diff options
Diffstat (limited to 'fs/fuse/dev.c')
-rw-r--r-- | fs/fuse/dev.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index ca887314aba9..ba1107977f2e 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
@@ -511,6 +511,35 @@ void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) | |||
511 | } | 511 | } |
512 | EXPORT_SYMBOL_GPL(fuse_request_send); | 512 | EXPORT_SYMBOL_GPL(fuse_request_send); |
513 | 513 | ||
514 | ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) | ||
515 | { | ||
516 | struct fuse_req *req; | ||
517 | ssize_t ret; | ||
518 | |||
519 | req = fuse_get_req(fc, 0); | ||
520 | if (IS_ERR(req)) | ||
521 | return PTR_ERR(req); | ||
522 | |||
523 | req->in.h.opcode = args->in.h.opcode; | ||
524 | req->in.h.nodeid = args->in.h.nodeid; | ||
525 | req->in.numargs = args->in.numargs; | ||
526 | memcpy(req->in.args, args->in.args, | ||
527 | args->in.numargs * sizeof(struct fuse_in_arg)); | ||
528 | req->out.argvar = args->out.argvar; | ||
529 | req->out.numargs = args->out.numargs; | ||
530 | memcpy(req->out.args, args->out.args, | ||
531 | args->out.numargs * sizeof(struct fuse_arg)); | ||
532 | fuse_request_send(fc, req); | ||
533 | ret = req->out.h.error; | ||
534 | if (!ret && args->out.argvar) { | ||
535 | BUG_ON(args->out.numargs != 1); | ||
536 | ret = req->out.args[0].size; | ||
537 | } | ||
538 | fuse_put_request(fc, req); | ||
539 | |||
540 | return ret; | ||
541 | } | ||
542 | |||
514 | static void fuse_request_send_nowait_locked(struct fuse_conn *fc, | 543 | static void fuse_request_send_nowait_locked(struct fuse_conn *fc, |
515 | struct fuse_req *req) | 544 | struct fuse_req *req) |
516 | { | 545 | { |