From: Christian Schoenebeck <qemu_oss@crudebyte.com>
To: qemu-devel@nongnu.org
Cc: Guohuai Shi <guohuai.shi@windriver.com>,
Greg Kurz <groug@kaod.org>, Bin Meng <bin.meng@windriver.com>
Subject: Re: [PATCH 11/16] hw/9pfs: Add Linux error number definition
Date: Tue, 01 Nov 2022 16:21:51 +0100 [thread overview]
Message-ID: <3980771.K8829Pglg3@silver> (raw)
In-Reply-To: <20221024045759.448014-12-bin.meng@windriver.com>
On Monday, October 24, 2022 6:57:54 AM CET Bin Meng wrote:
> From: Guohuai Shi <guohuai.shi@windriver.com>
>
> When using 9p2000.L protocol, the errno should use the Linux errno.
> Currently magic numbers with comments are used. Replace these with
> macros for future expansion.
>
> Signed-off-by: Guohuai Shi <guohuai.shi@windriver.com>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> hw/9pfs/9p-linux-errno.h | 151 +++++++++++++++++++++++++++++++++++++++
> hw/9pfs/9p-util.h | 38 ++++++----
> 2 files changed, 176 insertions(+), 13 deletions(-)
> create mode 100644 hw/9pfs/9p-linux-errno.h
>
> diff --git a/hw/9pfs/9p-linux-errno.h b/hw/9pfs/9p-linux-errno.h
> new file mode 100644
> index 0000000000..56c37fa293
> --- /dev/null
> +++ b/hw/9pfs/9p-linux-errno.h
> @@ -0,0 +1,151 @@
> +/*
> + * 9p Linux errno translation definition
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#include <errno.h>
> +
> +#ifndef QEMU_9P_LINUX_ERRNO_H
> +#define QEMU_9P_LINUX_ERRNO_H
> +
> +/*
> + * This file contains the Linux errno definitions to translate errnos set by
> + * the 9P server (running on non-Linux hosts) to a corresponding errno value.
> + *
> + * This list should be periodically reviewed and updated; particularly for
> + * errnos that might be set as a result of a file system operation.
> + */
Yeah, that's my main concern here. I wonder if there is isn't a better
maintainable solution at least for the list of Linux errors, so that we don't
have to manually update the L_ macros below.
> +
> +#define L_EPERM 1 /* Operation not permitted */
> +#define L_ENOENT 2 /* No such file or directory */
> +#define L_ESRCH 3 /* No such process */
> +#define L_EINTR 4 /* Interrupted system call */
> +#define L_EIO 5 /* I/O error */
> +#define L_ENXIO 6 /* No such device or address */
> +#define L_E2BIG 7 /* Argument list too long */
> +#define L_ENOEXEC 8 /* Exec format error */
> +#define L_EBADF 9 /* Bad file number */
> +#define L_ECHILD 10 /* No child processes */
> +#define L_EAGAIN 11 /* Try again */
> +#define L_ENOMEM 12 /* Out of memory */
> +#define L_EACCES 13 /* Permission denied */
> +#define L_EFAULT 14 /* Bad address */
> +#define L_ENOTBLK 15 /* Block device required */
> +#define L_EBUSY 16 /* Device or resource busy */
> +#define L_EEXIST 17 /* File exists */
> +#define L_EXDEV 18 /* Cross-device link */
> +#define L_ENODEV 19 /* No such device */
> +#define L_ENOTDIR 20 /* Not a directory */
> +#define L_EISDIR 21 /* Is a directory */
> +#define L_EINVAL 22 /* Invalid argument */
> +#define L_ENFILE 23 /* File table overflow */
> +#define L_EMFILE 24 /* Too many open files */
> +#define L_ENOTTY 25 /* Not a typewriter */
> +#define L_ETXTBSY 26 /* Text file busy */
> +#define L_EFBIG 27 /* File too large */
> +#define L_ENOSPC 28 /* No space left on device */
> +#define L_ESPIPE 29 /* Illegal seek */
> +#define L_EROFS 30 /* Read-only file system */
> +#define L_EMLINK 31 /* Too many links */
> +#define L_EPIPE 32 /* Broken pipe */
> +#define L_EDOM 33 /* Math argument out of domain of func */
> +#define L_ERANGE 34 /* Math result not representable */
> +#define L_EDEADLK 35 /* Resource deadlock would occur */
> +#define L_ENAMETOOLONG 36 /* File name too long */
> +#define L_ENOLCK 37 /* No record locks available */
> +#define L_ENOSYS 38 /* Function not implemented */
> +#define L_ENOTEMPTY 39 /* Directory not empty */
> +#define L_ELOOP 40 /* Too many symbolic links encountered */
> +#define L_ENOMSG 42 /* No message of desired type */
> +#define L_EIDRM 43 /* Identifier removed */
> +#define L_ECHRNG 44 /* Channel number out of range */
> +#define L_EL2NSYNC 45 /* Level 2 not synchronized */
> +#define L_EL3HLT 46 /* Level 3 halted */
> +#define L_EL3RST 47 /* Level 3 reset */
> +#define L_ELNRNG 48 /* Link number out of range */
> +#define L_EUNATCH 49 /* Protocol driver not attached */
> +#define L_ENOCSI 50 /* No CSI structure available */
> +#define L_EL2HLT 51 /* Level 2 halted */
> +#define L_EBADE 52 /* Invalid exchange */
> +#define L_EBADR 53 /* Invalid request descriptor */
> +#define L_EXFULL 54 /* Exchange full */
> +#define L_ENOANO 55 /* No anode */
> +#define L_EBADRQC 56 /* Invalid request code */
> +#define L_EBADSLT 57 /* Invalid slot */
> +#define L_EBFONT 58 /* Bad font file format */
> +#define L_ENOSTR 59 /* Device not a stream */
> +#define L_ENODATA 61 /* No data available */
> +#define L_ETIME 62 /* Timer expired */
> +#define L_ENOSR 63 /* Out of streams resources */
> +#define L_ENONET 64 /* Machine is not on the network */
> +#define L_ENOPKG 65 /* Package not installed */
> +#define L_EREMOTE 66 /* Object is remote */
> +#define L_ENOLINK 67 /* Link has been severed */
> +#define L_EADV 68 /* Advertise error */
> +#define L_ESRMNT 69 /* Srmount error */
> +#define L_ECOMM 70 /* Communication error on send */
> +#define L_EPROTO 71 /* Protocol error */
> +#define L_EMULTIHOP 72 /* Multihop attempted */
> +#define L_EDOTDOT 73 /* RFS specific error */
> +#define L_EBADMSG 74 /* Not a data message */
> +#define L_EOVERFLOW 75 /* Value too large for defined data type */
> +#define L_ENOTUNIQ 76 /* Name not unique on network */
> +#define L_EBADFD 77 /* File descriptor in bad state */
> +#define L_EREMCHG 78 /* Remote address changed */
> +#define L_ELIBACC 79 /* Can not access a needed shared library */
> +#define L_ELIBBAD 80 /* Accessing a corrupted shared library */
> +#define L_ELIBSCN 81 /* .lib section in a.out corrupted */
> +#define L_ELIBMAX 82 /* Attempting to link in too many shared libs */
> +#define L_ELIBEXEC 83 /* Cannot exec a shared library directly */
> +#define L_EILSEQ 84 /* Illegal byte sequence */
> +#define L_ERESTART 85 /* Interrupted system call should be restarted */
> +#define L_ESTRPIPE 86 /* Streams pipe error */
> +#define L_EUSERS 87 /* Too many users */
> +#define L_ENOTSOCK 88 /* Socket operation on non-socket */
> +#define L_EDESTADDRREQ 89 /* Destination address required */
> +#define L_EMSGSIZE 90 /* Message too long */
> +#define L_EPROTOTYPE 91 /* Protocol wrong type for socket */
> +#define L_ENOPROTOOPT 92 /* Protocol not available */
> +#define L_EPROTONOSUPPORT 93 /* Protocol not supported */
> +#define L_ESOCKTNOSUPPORT 94 /* Socket type not supported */
> +#define L_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
> +#define L_EPFNOSUPPORT 96 /* Protocol family not supported */
> +#define L_EAFNOSUPPORT 97 /* Address family not supported by protocol */
> +#define L_EADDRINUSE 98 /* Address already in use */
> +#define L_EADDRNOTAVAIL 99 /* Cannot assign requested address */
> +#define L_ENETDOWN 100 /* Network is down */
> +#define L_ENETUNREACH 101 /* Network is unreachable */
> +#define L_ENETRESET 102 /* Network dropped connection because of reset */
> +#define L_ECONNABORTED 103 /* Software caused connection abort */
> +#define L_ECONNRESET 104 /* Connection reset by peer */
> +#define L_ENOBUFS 105 /* No buffer space available */
> +#define L_EISCONN 106 /* Transport endpoint is already connected */
> +#define L_ENOTCONN 107 /* Transport endpoint is not connected */
> +#define L_ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
> +#define L_ETOOMANYREFS 109 /* Too many references: cannot splice */
> +#define L_ETIMEDOUT 110 /* Connection timed out */
> +#define L_ECONNREFUSED 111 /* Connection refused */
> +#define L_EHOSTDOWN 112 /* Host is down */
> +#define L_EHOSTUNREACH 113 /* No route to host */
> +#define L_EALREADY 114 /* Operation already in progress */
> +#define L_EINPROGRESS 115 /* Operation now in progress */
> +#define L_ESTALE 116 /* Stale NFS file handle */
> +#define L_EUCLEAN 117 /* Structure needs cleaning */
> +#define L_ENOTNAM 118 /* Not a XENIX named type file */
> +#define L_ENAVAIL 119 /* No XENIX semaphores available */
> +#define L_EISNAM 120 /* Is a named type file */
> +#define L_EREMOTEIO 121 /* Remote I/O error */
> +#define L_EDQUOT 122 /* Quota exceeded */
> +#define L_ENOMEDIUM 123 /* No medium found */
> +#define L_EMEDIUMTYPE 124 /* Wrong medium type */
> +#define L_ECANCELED 125 /* Operation Canceled */
> +#define L_ENOKEY 126 /* Required key not available */
> +#define L_EKEYEXPIRED 127 /* Key has expired */
> +#define L_EKEYREVOKED 128 /* Key has been revoked */
> +#define L_EKEYREJECTED 129 /* Key was rejected by service */
> +#define L_EOWNERDEAD 130 /* Owner died */
> +#define L_ENOTRECOVERABLE 131 /* State not recoverable */
> +
> +#endif /* QEMU_9P_LINUX_ERRNO_H */
> diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
> index 3d154e9103..281fdcbf8c 100644
> --- a/hw/9pfs/9p-util.h
> +++ b/hw/9pfs/9p-util.h
> @@ -62,8 +62,11 @@ static inline uint64_t host_dev_to_dotl_dev(dev_t dev)
> #endif
> }
>
> +#include "9p-linux-errno.h"
> +
> /* Translates errno from host -> Linux if needed */
> -static inline int errno_to_dotl(int err) {
> +static inline int errno_to_dotl(int err)
> +{
> #if defined(CONFIG_LINUX)
> /* nothing to translate (Linux -> Linux) */
> #elif defined(CONFIG_DARWIN)
> @@ -73,18 +76,27 @@ static inline int errno_to_dotl(int err) {
> * 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 */
> + switch (err) {
> + case ENAMETOOLONG:
> + err = L_ENAMETOOLONG;
> + break;
> + case ENOTEMPTY:
> + err = L_ENOTEMPTY;
> + break;
> + case ELOOP:
> + err = L_ELOOP;
> + break;
> + case ENOATTR:
> + err = L_ENODATA;
> + break;
> + case ENOTSUP
> + err = L_EOPNOTSUPP;
> + break;
> + case EOPNOTSUPP:
> + err = L_EOPNOTSUPP;
> + break;
> + default:
> + break;
> }
What about a more compact solution like:
switch (err) {
case ENAMETOOLONG: return L_ENAMETOOLONG;
case ENOTEMPTY: return L_ENOTEMPTY;
...
default: return err;
}
Previously I suggested to use an array-solution with designated initializers
instead, but I guess we don't know how high these error numbers could become
on certain systems.
> #else
> #error Missing errno translation to Linux for this host system
>
next prev parent reply other threads:[~2022-11-01 17:06 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-24 4:57 [PATCH 00/16] hw/9pfs: Add 9pfs support for Windows Bin Meng
2022-10-24 4:57 ` [PATCH 01/16] qemu/xattr.h: Exclude <sys/xattr.h> " Bin Meng
2022-10-24 4:57 ` [PATCH 02/16] hw/9pfs: Drop unnecessary *xattr wrapper API declarations Bin Meng
2022-10-24 4:57 ` [PATCH 03/16] hw/9pfs: Replace the direct call to xxxat() APIs with a wrapper Bin Meng
2022-10-24 4:57 ` [PATCH 04/16] hw/9pfs: Introduce an opaque type 9P_FILE_ID Bin Meng
2022-11-01 13:55 ` Christian Schoenebeck
2022-10-24 4:57 ` [PATCH 05/16] hw/9pfs: Update P9_FILE_ID to support Windows Bin Meng
2022-10-24 4:57 ` [PATCH 06/16] hw/9pfs: Add missing definitions for Windows Bin Meng
2022-10-24 4:57 ` [PATCH 07/16] hw/9pfs: Implement Windows specific utilities functions for 9pfs Bin Meng
2022-11-01 14:27 ` Christian Schoenebeck
2022-11-01 15:13 ` Shi, Guohuai
2022-11-01 15:20 ` Shi, Guohuai
2022-11-01 18:22 ` Christian Schoenebeck
2022-11-02 3:07 ` Shi, Guohuai
2022-11-02 11:05 ` Christian Schoenebeck
2022-11-02 11:28 ` Shi, Guohuai
2022-11-02 11:51 ` Christian Schoenebeck
2022-11-02 12:06 ` Christian Schoenebeck
2022-10-24 4:57 ` [PATCH 08/16] hw/9pfs: Handle current directory offset for Windows Bin Meng
2022-11-01 14:41 ` Christian Schoenebeck
2022-10-24 4:57 ` [PATCH 09/16] hw/9pfs: Disable unsupported flags and features " Bin Meng
2022-11-01 15:04 ` Christian Schoenebeck
2022-11-01 15:34 ` Shi, Guohuai
2022-11-01 18:59 ` Christian Schoenebeck
2022-11-02 3:44 ` Shi, Guohuai
2022-11-02 11:34 ` Christian Schoenebeck
2022-11-02 12:19 ` Shi, Guohuai
2022-10-24 4:57 ` [PATCH 10/16] hw/9pfs: Update the local fs driver to support Windows Bin Meng
2022-10-24 4:57 ` [PATCH 11/16] hw/9pfs: Add Linux error number definition Bin Meng
2022-11-01 15:21 ` Christian Schoenebeck [this message]
2022-10-24 4:57 ` [PATCH 12/16] hw/9pfs: Translate Windows errno to Linux value Bin Meng
2022-10-24 4:57 ` [PATCH 13/16] fsdev: Disable proxy fs driver on Windows Bin Meng
2022-10-24 4:57 ` [PATCH 14/16] hw/9pfs: Update synth fs driver for Windows Bin Meng
2022-10-24 4:57 ` [PATCH 15/16] tests/qtest: virtio-9p-test: Adapt the case for win32 Bin Meng
2022-10-25 15:55 ` Thomas Huth
2022-11-01 15:32 ` Christian Schoenebeck
2022-10-24 4:57 ` [PATCH 16/16] meson.build: Turn on virtfs for Windows Bin Meng
2022-10-27 16:19 ` [PATCH 00/16] hw/9pfs: Add 9pfs support " Bin Meng
2022-10-27 16:30 ` Christian Schoenebeck
2022-10-28 2:25 ` Bin Meng
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=3980771.K8829Pglg3@silver \
--to=qemu_oss@crudebyte.com \
--cc=bin.meng@windriver.com \
--cc=groug@kaod.org \
--cc=guohuai.shi@windriver.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).