All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vivek Goyal <vgoyal@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: virtio-fs@redhat.com, qemu-devel@nongnu.org,
	Stefan Hajnoczi <stefanha@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [PATCH v3 03/10] virtiofsd: Use lo_inode_open() instead of openat()
Date: Fri, 6 Aug 2021 11:42:32 -0400	[thread overview]
Message-ID: <YQ1YaG8cHxfXsw+9@redhat.com> (raw)
In-Reply-To: <20210730150134.216126-4-mreitz@redhat.com>

On Fri, Jul 30, 2021 at 05:01:27PM +0200, Max Reitz wrote:
> The xattr functions want a non-O_PATH FD, so they reopen the lo_inode.fd
> with the flags they need through /proc/self/fd.
> 
> Similarly, lo_opendir() needs an O_RDONLY FD.  Instead of the
> /proc/self/fd trick, it just uses openat(fd, "."), because the FD is
> guaranteed to be a directory, so this works.

Ok, given now lo_opendir() will use lo_inode_open(), it will switch
to using proc O_PATH fd trick. I guess that should be fine.

Vivek

> 
> All cases have one problem in common, though: In the future, when we may
> have a file handle in the lo_inode instead of an FD, querying an
> lo_inode FD may incur an open_by_handle_at() call.  It does not make
> sense to then reopen that FD with custom flags, those should have been
> passed to open_by_handle_at() instead.
> 
> Use lo_inode_open() instead of openat().  As part of the file handle
> change, lo_inode_open() will be made to invoke openat() only if
> lo_inode.fd is valid.  Otherwise, it will invoke open_by_handle_at()
> with the right flags from the start.
> 
> Consequently, after this patch, lo_inode_open() is the only place to
> invoke openat() to reopen an existing FD with different flags.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  tools/virtiofsd/passthrough_ll.c | 43 ++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 16 deletions(-)
> 
> diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
> index fb5e073e6a..a444c3a7e2 100644
> --- a/tools/virtiofsd/passthrough_ll.c
> +++ b/tools/virtiofsd/passthrough_ll.c
> @@ -1729,18 +1729,26 @@ static void lo_opendir(fuse_req_t req, fuse_ino_t ino,
>  {
>      int error = ENOMEM;
>      struct lo_data *lo = lo_data(req);
> -    struct lo_dirp *d;
> +    struct lo_inode *inode;
> +    struct lo_dirp *d = NULL;
>      int fd;
>      ssize_t fh;
>  
> +    inode = lo_inode(req, ino);
> +    if (!inode) {
> +        error = EBADF;
> +        goto out_err;
> +    }
> +
>      d = calloc(1, sizeof(struct lo_dirp));
>      if (d == NULL) {
>          goto out_err;
>      }
>  
> -    fd = openat(lo_fd(req, ino), ".", O_RDONLY);
> -    if (fd == -1) {
> -        goto out_errno;
> +    fd = lo_inode_open(lo, inode, O_RDONLY);
> +    if (fd < 0) {
> +        error = -fd;
> +        goto out_err;
>      }
>  
>      d->dp = fdopendir(fd);
> @@ -1769,6 +1777,7 @@ static void lo_opendir(fuse_req_t req, fuse_ino_t ino,
>  out_errno:
>      error = errno;
>  out_err:
> +    lo_inode_put(lo, &inode);
>      if (d) {
>          if (d->dp) {
>              closedir(d->dp);
> @@ -2973,7 +2982,6 @@ static void lo_getxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
>          }
>      }
>  
> -    sprintf(procname, "%i", inode->fd);
>      /*
>       * It is not safe to open() non-regular/non-dir files in file server
>       * unless O_PATH is used, so use that method for regular files/dir
> @@ -2981,13 +2989,15 @@ static void lo_getxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
>       * Otherwise, call fchdir() to avoid open().
>       */
>      if (S_ISREG(inode->filetype) || S_ISDIR(inode->filetype)) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            goto out_err;
> +            saverr = -fd;
> +            goto out;
>          }
>          ret = fgetxattr(fd, name, value, size);
>          saverr = ret == -1 ? errno : 0;
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>          ret = getxattr(procname, name, value, size);
> @@ -3054,15 +3064,16 @@ static void lo_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size)
>          }
>      }
>  
> -    sprintf(procname, "%i", inode->fd);
>      if (S_ISREG(inode->filetype) || S_ISDIR(inode->filetype)) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            goto out_err;
> +            saverr = -fd;
> +            goto out;
>          }
>          ret = flistxattr(fd, value, size);
>          saverr = ret == -1 ? errno : 0;
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>          ret = listxattr(procname, value, size);
> @@ -3211,14 +3222,14 @@ static void lo_setxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
>       * setxattr() on the link's filename there.
>       */
>      open_inode = S_ISREG(inode->filetype) || S_ISDIR(inode->filetype);
> -    sprintf(procname, "%i", inode->fd);
>      if (open_inode) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            saverr = errno;
> +            saverr = -fd;
>              goto out;
>          }
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>      }
> @@ -3317,16 +3328,16 @@ static void lo_removexattr(fuse_req_t req, fuse_ino_t ino, const char *in_name)
>      fuse_log(FUSE_LOG_DEBUG, "lo_removexattr(ino=%" PRIu64 ", name=%s)\n", ino,
>               name);
>  
> -    sprintf(procname, "%i", inode->fd);
>      if (S_ISREG(inode->filetype) || S_ISDIR(inode->filetype)) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            saverr = errno;
> +            saverr = -fd;
>              goto out;
>          }
>          ret = fremovexattr(fd, name);
>          saverr = ret == -1 ? errno : 0;
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>          ret = removexattr(procname, name);
> -- 
> 2.31.1
> 



