All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/7] 9p queue 2022-04-30
@ 2022-04-30 11:44 Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 5/7] 9pfs: fix wrong errno being sent to Linux client on macOS host Christian Schoenebeck
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

The following changes since commit 731340813fdb4cb8339edb8630e3f923b7d987ec:

  Merge tag 'pull-riscv-to-apply-20220429' of github.com:alistair23/qemu into staging (2022-04-29 08:46:55 -0700)

are available in the Git repository at:

  https://github.com/cschoenebeck/qemu.git tags/pull-9p-20220430

for you to fetch changes up to e8fb9ed725fe2ed00a275674a84beb5ba6e538a7:

  9pfs: fix qemu_mknodat() to always return -1 on error on macOS host (2022-04-30 13:11:48 +0200)

----------------------------------------------------------------
9pfs: various fixes

* macOS: Fix recently (in QEMU 7.0) added 9p support for macOS hosts.

* Tests: Fix inode sequencing in 'synth' driver.

----------------------------------------------------------------
Christian Schoenebeck (7):
      9pfs: fix inode sequencing in 'synth' driver
      9pfs: fix qemu_mknodat(S_IFREG) on macOS
      9pfs: fix qemu_mknodat(S_IFSOCK) on macOS
      9pfs: fix wrong encoding of rdev field in Rgetattr on macOS
      9pfs: fix wrong errno being sent to Linux client on macOS host
      9pfs: fix removing non-existent POSIX ACL xattr on macOS host
      9pfs: fix qemu_mknodat() to always return -1 on error on macOS host

 hw/9pfs/9p-posix-acl.c   | 12 +++++++--
 hw/9pfs/9p-synth.c       |  4 +--
 hw/9pfs/9p-util-darwin.c | 54 +++++++++++++++++++++++++++++++++++--
 hw/9pfs/9p-util.h        | 69 ++++++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/9p.c             |  4 ++-
 5 files changed, 136 insertions(+), 7 deletions(-)


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PULL 4/7] 9pfs: fix wrong encoding of rdev field in Rgetattr on macOS
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
                   ` (3 preceding siblings ...)
  2022-04-30 11:44 ` [PULL 7/7] 9pfs: fix qemu_mknodat() to always return -1 on error on macOS host Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 2/7] 9pfs: fix qemu_mknodat(S_IFREG) " Christian Schoenebeck
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

The 'rdev' field in 9p reponse 'Rgetattr' is of type dev_t,
which is actually a system dependant type and therefore both the
size and encoding of dev_t differ between macOS and Linux.

So far we have sent 'rdev' to guest in host's dev_t format as-is,
which caused devices to appear with wrong device numbers on
guests running on macOS hosts, eventually leading to various
misbehaviours on guest in conjunction with device files.

This patch fixes this issue by converting the device number from
host's dev_t format to Linux dev_t format. As 9p request
'Tgettattr' is exclusive to protocol version 9p2000.L, it should
be fair to assume that 'rdev' field is assumed to be in Linux dev_t
format by client as well.

Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Link: https://lore.kernel.org/qemu-devel/20220421093056.5ab1e7ed@bahia/
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <b3a430c2c382ba69a7405e04c0b090ab0d86f17e.1651228001.git.qemu_oss@crudebyte.com>
---
 hw/9pfs/9p-util.h | 39 +++++++++++++++++++++++++++++++++++++++
 hw/9pfs/9p.c      |  2 +-
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
index 97e681e167..2cc9a5dbfb 100644
--- a/hw/9pfs/9p-util.h
+++ b/hw/9pfs/9p-util.h
@@ -19,6 +19,45 @@
 #define O_PATH_9P_UTIL 0
 #endif
 
