diff options
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/9pfs-local-ignore-O_NOATIME-if-we-don-t-have-permiss.patch')
-rw-r--r-- | meta/recipes-devtools/qemu/qemu/9pfs-local-ignore-O_NOATIME-if-we-don-t-have-permiss.patch | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/9pfs-local-ignore-O_NOATIME-if-we-don-t-have-permiss.patch b/meta/recipes-devtools/qemu/qemu/9pfs-local-ignore-O_NOATIME-if-we-don-t-have-permiss.patch new file mode 100644 index 0000000000..72d9c47bde --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/9pfs-local-ignore-O_NOATIME-if-we-don-t-have-permiss.patch | |||
@@ -0,0 +1,63 @@ | |||
1 | From a5804fcf7b22fc7d1f9ec794dd284c7d504bd16b Mon Sep 17 00:00:00 2001 | ||
2 | From: Omar Sandoval <osandov@fb.com> | ||
3 | Date: Thu, 14 May 2020 08:06:43 +0200 | ||
4 | Subject: [PATCH] 9pfs: local: ignore O_NOATIME if we don't have permissions | ||
5 | |||
6 | QEMU's local 9pfs server passes through O_NOATIME from the client. If | ||
7 | the QEMU process doesn't have permissions to use O_NOATIME (namely, it | ||
8 | does not own the file nor have the CAP_FOWNER capability), the open will | ||
9 | fail. This causes issues when from the client's point of view, it | ||
10 | believes it has permissions to use O_NOATIME (e.g., a process running as | ||
11 | root in the virtual machine). Additionally, overlayfs on Linux opens | ||
12 | files on the lower layer using O_NOATIME, so in this case a 9pfs mount | ||
13 | can't be used as a lower layer for overlayfs (cf. | ||
14 | https://github.com/osandov/drgn/blob/dabfe1971951701da13863dbe6d8a1d172ad9650/vmtest/onoatimehack.c | ||
15 | and https://github.com/NixOS/nixpkgs/issues/54509). | ||
16 | |||
17 | Luckily, O_NOATIME is effectively a hint, and is often ignored by, e.g., | ||
18 | network filesystems. open(2) notes that O_NOATIME "may not be effective | ||
19 | on all filesystems. One example is NFS, where the server maintains the | ||
20 | access time." This means that we can honor it when possible but fall | ||
21 | back to ignoring it. | ||
22 | |||
23 | Acked-by: Christian Schoenebeck <qemu_oss@crudebyte.com> | ||
24 | Signed-off-by: Omar Sandoval <osandov@fb.com> | ||
25 | Message-Id: <e9bee604e8df528584693a4ec474ded6295ce8ad.1587149256.git.osandov@fb.com> | ||
26 | Signed-off-by: Greg Kurz <groug@kaod.org> | ||
27 | |||
28 | Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/a5804fcf7b22fc7d1f9ec794dd284c7d504bd16b] | ||
29 | Signed-off-by: Vijay Anusuri <vanusuri@mvista.com> | ||
30 | --- | ||
31 | hw/9pfs/9p-util.h | 13 +++++++++++++ | ||
32 | 1 file changed, 13 insertions(+) | ||
33 | |||
34 | diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h | ||
35 | index 79ed6b233e5..546f46dc7dc 100644 | ||
36 | --- a/hw/9pfs/9p-util.h | ||
37 | +++ b/hw/9pfs/9p-util.h | ||
38 | @@ -37,9 +37,22 @@ static inline int openat_file(int dirfd, const char *name, int flags, | ||
39 | { | ||
40 | int fd, serrno, ret; | ||
41 | |||
42 | +again: | ||
43 | fd = openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK, | ||
44 | mode); | ||
45 | if (fd == -1) { | ||
46 | + if (errno == EPERM && (flags & O_NOATIME)) { | ||
47 | + /* | ||
48 | + * The client passed O_NOATIME but we lack permissions to honor it. | ||
49 | + * Rather than failing the open, fall back without O_NOATIME. This | ||
50 | + * doesn't break the semantics on the client side, as the Linux | ||
51 | + * open(2) man page notes that O_NOATIME "may not be effective on | ||
52 | + * all filesystems". In particular, NFS and other network | ||
53 | + * filesystems ignore it entirely. | ||
54 | + */ | ||
55 | + flags &= ~O_NOATIME; | ||
56 | + goto again; | ||
57 | + } | ||
58 | return -1; | ||
59 | } | ||
60 | |||
61 | -- | ||
62 | GitLab | ||
63 | |||