WARNING: multiple messages have this Message-ID (diff)
From: Vivek Goyal <vgoyal@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: virtio-fs@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Virtio-fs] [PATCH v3 03/10] virtiofsd: Use lo_inode_open() instead of openat()
Date: Fri, 6 Aug 2021 11:42:32 -0400	[thread overview]
Message-ID: <YQ1YaG8cHxfXsw+9@redhat.com> (raw)
In-Reply-To: <20210730150134.216126-4-mreitz@redhat.com>

On Fri, Jul 30, 2021 at 05:01:27PM +0200, Max Reitz wrote:
> The xattr functions want a non-O_PATH FD, so they reopen the lo_inode.fd
> with the flags they need through /proc/self/fd.
> 
> Similarly, lo_opendir() needs an O_RDONLY FD.  Instead of the
> /proc/self/fd trick, it just uses openat(fd, "."), because the FD is
> guaranteed to be a directory, so this works.

Ok, given now lo_opendir() will use lo_inode_open(), it will switch
to using proc O_PATH fd trick. I guess that should be fine.

Vivek

> 
> All cases have one problem in common, though: In the future, when we may
> have a file handle in the lo_inode instead of an FD, querying an
> lo_inode FD may incur an open_by_handle_at() call.  It does not make
> sense to then reopen that FD with custom flags, those should have been
> passed to open_by_handle_at() instead.
> 
> Use lo_inode_open() instead of openat().  As part of the file handle
> change, lo_inode_open() will be made to invoke openat() only if
> lo_inode.fd is valid.  Otherwise, it will invoke open_by_handle_at()
> with the right flags from the start.
> 
> Consequently, after this patch, lo_inode_open() is the only place to
> invoke openat() to reopen an existing FD with different flags.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  tools/virtiofsd/passthrough_ll.c | 43 ++++++++++++++++++++------------
>  1 file changed, 27 insertions(+), 16 deletions(-)
> 
> diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
> index fb5e073e6a..a444c3a7e2 100644
> --- a/tools/virtiofsd/passthrough_ll.c
> +++ b/tools/virtiofsd/passthrough_ll.c
> @@ -1729,18 +1729,26 @@ static void lo_opendir(fuse_req_t req, fuse_ino_t ino,
>  {
>      int error = ENOMEM;
>      struct lo_data *lo = lo_data(req);
> -    struct lo_dirp *d;
> +    struct lo_inode *inode;
> +    struct lo_dirp *d = NULL;
>      int fd;
>      ssize_t fh;
>  
> +    inode = lo_inode(req, ino);
> +    if (!inode) {
> +        error = EBADF;
> +        goto out_err;
> +    }
> +
>      d = calloc(1, sizeof(struct lo_dirp));
>      if (d == NULL) {
>          goto out_err;
>      }
>  
> -    fd = openat(lo_fd(req, ino), ".", O_RDONLY);
> -    if (fd == -1) {
> -        goto out_errno;
> +    fd = lo_inode_open(lo, inode, O_RDONLY);
> +    if (fd < 0) {
> +        error = -fd;
> +        goto out_err;
>      }
>  
>      d->dp = fdopendir(fd);
> @@ -1769,6 +1777,7 @@ static void lo_opendir(fuse_req_t req, fuse_ino_t ino,
>  out_errno:
>      error = errno;
>  out_err:
> +    lo_inode_put(lo, &inode);
>      if (d) {
>          if (d->dp) {
>              closedir(d->dp);
> @@ -2973,7 +2982,6 @@ static void lo_getxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
>          }
>      }
>  
> -    sprintf(procname, "%i", inode->fd);
>      /*
>       * It is not safe to open() non-regular/non-dir files in file server
>       * unless O_PATH is used, so use that method for regular files/dir
> @@ -2981,13 +2989,15 @@ static void lo_getxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
>       * Otherwise, call fchdir() to avoid open().
>       */
>      if (S_ISREG(inode->filetype) || S_ISDIR(inode->filetype)) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            goto out_err;
> +            saverr = -fd;
> +            goto out;
>          }
>          ret = fgetxattr(fd, name, value, size);
>          saverr = ret == -1 ? errno : 0;
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>          ret = getxattr(procname, name, value, size);
> @@ -3054,15 +3064,16 @@ static void lo_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size)
>          }
>      }
>  
> -    sprintf(procname, "%i", inode->fd);
>      if (S_ISREG(inode->filetype) || S_ISDIR(inode->filetype)) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            goto out_err;
> +            saverr = -fd;
> +            goto out;
>          }
>          ret = flistxattr(fd, value, size);
>          saverr = ret == -1 ? errno : 0;
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>          ret = listxattr(procname, value, size);
> @@ -3211,14 +3222,14 @@ static void lo_setxattr(fuse_req_t req, fuse_ino_t ino, const char *in_name,
>       * setxattr() on the link's filename there.
>       */
>      open_inode = S_ISREG(inode->filetype) || S_ISDIR(inode->filetype);
> -    sprintf(procname, "%i", inode->fd);
>      if (open_inode) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            saverr = errno;
> +            saverr = -fd;
>              goto out;
>          }
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>      }
> @@ -3317,16 +3328,16 @@ static void lo_removexattr(fuse_req_t req, fuse_ino_t ino, const char *in_name)
>      fuse_log(FUSE_LOG_DEBUG, "lo_removexattr(ino=%" PRIu64 ", name=%s)\n", ino,
>               name);
>  
> -    sprintf(procname, "%i", inode->fd);
>      if (S_ISREG(inode->filetype) || S_ISDIR(inode->filetype)) {
> -        fd = openat(lo->proc_self_fd, procname, O_RDONLY);
> +        fd = lo_inode_open(lo, inode, O_RDONLY);
>          if (fd < 0) {
> -            saverr = errno;
> +            saverr = -fd;
>              goto out;
>          }
>          ret = fremovexattr(fd, name);
>          saverr = ret == -1 ? errno : 0;
>      } else {
> +        sprintf(procname, "%i", inode->fd);
>          /* fchdir should not fail here */
>          FCHDIR_NOFAIL(lo->proc_self_fd);
>          ret = removexattr(procname, name);
> -- 
> 2.31.1
> 


  reply	other threads:[~2021-08-06 15:43 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-30 15:01 [PATCH v3 00/10] virtiofsd: Allow using file handles instead of O_PATH FDs Max Reitz
2021-07-30 15:01 ` [Virtio-fs] " Max Reitz
2021-07-30 15:01 ` [PATCH v3 01/10] virtiofsd: Limit setxattr()'s creds-dropped region Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-06 14:16   ` Vivek Goyal
2021-08-06 14:16     ` [Virtio-fs] " Vivek Goyal
2021-08-09 10:30     ` Max Reitz
2021-08-09 10:30       ` [Virtio-fs] " Max Reitz
2021-07-30 15:01 ` [PATCH v3 02/10] virtiofsd: Add TempFd structure Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-06 14:41   ` Vivek Goyal
2021-08-06 14:41     ` [Virtio-fs] " Vivek Goyal
2021-08-09 10:44     ` Max Reitz
2021-08-09 10:44       ` [Virtio-fs] " Max Reitz
2021-07-30 15:01 ` [PATCH v3 03/10] virtiofsd: Use lo_inode_open() instead of openat() Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-06 15:42   ` Vivek Goyal [this message]
2021-08-06 15:42     ` Vivek Goyal
2021-07-30 15:01 ` [PATCH v3 04/10] virtiofsd: Add lo_inode_fd() helper Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-06 18:25   ` Vivek Goyal
2021-08-06 18:25     ` [Virtio-fs] " Vivek Goyal
2021-08-09 10:48     ` Max Reitz
2021-08-09 10:48       ` [Virtio-fs] " Max Reitz
2021-07-30 15:01 ` [PATCH v3 05/10] virtiofsd: Let lo_fd() return a TempFd Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-07-30 15:01 ` [PATCH v3 06/10] virtiofsd: Let lo_inode_open() " Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-06 19:55   ` Vivek Goyal
2021-08-06 19:55     ` [Virtio-fs] " Vivek Goyal
2021-08-09 13:40     ` Max Reitz
2021-08-09 13:40       ` [Virtio-fs] " Max Reitz
2021-07-30 15:01 ` [PATCH v3 07/10] virtiofsd: Add lo_inode.fhandle Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-09 15:21   ` Vivek Goyal
2021-08-09 15:21     ` [Virtio-fs] " Vivek Goyal
2021-08-09 16:41     ` Hanna Reitz
2021-08-09 16:41       ` [Virtio-fs] " Hanna Reitz
2021-07-30 15:01 ` [PATCH v3 08/10] virtiofsd: Add inodes_by_handle hash table Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-09 16:10   ` Vivek Goyal
2021-08-09 16:10     ` [Virtio-fs] " Vivek Goyal
2021-08-09 16:47     ` Hanna Reitz
2021-08-09 16:47       ` [Virtio-fs] " Hanna Reitz
2021-08-10 14:07       ` Vivek Goyal
2021-08-10 14:07         ` [Virtio-fs] " Vivek Goyal
2021-08-10 14:13         ` Hanna Reitz
2021-08-10 14:13           ` [Virtio-fs] " Hanna Reitz
2021-08-10 17:51           ` Vivek Goyal
2021-08-10 17:51             ` [Virtio-fs] " Vivek Goyal
2021-07-30 15:01 ` [PATCH v3 09/10] virtiofsd: Optionally fill lo_inode.fhandle Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-09 18:41   ` Vivek Goyal
2021-08-09 18:41     ` [Virtio-fs] " Vivek Goyal
2021-08-10  8:32     ` Hanna Reitz
2021-08-10  8:32       ` [Virtio-fs] " Hanna Reitz
2021-08-10 15:23       ` Vivek Goyal
2021-08-10 15:23         ` [Virtio-fs] " Vivek Goyal
2021-08-10 15:26         ` Hanna Reitz
2021-08-10 15:26           ` [Virtio-fs] " Hanna Reitz
2021-08-10 15:57           ` Vivek Goyal
2021-08-10 15:57             ` [Virtio-fs] " Vivek Goyal
2021-08-11  6:41             ` Hanna Reitz
2021-08-11  6:41               ` [Virtio-fs] " Hanna Reitz
2021-08-16 19:44               ` Vivek Goyal
2021-08-16 19:44                 ` [Virtio-fs] " Vivek Goyal
2021-08-17  8:27                 ` Hanna Reitz
2021-08-17  8:27                   ` [Virtio-fs] " Hanna Reitz
2021-08-17 19:45                   ` Vivek Goyal
2021-08-17 19:45                     ` [Virtio-fs] " Vivek Goyal
2021-08-18  0:14                     ` Vivek Goyal
2021-08-18  0:14                       ` [Virtio-fs] " Vivek Goyal
2021-08-18 13:32                       ` Vivek Goyal
2021-08-18 13:32                         ` [Virtio-fs] " Vivek Goyal
2021-08-18 13:48                         ` Hanna Reitz
2021-08-18 13:48                           ` [Virtio-fs] " Hanna Reitz
2021-08-19 16:38   ` Dr. David Alan Gilbert
2021-08-19 16:38     ` [Virtio-fs] " Dr. David Alan Gilbert
2021-07-30 15:01 ` [PATCH v3 10/10] virtiofsd: Add lazy lo_do_find() Max Reitz
2021-07-30 15:01   ` [Virtio-fs] " Max Reitz
2021-08-09 19:08   ` Vivek Goyal
2021-08-09 19:08     ` [Virtio-fs] " Vivek Goyal
2021-08-10  8:38     ` Hanna Reitz
2021-08-10  8:38       ` [Virtio-fs] " Hanna Reitz
2021-08-10 14:12       ` Vivek Goyal
2021-08-10 14:12         ` [Virtio-fs] " Vivek Goyal
2021-08-10 14:17         ` Hanna Reitz
2021-08-10 14:17           ` [Virtio-fs] " Hanna Reitz

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=YQ1YaG8cHxfXsw+9@redhat.com \
    --to=vgoyal@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.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.