+#if !defined(CONFIG_LINUX)
+
+/*
+ * Generates a Linux device number (a.k.a. dev_t) for given device major
+ * and minor numbers.
+ *
+ * To be more precise: it generates a device number in glibc's format
+ * (MMMM_Mmmm_mmmM_MMmm, 64 bits) actually, which is compatible with
+ * Linux's format (mmmM_MMmm, 32 bits), as described in <bits/sysmacros.h>.
+ */
+static inline uint64_t makedev_dotl(uint32_t dev_major, uint32_t dev_minor)
+{
+    uint64_t dev;
+
+    // from glibc sysmacros.h:
+    dev  = (((uint64_t) (dev_major & 0x00000fffu)) <<  8);
+    dev |= (((uint64_t) (dev_major & 0xfffff000u)) << 32);
+    dev |= (((uint64_t) (dev_minor & 0x000000ffu)) <<  0);
+    dev |= (((uint64_t) (dev_minor & 0xffffff00u)) << 12);
+    return dev;
+}
+
+#endif
+
+/*
+ * Converts given device number from host's device number format to Linux
+ * device number format. As both the size of type dev_t and encoding of
+ * dev_t is system dependant, we have to convert them for Linux guests if
+ * host is not running Linux.
+ */
+static inline uint64_t host_dev_to_dotl_dev(dev_t dev)
+{
+#ifdef CONFIG_LINUX
+    return dev;
+#else
+    return makedev_dotl(major(dev), minor(dev));
+#endif
+}
+
 #ifdef CONFIG_DARWIN
 #define qemu_fgetxattr(...) fgetxattr(__VA_ARGS__, 0, 0)
 #define qemu_lgetxattr(...) getxattr(__VA_ARGS__, 0, XATTR_NOFOLLOW)
diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index 225f31fc31..4a296a0b94 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -1327,7 +1327,7 @@ static int stat_to_v9stat_dotl(V9fsPDU *pdu, const struct stat *stbuf,
     v9lstat->st_nlink = stbuf->st_nlink;
     v9lstat->st_uid = stbuf->st_uid;
     v9lstat->st_gid = stbuf->st_gid;
-    v9lstat->st_rdev = stbuf->st_rdev;
+    v9lstat->st_rdev = host_dev_to_dotl_dev(stbuf->st_rdev);
     v9lstat->st_size = stbuf->st_size;
     v9lstat->st_blksize = stat_to_iounit(pdu, stbuf);
     v9lstat->st_blocks = stbuf->st_blocks;
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 6/7] 9pfs: fix removing non-existent POSIX ACL xattr on macOS host
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 5/7] 9pfs: fix wrong errno being sent to Linux client on macOS host Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 3/7] 9pfs: fix qemu_mknodat(S_IFSOCK) on macOS Christian Schoenebeck
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

When mapped POSIX ACL is used, we are ignoring errors when trying
to remove a POSIX ACL xattr that does not exist. On Linux hosts we
would get ENODATA in such cases, on macOS hosts however we get
ENOATTR instead.

As we can be sure that ENOATTR is defined as being identical on Linux
hosts (at least by qemu/xattr.h), it is safe to fix this issue by
simply comparing against ENOATTR instead of ENODATA.

This patch fixes e.g. a command on Linux guest like:

  cp --preserve=mode old new

Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Link: https://lore.kernel.org/qemu-devel/2866993.yOYK24bMf6@silver/
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <34f81e9bffd7a3e65fb7aab5b56c107bd0aac960.1651228001.git.qemu_oss@crudebyte.com>
---
 hw/9pfs/9p-posix-acl.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c
