[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[qemu-xen staging-4.14] 9pfs: local: ignore O_NOATIME if we don't have permissions



commit e37ba5c637cf55d2f25713f6bcf51052bb2089d6
Author:     Omar Sandoval <osandov@xxxxxx>
AuthorDate: Thu May 14 08:06:43 2020 +0200
Commit:     Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx>
CommitDate: Mon Aug 24 18:56:33 2020 -0500

    9pfs: local: ignore O_NOATIME if we don't have permissions
    
    QEMU's local 9pfs server passes through O_NOATIME from the client. If
    the QEMU process doesn't have permissions to use O_NOATIME (namely, it
    does not own the file nor have the CAP_FOWNER capability), the open will
    fail. This causes issues when from the client's point of view, it
    believes it has permissions to use O_NOATIME (e.g., a process running as
    root in the virtual machine). Additionally, overlayfs on Linux opens
    files on the lower layer using O_NOATIME, so in this case a 9pfs mount
    can't be used as a lower layer for overlayfs (cf.
    
https://github.com/osandov/drgn/blob/dabfe1971951701da13863dbe6d8a1d172ad9650/vmtest/onoatimehack.c
    and https://github.com/NixOS/nixpkgs/issues/54509).
    
    Luckily, O_NOATIME is effectively a hint, and is often ignored by, e.g.,
    network filesystems. open(2) notes that O_NOATIME "may not be effective
    on all filesystems. One example is NFS, where the server maintains the
    access time." This means that we can honor it when possible but fall
    back to ignoring it.
    
    Acked-by: Christian Schoenebeck <qemu_oss@xxxxxxxxxxxxx>
    Signed-off-by: Omar Sandoval <osandov@xxxxxx>
    Message-Id: 
<e9bee604e8df528584693a4ec474ded6295ce8ad.1587149256.git.osandov@xxxxxx>
    Signed-off-by: Greg Kurz <groug@xxxxxxxx>
    (cherry picked from commit a5804fcf7b22fc7d1f9ec794dd284c7d504bd16b)
    Signed-off-by: Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx>
---
 hw/9pfs/9p-util.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
index 79ed6b233e..546f46dc7d 100644
--- a/hw/9pfs/9p-util.h
+++ b/hw/9pfs/9p-util.h
@@ -37,9 +37,22 @@ static inline int openat_file(int dirfd, const char *name, 
int flags,
 {
     int fd, serrno, ret;
 
+again:
     fd = openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK,
                 mode);
     if (fd == -1) {
+        if (errno == EPERM && (flags & O_NOATIME)) {
+            /*
+             * The client passed O_NOATIME but we lack permissions to honor it.
+             * Rather than failing the open, fall back without O_NOATIME. This
+             * doesn't break the semantics on the client side, as the Linux
+             * open(2) man page notes that O_NOATIME "may not be effective on
+             * all filesystems". In particular, NFS and other network
+             * filesystems ignore it entirely.
+             */
+            flags &= ~O_NOATIME;
+            goto again;
+        }
         return -1;
     }
 
--
generated by git-patchbot for /home/xen/git/qemu-xen.git#staging-4.14



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.