9pfs: local: ignore O_NOATIME if we don't have permissions
authorOmar Sandoval <osandov@fb.com>
Thu, 14 May 2020 06:06:43 +0000 (08:06 +0200)
committerGreg Kurz <groug@kaod.org>
Thu, 14 May 2020 06:06:43 +0000 (08:06 +0200)
commita5804fcf7b22fc7d1f9ec794dd284c7d504bd16b
tree43f2432d30aa3ed5ef88c1b5663765a6aa0c8269
parent65abaa01ee5781f525e1b9a0d6e6e5a3d8696d5f
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@crudebyte.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Message-Id: <e9bee604e8df528584693a4ec474ded6295ce8ad.1587149256.git.osandov@fb.com>
Signed-off-by: Greg Kurz <groug@kaod.org>
hw/9pfs/9p-util.h