index eadae270dd..4b2cb3c66c 100644
--- a/hw/9pfs/9p-posix-acl.c
+++ b/hw/9pfs/9p-posix-acl.c
@@ -65,7 +65,11 @@ static int mp_pacl_removexattr(FsContext *ctx,
     int ret;
 
     ret = local_removexattr_nofollow(ctx, path, MAP_ACL_ACCESS);
-    if (ret == -1 && errno == ENODATA) {
+    /*
+     * macOS returns ENOATTR (!=ENODATA on macOS), whereas Linux returns
+     * ENODATA (==ENOATTR on Linux), so checking for ENOATTR is fine
+     */
+    if (ret == -1 && errno == ENOATTR) {
         /*
          * We don't get ENODATA error when trying to remove a
          * posix acl that is not present. So don't throw the error
@@ -115,7 +119,11 @@ static int mp_dacl_removexattr(FsContext *ctx,
     int ret;
 
     ret = local_removexattr_nofollow(ctx, path, MAP_ACL_DEFAULT);
-    if (ret == -1 && errno == ENODATA) {
+    /*
+     * macOS returns ENOATTR (!=ENODATA on macOS), whereas Linux returns
+     * ENODATA (==ENOATTR on Linux), so checking for ENOATTR is fine
+     */
+    if (ret == -1 && errno == ENOATTR) {
         /*
          * We don't get ENODATA error when trying to remove a
          * posix acl that is not present. So don't throw the error
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 3/7] 9pfs: fix qemu_mknodat(S_IFSOCK) on macOS
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 5/7] 9pfs: fix wrong errno being sent to Linux client on macOS host Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 6/7] 9pfs: fix removing non-existent POSIX ACL xattr " Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 7/7] 9pfs: fix qemu_mknodat() to always return -1 on error on macOS host Christian Schoenebeck
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

mknod() on macOS does not support creating sockets, so divert to
call sequence socket(), bind() and fchmodat() respectively if S_IFSOCK
was passed with mode argument.

Link: https://lore.kernel.org/qemu-devel/17933734.zYzKuhC07K@silver/
Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <2e7b5ecd7a6d83a538db4e8a22d8fb03e9e0f06e.1651228001.git.qemu_oss@crudebyte.com>
---
 hw/9pfs/9p-util-darwin.c | 42 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/hw/9pfs/9p-util-darwin.c b/hw/9pfs/9p-util-darwin.c
index e24d09763a..619c403ba7 100644
--- a/hw/9pfs/9p-util-darwin.c
+++ b/hw/9pfs/9p-util-darwin.c
@@ -74,6 +74,42 @@ int fsetxattrat_nofollow(int dirfd, const char *filename, const char *name,
  */
 #if defined CONFIG_PTHREAD_FCHDIR_NP
 
+static int create_socket_file_at_cwd(const char *filename, mode_t mode) {
+    int fd, err;
+    struct sockaddr_un addr = {
+        .sun_family = AF_UNIX
+    };
+
+    err = snprintf(addr.sun_path, sizeof(addr.sun_path), "./%s", filename);
+    if (err < 0 || err >= sizeof(addr.sun_path)) {
+        errno = ENAMETOOLONG;
+        return -1;
+    }
+    fd = socket(PF_UNIX, SOCK_DGRAM, 0);
+    if (fd == -1) {
+        return fd;
+    }
+    err = bind(fd, (struct sockaddr *) &addr, sizeof(addr));
+    if (err == -1) {
+        goto out;
+    }
+    /*
+     * FIXME: Should rather be using descriptor-based fchmod() on the
+     * socket file descriptor above (preferably before bind() call),
+     * instead of path-based fchmodat(), to prevent concurrent transient
+     * state issues between creating the named FIFO file at bind() and
+     * delayed adjustment of permissions at fchmodat(). However currently
+     * macOS (12.x) does not support such operations on socket file
+     * descriptors yet.
+     *
+     * Filed report with Apple: FB9997731
+     */
+    err = fchmodat(AT_FDCWD, filename, mode, AT_SYMLINK_NOFOLLOW_ANY);
+out:
+    close_preserve_errno(fd);
+    return err;
+}
+
 int qemu_mknodat(int dirfd, const char *filename, mode_t mode, dev_t dev)
 {
     int preserved_errno, err;
@@ -93,7 +129,11 @@ int qemu_mknodat(int dirfd, const char *filename, mode_t mode, dev_t dev)
     if (pthread_fchdir_np(dirfd) < 0) {
         return -1;
     }
-    err = mknod(filename, mode, dev);
+    if (S_ISSOCK(mode)) {
+        err = create_socket_file_at_cwd(filename, mode);
+    } else {
+        err = mknod(filename, mode, dev);
+    }
     preserved_errno = errno;
     /* Stop using the thread-local cwd */
     pthread_fchdir_np(-1);
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 1/7] 9pfs: fix inode sequencing in 'synth' driver
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
                   ` (5 preceding siblings ...)
  2022-04-30 11:44 ` [PULL 2/7] 9pfs: fix qemu_mknodat(S_IFREG) " Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 16:37 ` [PULL 0/7] 9p queue 2022-04-30 Richard Henderson
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

The 'synth' driver's root node and the 'synth' driver's first
subdirectory node falsely share the same inode number (zero), which
makes it impossible for 9p clients (i.e. 9p test cases) to distinguish
root node and first subdirectory from each other by comparing their QIDs
(which are derived by 9p server from driver's inode numbers).

Fix this issue by using prefix-increment instead of postfix-increment
operator while generating new inode numbers for subdirectories and files.

Link: https://lore.kernel.org/qemu-devel/3859307.hTDP4D0zbi@silver/
Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Message-Id: <E1nTpyU-0000yR-9o@lizzy.crudebyte.com>
---
 hw/9pfs/9p-synth.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c
index d99d263985..1c5813e4dd 100644
--- a/hw/9pfs/9p-synth.c
+++ b/hw/9pfs/9p-synth.c
@@ -92,7 +92,7 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode,
         }
     }
     /* Add the name */
-    node = v9fs_add_dir_node(parent, mode, name, NULL, synth_node_count++);
+    node = v9fs_add_dir_node(parent, mode, name, NULL, ++synth_node_count);
     v9fs_add_dir_node(node, parent->attr->mode, "..",
                       parent->attr, parent->attr->inode);
     v9fs_add_dir_node(node, node->attr->mode, ".",
@@ -130,7 +130,7 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode,
     mode = ((mode & 0777) | S_IFREG);
     node = g_new0(V9fsSynthNode, 1);
     node->attr         = &node->actual_attr;
-    node->attr->inode  = synth_node_count++;
+    node->attr->inode  = ++synth_node_count;
     node->attr->nlink  = 1;
     node->attr->read   = read;
     node->attr->write  = write;
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 7/7] 9pfs: fix qemu_mknodat() to always return -1 on error on macOS host
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
                   ` (2 preceding siblings ...)
  2022-04-30 11:44 ` [PULL 3/7] 9pfs: fix qemu_mknodat(S_IFSOCK) on macOS Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 4/7] 9pfs: fix wrong encoding of rdev field in Rgetattr on macOS Christian Schoenebeck
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

qemu_mknodat() is expected to behave according to its POSIX API, and
therefore should always return exactly -1 on any error, and errno
should be set for the actual error code.

Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <c714b5e1cae225ab7575242c45ee0fe4945eb6ad.1651228001.git.qemu_oss@crudebyte.com>
---
 hw/9pfs/9p-util-darwin.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/9pfs/9p-util-darwin.c b/hw/9pfs/9p-util-darwin.c
index 619c403ba7..a5f8707bb8 100644
--- a/hw/9pfs/9p-util-darwin.c
+++ b/hw/9pfs/9p-util-darwin.c
@@ -124,7 +124,8 @@ int qemu_mknodat(int dirfd, const char *filename, mode_t mode, dev_t dev)
     }
     if (!pthread_fchdir_np) {
         error_report_once("pthread_fchdir_np() not available on this version of macOS");
-        return -ENOTSUP;
+        errno = ENOTSUP;
+        return -1;
     }
     if (pthread_fchdir_np(dirfd) < 0) {
         return -1;
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 2/7] 9pfs: fix qemu_mknodat(S_IFREG) on macOS
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
                   ` (4 preceding siblings ...)
  2022-04-30 11:44 ` [PULL 4/7] 9pfs: fix wrong encoding of rdev field in Rgetattr on macOS Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 1/7] 9pfs: fix inode sequencing in 'synth' driver Christian Schoenebeck
  2022-04-30 16:37 ` [PULL 0/7] 9p queue 2022-04-30 Richard Henderson
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

mknod() on macOS does not support creating regular files, so
divert to openat_file() if S_IFREG is passed with mode argument.

Furthermore, 'man 2 mknodat' on Linux says: "Zero file type is
equivalent to type S_IFREG".

Link: https://lore.kernel.org/qemu-devel/17933734.zYzKuhC07K@silver/
Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Reviewed-by: Will Cohen <wwcohen@gmail.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <3102ca936f88bc1f79d2a325e5bc68f48f54e6e3.1651228000.git.qemu_oss@crudebyte.com>
---
 hw/9pfs/9p-util-darwin.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/9pfs/9p-util-darwin.c b/hw/9pfs/9p-util-darwin.c
index bec0253474..e24d09763a 100644
--- a/hw/9pfs/9p-util-darwin.c
+++ b/hw/9pfs/9p-util-darwin.c
@@ -77,6 +77,15 @@ int fsetxattrat_nofollow(int dirfd, const char *filename, const char *name,
 int qemu_mknodat(int dirfd, const char *filename, mode_t mode, dev_t dev)
 {
     int preserved_errno, err;
+
+    if (S_ISREG(mode) || !(mode & S_IFMT)) {
+        int fd = openat_file(dirfd, filename, O_CREAT, mode);
+        if (fd == -1) {
+            return fd;
+        }
+        close(fd);
+        return 0;
+    }
     if (!pthread_fchdir_np) {
         error_report_once("pthread_fchdir_np() not available on this version of macOS");
         return -ENOTSUP;
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PULL 5/7] 9pfs: fix wrong errno being sent to Linux client on macOS host
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
@ 2022-04-30 11:44 ` Christian Schoenebeck
  2022-04-30 11:44 ` [PULL 6/7] 9pfs: fix removing non-existent POSIX ACL xattr " Christian Schoenebeck
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 11:44 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell; +Cc: Greg Kurz

Linux and macOS only share some errno definitions with equal macro
name and value. In fact most mappings for errno are completely
different on the two systems.

This patch converts some important errno values from macOS host to
corresponding Linux errno values before eventually sending such error
codes along with 'Rlerror' replies (if 9p2000.L is used that is). Not
having translated errnos before violated the 9p2000.L protocol spec,
which says:

  "
  size[4] Rlerror tag[2] ecode[4]

  ... ecode is a numerical Linux errno.
  "

  https://github.com/chaos/diod/wiki/protocol#lerror----return-error-code

This patch fixes a bunch of misbehaviours when running a Linux client
on macOS host. For instance this patch fixes:

  mount -t 9p -o posixacl ...

on Linux guest if security_mode=mapped was used for 9p server, which
refused to mount successfully, because macOS returned ENOATTR==93
when client tried to retrieve POSIX ACL xattrs, because errno 93
is defined as EPROTONOSUPPORT==93 on Linux, so Linux client believed
that xattrs were not supported by filesystem on host in general.

Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Link: https://lore.kernel.org/qemu-devel/20220421124835.3e664669@bahia/
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <b322ab298a62069e527d2b032028bdc9115afacd.1651228001.git.qemu_oss@crudebyte.com>
---
 hw/9pfs/9p-util.h | 30 ++++++++++++++++++++++++++++++
 hw/9pfs/9p.c      |  2 ++
 2 files changed, 32 insertions(+)

diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
index 2cc9a5dbfb..c3526144c9 100644
--- a/hw/9pfs/9p-util.h
+++ b/hw/9pfs/9p-util.h
@@ -58,6 +58,36 @@ static inline uint64_t host_dev_to_dotl_dev(dev_t dev)
 #endif
 }
 
+/* Translates errno from host -> Linux if needed */
+static inline int errno_to_dotl(int err) {
+#if defined(CONFIG_LINUX)
+    /* nothing to translate (Linux -> Linux) */
+#elif defined(CONFIG_DARWIN)
+    /*
+     * translation mandatory for macOS hosts
+     *
+     * FIXME: Only most important errnos translated here yet, this should be
+     * extended to as many errnos being translated as possible in future.
+     */
+    if (err == ENAMETOOLONG) {
+        err = 36; /* ==ENAMETOOLONG on Linux */
+    } else if (err == ENOTEMPTY) {
+        err = 39; /* ==ENOTEMPTY on Linux */
+    } else if (err == ELOOP) {
+        err = 40; /* ==ELOOP on Linux */
+    } else if (err == ENOATTR) {
+        err = 61; /* ==ENODATA on Linux */
+    } else if (err == ENOTSUP) {
+        err = 95; /* ==EOPNOTSUPP on Linux */
+    } else if (err == EOPNOTSUPP) {
+        err = 95; /* ==EOPNOTSUPP on Linux */
+    }
+#else
+#error Missing errno translation to Linux for this host system
+#endif
+    return err;
+}
+
 #ifdef CONFIG_DARWIN
 #define qemu_fgetxattr(...) fgetxattr(__VA_ARGS__, 0, 0)
 #define qemu_lgetxattr(...) getxattr(__VA_ARGS__, 0, XATTR_NOFOLLOW)
diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index 4a296a0b94..0cd0c14c2a 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -1054,6 +1054,8 @@ static void coroutine_fn pdu_complete(V9fsPDU *pdu, ssize_t len)
             }
             len += ret;
             id = P9_RERROR;
+        } else {
+            err = errno_to_dotl(err);
         }
 
         ret = pdu_marshal(pdu, len, "d", err);
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PULL 0/7] 9p queue 2022-04-30
  2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
                   ` (6 preceding siblings ...)
  2022-04-30 11:44 ` [PULL 1/7] 9pfs: fix inode sequencing in 'synth' driver Christian Schoenebeck
@ 2022-04-30 16:37 ` Richard Henderson
  2022-04-30 19:29   ` Christian Schoenebeck
  7 siblings, 1 reply; 11+ messages in thread
From: Richard Henderson @ 2022-04-30 16:37 UTC (permalink / raw)
  To: Christian Schoenebeck, qemu-devel, Peter Maydell; +Cc: Greg Kurz

On 4/30/22 04:44, Christian Schoenebeck wrote:
> The following changes since commit 731340813fdb4cb8339edb8630e3f923b7d987ec:
> 
>    Merge tag 'pull-riscv-to-apply-20220429' of github.com:alistair23/qemu into staging (2022-04-29 08:46:55 -0700)
> 
> are available in the Git repository at:
> 
>    https://github.com/cschoenebeck/qemu.git tags/pull-9p-20220430
> 
> for you to fetch changes up to e8fb9ed725fe2ed00a275674a84beb5ba6e538a7:
> 
>    9pfs: fix qemu_mknodat() to always return -1 on error on macOS host (2022-04-30 13:11:48 +0200)
> 
> ----------------------------------------------------------------
> 9pfs: various fixes
> 
> * macOS: Fix recently (in QEMU 7.0) added 9p support for macOS hosts.
> 
> * Tests: Fix inode sequencing in 'synth' driver.
> 
> ----------------------------------------------------------------
> Christian Schoenebeck (7):
>        9pfs: fix inode sequencing in 'synth' driver
>        9pfs: fix qemu_mknodat(S_IFREG) on macOS
>        9pfs: fix qemu_mknodat(S_IFSOCK) on macOS
>        9pfs: fix wrong encoding of rdev field in Rgetattr on macOS
>        9pfs: fix wrong errno being sent to Linux client on macOS host
>        9pfs: fix removing non-existent POSIX ACL xattr on macOS host
>        9pfs: fix qemu_mknodat() to always return -1 on error on macOS host
> 
>   hw/9pfs/9p-posix-acl.c   | 12 +++++++--
>   hw/9pfs/9p-synth.c       |  4 +--
>   hw/9pfs/9p-util-darwin.c | 54 +++++++++++++++++++++++++++++++++++--
>   hw/9pfs/9p-util.h        | 69 ++++++++++++++++++++++++++++++++++++++++++++++++
>   hw/9pfs/9p.c             |  4 ++-
>   5 files changed, 136 insertions(+), 7 deletions(-)
> 

Fails with

../hw/9pfs/9p-util-darwin.c:107:46: error: use of undeclared identifier 
'AT_SYMLINK_NOFOLLOW_ANY'
     err = fchmodat(AT_FDCWD, filename, mode, AT_SYMLINK_NOFOLLOW_ANY);
                                              ^
1 error generated.

https://gitlab.com/qemu-project/qemu/-/jobs/2398467527


r~


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PULL 0/7] 9p queue 2022-04-30
  2022-04-30 16:37 ` [PULL 0/7] 9p queue 2022-04-30 Richard Henderson
