All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Schoenebeck <qemu_oss@crudebyte.com>
To: qemu-devel@nongnu.org, qemu-stable@nongnu.org
Cc: Keno Fischer <keno@juliacomputing.com>,
	Michael Roitzsch <reactorcontrol@icloud.com>,
	Will Cohen <wwcohen@gmail.com>,
	 Akihiko Odaki <akihiko.odaki@gmail.com>,
	Greg Kurz <groug@kaod.org>
Subject: Re: [PATCH 4/5] 9pfs: fix wrong errno being sent to Linux client on macOS host
Date: Thu, 21 Apr 2022 14:20:50 +0200	[thread overview]
Message-ID: <2789542.yvXY0umSai@silver> (raw)
In-Reply-To: <20220421134626.52726efa@bahia>

On Donnerstag, 21. April 2022 13:46:26 CEST Greg Kurz wrote:
> On Thu, 21 Apr 2022 13:13:08 +0200
> 
> Christian Schoenebeck <qemu_oss@crudebyte.com> wrote:
> > On Donnerstag, 21. April 2022 12:48:35 CEST Greg Kurz wrote:
> > > On Tue, 19 Apr 2022 13:41:59 +0200
> > > 
> > > Christian Schoenebeck <qemu_oss@crudebyte.com> wrote:
> > > > 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 Tlerror replies (if 9p2000.L is used that is), which
> > > > fixes a bunch of misbehaviours when running a Linux client on macOS
> > > > host.
> > > 
> > > This even fixes an actual protocol violation :
> > > 
> > > lerror -- return error code
> > > 
> > > size[4] Rlerror tag[2] ecode[4]
> > > 
> > > lerror replaces the reply message used in a successful call. ecode is a
> > > numerical Linux errno.
> > > ^^^^^^^^^^^^^^^^^^^^^
> > > 
> > > Taken from
> > > https://github.com/chaos/diod/wiki/protocol#lerror----return-error-code
> > 
> > Again, something to add to the commit log?
> 
> IMHO a protocol violation is important enough to be mentioned but
> I'll leave it to you.

Ok, will do.

