From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Peng Tao <tao.peng@linux.alibaba.com>
Cc: virtio-fs@redhat.com
Subject: Re: [Virtio-fs] [PATCH-v2] virtiofsd: make FUSE_REMOVEMAPPING support multiple entries
Date: Fri, 31 May 2019 17:18:35 +0100 [thread overview]
Message-ID: <20190531161834.GJ3169@work-vm> (raw)
In-Reply-To: <20190524065413.10978-1-tao.peng@linux.alibaba.com>
* Peng Tao (tao.peng@linux.alibaba.com) wrote:
> The fuse wire protocol is changed so that we can unmap multiple
> mappings in a single call.
>
> Signed-off-by: Peng Tao <tao.peng@linux.alibaba.com>
Hi Peng,
Thanks for this.
> ---
> contrib/virtiofsd/fuse_kernel.h | 9 +++++++--
> contrib/virtiofsd/fuse_lowlevel.c | 21 ++++++++++++++------
> contrib/virtiofsd/fuse_lowlevel.h | 5 +++--
> contrib/virtiofsd/passthrough_ll.c | 31 ++++++++++++++++++++----------
> 4 files changed, 46 insertions(+), 20 deletions(-)
>
> diff --git a/contrib/virtiofsd/fuse_kernel.h b/contrib/virtiofsd/fuse_kernel.h
> index ce46046a4f..12e1d06826 100644
> --- a/contrib/virtiofsd/fuse_kernel.h
> +++ b/contrib/virtiofsd/fuse_kernel.h
> @@ -830,9 +830,14 @@ struct fuse_setupmapping_out {
> uint64_t len[FUSE_SETUPMAPPING_ENTRIES];
> };
>
> -struct fuse_removemapping_in {
> +struct fuse_removemapping_in_header {
> /* An already open handle */
> - uint64_t fh;
> + uint64_t fh;
> + /* number of fuse_removemapping_in follows */
> + uint32_t count;
OK, good that fixes the count.
However, see my message from 22nd May replying to Miklos
wherewe talk about how there's a:
fuse_batch_forget_in and 'count' fuse_forget_one
we should name these using the same scheme, i.e.
fuse_removemapping_in and 'count' fuse_removemapping_one
If you can respin with that then I think we're good.
Dave
> +};
> +
> +struct fuse_removemapping_in {
> /* Offset into the dax to start the unmapping */
> uint64_t moffset;
> /* Length of mapping required */
> diff --git a/contrib/virtiofsd/fuse_lowlevel.c b/contrib/virtiofsd/fuse_lowlevel.c
> index 0fc2880acd..dd8954b7f1 100644
> --- a/contrib/virtiofsd/fuse_lowlevel.c
> +++ b/contrib/virtiofsd/fuse_lowlevel.c
> @@ -1907,21 +1907,30 @@ static void do_setupmapping(fuse_req_t req, fuse_ino_t nodeid,
> static void do_removemapping(fuse_req_t req, fuse_ino_t nodeid,
> struct fuse_mbuf_iter *iter)
> {
> - struct fuse_removemapping_in *arg;
> + struct fuse_removemapping_in_header *header;
> + struct fuse_removemapping_in *argp;
> struct fuse_file_info fi;
>
> - arg = fuse_mbuf_iter_advance(iter, sizeof(*arg));
> - if (!arg) {
> + header = fuse_mbuf_iter_advance(iter, sizeof(*header));
> + if (!header || header->count <= 0) {
> + fprintf(stderr, "do_removemapping: invalid header %p\n", header);
> + fuse_reply_err(req, EINVAL);
> + return;
> + }
> +
> + argp = fuse_mbuf_iter_advance(iter, header->count * sizeof(*argp));
> + if (!argp) {
> + fprintf(stderr, "do_removemapping: invalid in, expected %d * %ld, has %ld - %ld\n",
> + header->count, sizeof(*argp), iter->size, iter->pos);
> fuse_reply_err(req, EINVAL);
> return;
> }
>
> memset(&fi, 0, sizeof(fi));
> - fi.fh = arg->fh;
> + fi.fh = header->fh;
>
> if (req->se->op.removemapping)
> - req->se->op.removemapping(req, req->se, nodeid, arg->moffset,
> - arg->len, &fi);
> + req->se->op.removemapping(req, req->se, nodeid, header->count, argp, &fi);
> else
> fuse_reply_err(req, ENOSYS);
> }
> diff --git a/contrib/virtiofsd/fuse_lowlevel.h b/contrib/virtiofsd/fuse_lowlevel.h
> index 1b03e46dfd..cf215c66b5 100644
> --- a/contrib/virtiofsd/fuse_lowlevel.h
> +++ b/contrib/virtiofsd/fuse_lowlevel.h
> @@ -23,6 +23,7 @@
> #endif
>
> #include "fuse_common.h"
> +#include "fuse_kernel.h"
>
> #include <utime.h>
> #include <fcntl.h>
> @@ -1197,8 +1198,8 @@ struct fuse_lowlevel_ops {
> * TODO
> */
> void (*removemapping) (fuse_req_t req, struct fuse_session *se,
> - fuse_ino_t ino, uint64_t moffset,
> - uint64_t len, struct fuse_file_info *fi);
> + fuse_ino_t ino, unsigned num,
> + struct fuse_removemapping_in *args, struct fuse_file_info *fi);
> };
>
> /**
> diff --git a/contrib/virtiofsd/passthrough_ll.c b/contrib/virtiofsd/passthrough_ll.c
> index 662bee5b94..9fc55f5454 100644
> --- a/contrib/virtiofsd/passthrough_ll.c
> +++ b/contrib/virtiofsd/passthrough_ll.c
> @@ -1908,20 +1908,31 @@ static void lo_setupmapping(fuse_req_t req, fuse_ino_t ino, uint64_t foffset,
> }
>
> static void lo_removemapping(fuse_req_t req, struct fuse_session *se,
> - fuse_ino_t ino, uint64_t moffset,
> - uint64_t len, struct fuse_file_info *fi)
> + fuse_ino_t ino, unsigned num,
> + struct fuse_removemapping_in *argsp,
> + struct fuse_file_info *fi)
> {
> VhostUserFSSlaveMsg msg = { 0 };
> int ret = 0;
>
> - msg.len[0] = len;
> - msg.c_offset[0] = moffset;
> - if (fuse_virtio_unmap(se, &msg)) {
> - fprintf(stderr,
> - "%s: unmap over virtio failed "
> - "(offset=0x%lx, len=0x%lx)\n", __func__, moffset, len);
> - ret = EINVAL;
> - }
> + for (int i = 0; num > 0; i++, argsp++) {
> + msg.len[i] = argsp->len;
> + msg.c_offset[i] = argsp->moffset;
> +
> + if (--num == 0 || i == VHOST_USER_FS_SLAVE_ENTRIES - 1) {
> + if (fuse_virtio_unmap(se, &msg)) {
> + fprintf(stderr,
> + "%s: unmap over virtio failed "
> + "(offset=0x%lx, len=0x%lx)\n", __func__, argsp->moffset, argsp->len);
> + ret = EINVAL;
> + break;
> + }
> + if (num > 0) {
> + i = 0;
> + memset(&msg, 0, sizeof(msg));
> + }
> + }
> + }
>
> fuse_reply_err(req, ret);
> }
> --
> 2.17.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2019-05-31 16:18 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-24 6:54 [Virtio-fs] [PATCH-v2] virtiofsd: make FUSE_REMOVEMAPPING support multiple entries Peng Tao
2019-05-31 16:18 ` Dr. David Alan Gilbert [this message]
2019-06-03 2:12 ` Tao Peng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190531161834.GJ3169@work-vm \
--to=dgilbert@redhat.com \
--cc=tao.peng@linux.alibaba.com \
--cc=virtio-fs@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.