@ 2022-04-30 19:29   ` Christian Schoenebeck
  2022-04-30 20:16     ` Richard Henderson
  0 siblings, 1 reply; 11+ messages in thread
From: Christian Schoenebeck @ 2022-04-30 19:29 UTC (permalink / raw)
  To: qemu-devel, Peter Maydell, Richard Henderson
  Cc: Greg Kurz, Akihiko Odaki, Will Cohen

On Samstag, 30. April 2022 18:37:40 CEST Richard Henderson wrote:
> On 4/30/22 04:44, Christian Schoenebeck wrote:
> > The following changes since commit 
731340813fdb4cb8339edb8630e3f923b7d987ec:
> >    Merge tag 'pull-riscv-to-apply-20220429' of github.com:alistair23/qemu
> >    into staging (2022-04-29 08:46:55 -0700)> 
> > are available in the Git repository at:
> >    https://github.com/cschoenebeck/qemu.git tags/pull-9p-20220430
> > 
> > for you to fetch changes up to e8fb9ed725fe2ed00a275674a84beb5ba6e538a7:
> >    9pfs: fix qemu_mknodat() to always return -1 on error on macOS host
> >    (2022-04-30 13:11:48 +0200)> 
> > ----------------------------------------------------------------
> > 9pfs: various fixes
> > 
> > * macOS: Fix recently (in QEMU 7.0) added 9p support for macOS hosts.
> > 
> > * Tests: Fix inode sequencing in 'synth' driver.
> > 
> > ----------------------------------------------------------------
> > 
> > Christian Schoenebeck (7):
> >        9pfs: fix inode sequencing in 'synth' driver
> >        9pfs: fix qemu_mknodat(S_IFREG) on macOS
> >        9pfs: fix qemu_mknodat(S_IFSOCK) on macOS
> >        9pfs: fix wrong encoding of rdev field in Rgetattr on macOS
> >        9pfs: fix wrong errno being sent to Linux client on macOS host
> >        9pfs: fix removing non-existent POSIX ACL xattr on macOS host
> >        9pfs: fix qemu_mknodat() to always return -1 on error on macOS host
> >   
> >   hw/9pfs/9p-posix-acl.c   | 12 +++++++--
> >   hw/9pfs/9p-synth.c       |  4 +--
> >   hw/9pfs/9p-util-darwin.c | 54 +++++++++++++++++++++++++++++++++++--
> >   hw/9pfs/9p-util.h        | 69
> >   ++++++++++++++++++++++++++++++++++++++++++++++++ hw/9pfs/9p.c          
> >     |  4 ++-
> >   5 files changed, 136 insertions(+), 7 deletions(-)
> 
> Fails with
> 
> ../hw/9pfs/9p-util-darwin.c:107:46: error: use of undeclared identifier
> 'AT_SYMLINK_NOFOLLOW_ANY'
>      err = fchmodat(AT_FDCWD, filename, mode, AT_SYMLINK_NOFOLLOW_ANY);
>                                               ^
> 1 error generated.
> 
> https://gitlab.com/qemu-project/qemu/-/jobs/2398467527
> 
> 
> r~

