All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Schoenebeck <qemu_oss@crudebyte.com>
To: Bin Meng <bmeng.cn@gmail.com>
Cc: qemu-devel@nongnu.org,
	Michael Roitzsch <reactorcontrol@icloud.com>,
	qemu-stable@nongnu.org, Keno Fischer <keno@juliacomputing.com>,
	Will Cohen <wwcohen@gmail.com>,
	Guohuai Shi <guohuai.shi@windriver.com>,
	Akihiko Odaki <akihiko.odaki@gmail.com>,
	Greg Kurz <groug@kaod.org>
Subject: Re: [PATCH v5 4/6] 9pfs: fix wrong errno being sent to Linux client on macOS host
Date: Fri, 29 Apr 2022 15:48:16 +0200	[thread overview]
Message-ID: <2182756.uObvtyB7Eu@silver> (raw)
In-Reply-To: <20220429152915.7beb6545@bahia>

On Freitag, 29. April 2022 15:29:15 CEST Greg Kurz wrote:
> On Fri, 29 Apr 2022 21:19:51 +0800
> 
> Bin Meng <bmeng.cn@gmail.com> wrote:
> > On Fri, Apr 29, 2022 at 9:08 PM Greg Kurz <groug@kaod.org> wrote:
> > > On Fri, 29 Apr 2022 14:46:26 +0200
> > > 
> > > Christian Schoenebeck <qemu_oss@crudebyte.com> wrote:
> > > > On Freitag, 29. April 2022 13:28:39 CEST Bin Meng wrote:
> > > > > On Fri, Apr 29, 2022 at 7:16 PM 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 '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-err
> > > > > >   or-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.
> > > > > 
> > > > > This issue looks exact the same issue we were trying to fix when
> > > > > supporting 9p on Windows host,
> > > > > 
> > > > > What we did is like this:
> > > > > http://patchwork.ozlabs.org/project/qemu-devel/patch/20220425142705.
> > > > > 2099270-> 10-bmeng.cn@gmail.com/
> > > > > 
> > > > > But we had some questions in mind (see the commit message of our
> > > > > patch, and below)
> > > > > 
> > > > > > 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>
> > > > > > ---
> > > > > > 
> > > > > >  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 */
> > > > > > +    }
> > > > > 
> > > > > What happens if a macOS guest is running on QEMU from a macOS host?
> > > > > Here all macOS errnos are translated to the Linux errnos. Will macOS
> > > > > be happy?
> > > > 
> > > > Look at the commit log of this patch: it is a matter of which protocol
> > > > is used> > > 
> > > > (currently there are 3 [1] protocol versions):
> > > >    * 9p2000: nothing to translate here, as this protocol version does
> > > >    not
> > > >    
> > > >      return a numeric error code, it only returns an error string (and
> > > >      we are
> > > >      no longer supporting 9p2000 version in QEMU anyway BTW [1]):
> > > >      http://ericvh.github.io/9p-rfc/rfc9p2000.html#anchor27
> > > >    
> > > >    * 9p2000.L: errno *must* be in Linux errno mapping:
> > > >      https://github.com/chaos/diod/wiki/protocol#lerror----return-erro
> > > >      r-code
> > > >    
> > > >    * 9p2000.u: this one returns both an error code and error string,
> > > >    and it
> > > >    
> > > >      says the error string should be preferred being interpreted by
> > > >      client:
> > > >      http://ericvh.github.io/9p-rfc/rfc9p2000.u.html#anchor15
> > > > 
> > > > In this patch here I only translated errno for 9p2000.L, whereas you
> > > > are
> > > > always translating it, no matter wich protocol version is used. You
> > > > might
> > > > argue that there should be a translation for 9p2000.u as well, but in
> > > > the end we don't know the OS running on guest in this case. It could
> > > > be Linux or something else.
> > > 
> > > In the case of 9p2000.u the spec says "to provide a hint of the
> > > underlying
> > > UNIX error number which caused the error on the server" and even
> > > mentions
> > > "consistency problems of mapping error numbers betweeen different
> > > versions
> > > of UNIX"... this basically means that errno in 9p2000.u is undefined
> > > since
> > > it depends on the host. It is thus unusable unless the guest runs a
> > > compatible UNIX variant. In any case, there's really nothing to
> > > translate.
> > > 
> > > > [1] https://wiki.qemu.org/Documentation/9p#9p_Protocol
> > 
> > Thanks for the clarifications and pointers to different protocols! It
> > looks what we did in our Windows patch is correct.

Like I said, you are translating it for all protocol version, whereas this 
patch here translates errnos for 9p2000.L version only.

> > I have another question, does this mean the current 9pfs client on
> > macOS is broken since it does not use any translation? With this
> > patch, now the 9p server returns the translated linux errno so the 9p
> > client on macOS should complain.
> 
> I don't now the macOS client but if it doesn't expect linux errnos
> then it is infringing 9p2000.L and should be fixed.

Agreed, if you are using 9p2000.L with that macOS client and client does not 
translate errnos Linux -> macOS, then client is broken. In the end it matters 
what the protocol documentation specified.

Which client is that? Is it from Apple or from a third party? And are you sure 
you were actually using 9p2000.L and not 9p2000.u?

Best regards,
Christian Schoenebeck




  reply	other threads:[~2022-04-29 13:52 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-29 10:26 [PATCH v5 0/6] 9pfs: macOS host fixes Christian Schoenebeck
2022-04-29 10:25 ` [PATCH v5 1/6] 9pfs: fix qemu_mknodat(S_IFREG) on macOS Christian Schoenebeck
2022-04-29 10:25 ` [PATCH v5 2/6] 9pfs: fix qemu_mknodat(S_IFSOCK) " Christian Schoenebeck
2022-04-29 12:56   ` Greg Kurz
2022-04-29 13:50     ` Christian Schoenebeck
2022-04-29 14:35       ` Greg Kurz
2022-04-29 15:20         ` Christian Schoenebeck
2022-04-29 16:29           ` Akihiko Odaki
2022-05-02  6:45           ` Greg Kurz
2022-04-29 10:25 ` [PATCH v5 3/6] 9pfs: fix wrong encoding of rdev field in Rgetattr " Christian Schoenebeck
2022-04-29 10:25 ` [PATCH v5 4/6] 9pfs: fix wrong errno being sent to Linux client on macOS host Christian Schoenebeck
2022-04-29 11:28   ` Bin Meng
2022-04-29 12:44     ` Greg Kurz
2022-04-29 12:46     ` Christian Schoenebeck
2022-04-29 13:08       ` Greg Kurz
2022-04-29 13:19         ` Bin Meng
2022-04-29 13:29           ` Greg Kurz
2022-04-29 13:48             ` Christian Schoenebeck [this message]
2022-04-29 14:16               ` Bin Meng
2022-04-29 15:16                 ` Christian Schoenebeck
2022-04-29 16:13                   ` Bin Meng
2022-04-29 10:25 ` [PATCH v5 5/6] 9pfs: fix removing non-existent POSIX ACL xattr " Christian Schoenebeck
2022-04-29 10:25 ` [PATCH v5 6/6] 9pfs: fix qemu_mknodat() to always return -1 on error " Christian Schoenebeck
2022-04-30 12:23 ` [PATCH v5 0/6] 9pfs: macOS host fixes (resend) 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=2182756.uObvtyB7Eu@silver \
    --to=qemu_oss@crudebyte.com \
    --cc=akihiko.odaki@gmail.com \
    --cc=bmeng.cn@gmail.com \
    --cc=groug@kaod.org \
    --cc=guohuai.shi@windriver.com \
    --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.