> > > > 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>
> > > > ---
> > > > 
> > > >  hw/9pfs/9p.c | 27 +++++++++++++++++++++++++++
> > > >  1 file changed, 27 insertions(+)
> > > > 
> > > > diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
> > > > index d953035e1c..becc41cbfd 100644
> > > > --- a/hw/9pfs/9p.c
> > > > +++ b/hw/9pfs/9p.c
> > > > @@ -57,6 +57,31 @@ enum {
> > > > 
> > > >  P9ARRAY_DEFINE_TYPE(V9fsPath, v9fs_path_free);
> > > > 
> > > > +/* Translates errno from host -> Linux if needed */
> > > > +static int errno_to_dotl(int err) {
> > > > +#if defined(CONFIG_LINUX)
> > > > +    /* nothing to translate (Linux -> Linux) */
> > > > +#elif defined(CONFIG_DARWIN)
> > > > +    /* translation mandatory for macOS hosts */
> > > > +    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 */
> > > > +    }
> > > 
> > > I'm assuming you have audited all errnos, right ? Just to be sure
> > > that this won't bite anymore.
> > 
> > Depends on what you mean with "all". Like I wrote in the commit log, for
> > now I translated in this patch those errnos that I identified as
> > important, and those are audited by me of course (checked the man pages
> > for what errors are expected as result from calls on Linux vs. macOS side
> > and looked up numeric values from header files on both sides, tests).
> 
> I was pretty sure you'd have done that at least :-)
> 
> > However if you rather mean really all errnos that were ever defined on
> > Linux and macOS, then the answer is no. That would probably quite some
> > work, and I'm not sure if you could just try to translate them dry, i.e.
> > by just looking at the headers or something.
> 
> But yes I was rather meaning the full errno set.
> 
> > So yes, your concern is justified. The question is, should this all be
> > translated right now already, or would it be OK to address this minimum
> > set of errno translation for now (especially for qemu-stable) and then
> > later address the rest?
> 
> My concern is about the maintenance burden of investigating future
> implementations of this issue, so I'd say it is mostly up to you
> as the principal maintainer. Maybe leave a FIXME comment in the code
> that the list of translated errnos isn't exhaustive at least ?

I stick to this minimal approach with FIXME comment then for now. I have 
tested this patch thoroughly on macOS and did not encounter similar issues. So 
I think it is good enough as first-aid patch at least.

The aforementioned case-insensitive filesystem issues are a higher priority 
from my PoV, because they trigger various misbehaviour in my tests.

Best regards,
Christian Schoenebeck

> > On the long term you would probably import the Linux errno header file
> > into
> > the code base, then prefix the individual macros with something like
> > DOTL_ENODATA, etc. and then use those macros for translating the errnos
> > instead of using literal numerics, maybe using GCC's designated array
> > initializers then.
> 
> This would make sense indeed since 9p2000.L explicitly mentions the
> numerical linux errnos.
> 
> > > > +#else
> > > > +#error Missing errno translation to Linux for this host system
> > > > +#endif
> > > > +    return err;
> > > > +}
> > > > +
> > > 
> > > As with the other patch, I'd rather move this magic to 9p-util.h .
> > 
> > Makes sense. There is indeed already too much utility code piled up in
> > 9p.c.> 
> > > >  static ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char
> > > >  *fmt,
> > > >  ...) {
> > > >  
> > > >      ssize_t ret;
> > > > 
> > > > @@ -1054,6 +1079,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);




  reply	other threads:[~2022-04-21 12:24 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-19 12:07 [PATCH 0/5] 9pfs: macOS host fixes Christian Schoenebeck
2022-04-19 11:40 ` [PATCH 1/5] 9pfs: fix qemu_mknodat(S_IFREG) on macOS Christian Schoenebeck
2022-04-19 13:44   ` Will Cohen
2022-04-20  2:03   ` Akihiko Odaki
2022-04-20  8:40     ` Greg Kurz
2022-04-20  9:38       ` Christian Schoenebeck
2022-04-19 11:41 ` [PATCH 2/5] 9pfs: fix qemu_mknodat(S_IFSOCK) " Christian Schoenebeck
2022-04-19 13:46   ` Will Cohen
2022-04-20  9:09   ` Greg Kurz
2022-04-20 10:28     ` Christian Schoenebeck
2022-04-20 12:08       ` Greg Kurz
2022-04-20 12:10   ` Greg Kurz
2022-04-20 12:41     ` Christian Schoenebeck
2022-04-19 11:41 ` [PATCH 3/5] 9pfs: fix wrong encoding of rdev field in Rgetattr " Christian Schoenebeck
2022-04-21  7:30   ` Greg Kurz
2022-04-21 10:25     ` Christian Schoenebeck
2022-04-21 10:31       ` Greg Kurz
2022-04-19 11:41 ` [PATCH 4/5] 9pfs: fix wrong errno being sent to Linux client on macOS host Christian Schoenebeck
2022-04-21 10:48   ` Greg Kurz
2022-04-21 11:13     ` Christian Schoenebeck
2022-04-21 11:46       ` Greg Kurz
2022-04-21 12:20         ` Christian Schoenebeck [this message]
2022-04-19 11:43 ` [PATCH 5/5] 9pfs: fix removing non-existent POSIX ACL xattr " Christian Schoenebeck
2022-04-21  8:26   ` Greg Kurz
2022-04-21 10:55     ` Christian Schoenebeck
2022-04-21 12:26       ` Greg Kurz
2022-04-21 13:03         ` Christian Schoenebeck

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=2789542.yvXY0umSai@silver \
    --to=qemu_oss@crudebyte.com \
    --cc=akihiko.odaki@gmail.com \
    --cc=groug@kaod.org \
    --cc=keno@juliacomputing.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    --cc=reactorcontrol@icloud.com \
    --cc=wwcohen@gmail.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.