Nice. I just realized AT_SYMLINK_NOFOLLOW_ANY was added with Xcode 13.3, which 
supposedly means >= macOS 12.3. And it wasn't marked by Apple as such. :/

I suggest I just s/AT_SYMLINK_NOFOLLOW_ANY/AT_SYMLINK_NOFOLLOW/ on my end and 
post v2 PR, for consistency and as it does not really make a huge difference 
IMO which one of the two is used in create_socket_file_at_cwd().

Any objections?

Best regards,
Christian Schoenebeck




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PULL 0/7] 9p queue 2022-04-30
  2022-04-30 19:29   ` Christian Schoenebeck
@ 2022-04-30 20:16     ` Richard Henderson
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2022-04-30 20:16 UTC (permalink / raw)
  To: Christian Schoenebeck, qemu-devel, Peter Maydell
  Cc: Will Cohen, Greg Kurz, Akihiko Odaki

On 4/30/22 12:29, Christian Schoenebeck wrote:
> I suggest I just s/AT_SYMLINK_NOFOLLOW_ANY/AT_SYMLINK_NOFOLLOW/ on my end and
> post v2 PR, for consistency and as it does not really make a huge difference
> IMO which one of the two is used in create_socket_file_at_cwd().
> 
> Any objections?

Sounds good.

r~


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-04-30 20:18 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-30 11:44 [PULL 0/7] 9p queue 2022-04-30 Christian Schoenebeck
2022-04-30 11:44 ` [PULL 5/7] 9pfs: fix wrong errno being sent to Linux client on macOS host Christian Schoenebeck
2022-04-30 11:44 ` [PULL 6/7] 9pfs: fix removing non-existent POSIX ACL xattr " Christian Schoenebeck
2022-04-30 11:44 ` [PULL 3/7] 9pfs: fix qemu_mknodat(S_IFSOCK) on macOS Christian Schoenebeck
2022-04-30 11:44 ` [PULL 7/7] 9pfs: fix qemu_mknodat() to always return -1 on error on macOS host Christian Schoenebeck
2022-04-30 11:44 ` [PULL 4/7] 9pfs: fix wrong encoding of rdev field in Rgetattr on macOS Christian Schoenebeck
2022-04-30 11:44 ` [PULL 2/7] 9pfs: fix qemu_mknodat(S_IFREG) " Christian Schoenebeck
2022-04-30 11:44 ` [PULL 1/7] 9pfs: fix inode sequencing in 'synth' driver Christian Schoenebeck
2022-04-30 16:37 ` [PULL 0/7] 9p queue 2022-04-30 Richard Henderson
2022-04-30 19:29   ` Christian Schoenebeck
2022-04-30 20:16     ` Richard Henderson

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.