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 09/16] hw/9pfs: Disable unsupported flags and features for Windows
Date: Tue, 01 Nov 2022 16:04:10 +0100 [thread overview]
Message-ID: <2442661.hKK5dv67Mp@silver> (raw)
In-Reply-To: <20221024045759.448014-10-bin.meng@windriver.com>
On Monday, October 24, 2022 6:57:52 AM CET Bin Meng wrote:
> From: Guohuai Shi <guohuai.shi@windriver.com>
>
> Some flags and features are not supported on Windows, like mknod,
> readlink, file mode, etc. Update the codes for Windows.
>
> Signed-off-by: Guohuai Shi <guohuai.shi@windriver.com>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> hw/9pfs/9p-util.h | 6 +++-
> hw/9pfs/9p.c | 90 ++++++++++++++++++++++++++++++++++++++++++-----
> 2 files changed, 86 insertions(+), 10 deletions(-)
>
> diff --git a/hw/9pfs/9p-util.h b/hw/9pfs/9p-util.h
> index 82b2d0c3e4..3d154e9103 100644
> --- a/hw/9pfs/9p-util.h
> +++ b/hw/9pfs/9p-util.h
> @@ -53,8 +53,10 @@ static inline uint64_t makedev_dotl(uint32_t dev_major, uint32_t dev_minor)
> */
> static inline uint64_t host_dev_to_dotl_dev(dev_t dev)
> {
> -#ifdef CONFIG_LINUX
> +#if defined(CONFIG_LINUX)
> return dev;
> +#elif defined(CONFIG_WIN32)
> + return 0;
Really?
> #else
> return makedev_dotl(major(dev), minor(dev));
> #endif
> @@ -260,7 +262,9 @@ static inline struct dirent *qemu_dirent_dup(struct dirent *dent)
> #if defined CONFIG_DARWIN && defined CONFIG_PTHREAD_FCHDIR_NP
> int pthread_fchdir_np(int fd) __attribute__((weak_import));
> #endif
> +#ifndef CONFIG_WIN32
> int qemu_mknodat(P9_FILE_ID dirfd, const char *filename, mode_t mode,
> dev_t dev);
> +#endif
>
> #endif
> diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
> index 6c4af86240..771aab34ac 100644
> --- a/hw/9pfs/9p.c
> +++ b/hw/9pfs/9p.c
> @@ -39,6 +39,11 @@
> #include "qemu/xxhash.h"
> #include <math.h>
>
> +#ifdef CONFIG_WIN32
> +#define UTIME_NOW ((1l << 30) - 1l)
> +#define UTIME_OMIT ((1l << 30) - 2l)
> +#endif
> +
> int open_fd_hw;
> int total_open_fd;
> static int open_fd_rc;
> @@ -132,13 +137,17 @@ static int dotl_to_open_flags(int flags)
> DotlOpenflagMap dotl_oflag_map[] = {
> { P9_DOTL_CREATE, O_CREAT },
> { P9_DOTL_EXCL, O_EXCL },
> +#ifndef CONFIG_WIN32
> { P9_DOTL_NOCTTY , O_NOCTTY },
> +#endif
> { P9_DOTL_TRUNC, O_TRUNC },
> { P9_DOTL_APPEND, O_APPEND },
> +#ifndef CONFIG_WIN32
> { P9_DOTL_NONBLOCK, O_NONBLOCK } ,
> { P9_DOTL_DSYNC, O_DSYNC },
> { P9_DOTL_FASYNC, FASYNC },
> -#ifndef CONFIG_DARWIN
> +#endif
> +#ifdef CONFIG_LINUX
Better
#if !defined(CONFIG_DARWIN) && !defined(CONFIG_WIN32)
Otherwise it might automatically opt-out other future platforms
unintentionally.
> { P9_DOTL_NOATIME, O_NOATIME },
> /*
> * On Darwin, we could map to F_NOCACHE, which is
> @@ -151,8 +160,10 @@ static int dotl_to_open_flags(int flags)
> #endif
> { P9_DOTL_LARGEFILE, O_LARGEFILE },
> { P9_DOTL_DIRECTORY, O_DIRECTORY },
> +#ifndef CONFIG_WIN32
> { P9_DOTL_NOFOLLOW, O_NOFOLLOW },
> { P9_DOTL_SYNC, O_SYNC },
> +#endif
> };
>
> for (i = 0; i < ARRAY_SIZE(dotl_oflag_map); i++) {
> @@ -179,8 +190,11 @@ static int get_dotl_openflags(V9fsState *s, int oflags)
> * Filter the client open flags
> */
> flags = dotl_to_open_flags(oflags);
> - flags &= ~(O_NOCTTY | O_ASYNC | O_CREAT);
> -#ifndef CONFIG_DARWIN
> + flags &= ~(O_CREAT);
> +#ifndef CONFIG_WIN32
> + flags &= ~(O_NOCTTY | O_ASYNC);
> +#endif
> +#ifdef CONFIG_LINUX
Same as above: better explicitly opt-out than the other way around.
> /*
> * Ignore direct disk access hint until the server supports it.
> */
> @@ -986,9 +1000,11 @@ static int stat_to_qid(V9fsPDU *pdu, const struct stat *stbuf, V9fsQID *qidp)
> if (S_ISDIR(stbuf->st_mode)) {
> qidp->type |= P9_QID_TYPE_DIR;
> }
> +#ifndef CONFIG_WIN32
> if (S_ISLNK(stbuf->st_mode)) {
> qidp->type |= P9_QID_TYPE_SYMLINK;
> }
> +#endif
>
> return 0;
> }
> @@ -1097,6 +1113,7 @@ static mode_t v9mode_to_mode(uint32_t mode, V9fsString *extension)
> ret |= S_IFDIR;
> }
>
> +#ifndef CONFIG_WIN32
> if (mode & P9_STAT_MODE_SYMLINK) {
> ret |= S_IFLNK;
> }
> @@ -1106,6 +1123,7 @@ static mode_t v9mode_to_mode(uint32_t mode, V9fsString *extension)
> if (mode & P9_STAT_MODE_NAMED_PIPE) {
> ret |= S_IFIFO;
> }
> +#endif
> if (mode & P9_STAT_MODE_DEVICE) {
> if (extension->size && extension->data[0] == 'c') {
> ret |= S_IFCHR;
> @@ -1118,6 +1136,7 @@ static mode_t v9mode_to_mode(uint32_t mode, V9fsString *extension)
> ret |= S_IFREG;
> }
>
> +#ifndef CONFIG_WIN32
> if (mode & P9_STAT_MODE_SETUID) {
> ret |= S_ISUID;
> }
> @@ -1127,6 +1146,7 @@ static mode_t v9mode_to_mode(uint32_t mode, V9fsString *extension)
> if (mode & P9_STAT_MODE_SETVTX) {
> ret |= S_ISVTX;
> }
> +#endif
>
> return ret;
> }
> @@ -1182,6 +1202,7 @@ static uint32_t stat_to_v9mode(const struct stat *stbuf)
> mode |= P9_STAT_MODE_DIR;
> }
>
> +#ifndef CONFIG_WIN32
> if (S_ISLNK(stbuf->st_mode)) {
> mode |= P9_STAT_MODE_SYMLINK;
> }
> @@ -1193,11 +1214,13 @@ static uint32_t stat_to_v9mode(const struct stat *stbuf)
> if (S_ISFIFO(stbuf->st_mode)) {
> mode |= P9_STAT_MODE_NAMED_PIPE;
> }
> +#endif
>
> if (S_ISBLK(stbuf->st_mode) || S_ISCHR(stbuf->st_mode)) {
> mode |= P9_STAT_MODE_DEVICE;
> }
>
> +#ifndef CONFIG_WIN32
> if (stbuf->st_mode & S_ISUID) {
> mode |= P9_STAT_MODE_SETUID;
> }
> @@ -1209,6 +1232,7 @@ static uint32_t stat_to_v9mode(const struct stat *stbuf)
> if (stbuf->st_mode & S_ISVTX) {
> mode |= P9_STAT_MODE_SETVTX;
> }
> +#endif
>
> return mode;
> }
> @@ -1247,9 +1271,17 @@ static int coroutine_fn stat_to_v9stat(V9fsPDU *pdu, V9fsPath *path,
> return err;
> }
> } else if (v9stat->mode & P9_STAT_MODE_DEVICE) {
> + unsigned maj, min;
> +
> +#ifndef CONFIG_WIN32
> + maj = major(stbuf->st_rdev);
> + min = minor(stbuf->st_rdev);
> +#else
> + maj = min = 0;
> +#endif
Really?
> v9fs_string_sprintf(&v9stat->extension, "%c %u %u",
> S_ISCHR(stbuf->st_mode) ? 'c' : 'b',
> - major(stbuf->st_rdev), minor(stbuf->st_rdev));
> + maj, min);
> } else if (S_ISDIR(stbuf->st_mode) || S_ISREG(stbuf->st_mode)) {
> v9fs_string_sprintf(&v9stat->extension, "%s %lu",
> "HARDLINKCOUNT", (unsigned long)stbuf->st_nlink);
> @@ -1317,7 +1349,14 @@ static int32_t blksize_to_iounit(const V9fsPDU *pdu, int32_t blksize)
>
> static int32_t stat_to_iounit(const V9fsPDU *pdu, const struct stat *stbuf)
> {
> - return blksize_to_iounit(pdu, stbuf->st_blksize);
> + int32_t blksize;
> +
> +#ifndef CONFIG_WIN32
> + blksize = stbuf->st_blksize);
> +#else
> + blksize = 0;
> +#endif
Really?
> + return blksize_to_iounit(pdu, blksize);
> }
>
> static int stat_to_v9stat_dotl(V9fsPDU *pdu, const struct stat *stbuf,
> @@ -1332,7 +1371,11 @@ static int stat_to_v9stat_dotl(V9fsPDU *pdu, const struct stat *stbuf,
> 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);
> +#ifndef CONFIG_WIN32
> v9lstat->st_blocks = stbuf->st_blocks;
> +#else
> + v9lstat->st_blocks = 0;
> +#endif
Really?
> v9lstat->st_atime_sec = stbuf->st_atime;
> v9lstat->st_mtime_sec = stbuf->st_mtime;
> v9lstat->st_ctime_sec = stbuf->st_ctime;
> @@ -1340,7 +1383,8 @@ static int stat_to_v9stat_dotl(V9fsPDU *pdu, const struct stat *stbuf,
> v9lstat->st_atime_nsec = stbuf->st_atimespec.tv_nsec;
> v9lstat->st_mtime_nsec = stbuf->st_mtimespec.tv_nsec;
> v9lstat->st_ctime_nsec = stbuf->st_ctimespec.tv_nsec;
> -#else
> +#endif
> +#ifdef CONFIG_LINUX
> v9lstat->st_atime_nsec = stbuf->st_atim.tv_nsec;
> v9lstat->st_mtime_nsec = stbuf->st_mtim.tv_nsec;
> v9lstat->st_ctime_nsec = stbuf->st_ctim.tv_nsec;
> @@ -2471,6 +2515,7 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp,
> struct dirent *dent;
> struct stat *st;
> struct V9fsDirEnt *entries = NULL;
> + unsigned char d_type = 0;
>
> /*
> * inode remapping requires the device id, which in turn might be
> @@ -2540,10 +2585,13 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp,
> v9fs_string_init(&name);
> v9fs_string_sprintf(&name, "%s", dent->d_name);
>
> +#ifndef CONFIG_WIN32
> + d_type = dent->d_type;
> +#endif
> /* 11 = 7 + 4 (7 = start offset, 4 = space for storing count) */
> len = pdu_marshal(pdu, 11 + count, "Qqbs",
> &qid, off,
> - dent->d_type, &name);
> + d_type, &name);
Are you saying that d_type is not initialized with zero already?
> v9fs_string_free(&name);
>
> @@ -2873,8 +2921,12 @@ static void coroutine_fn v9fs_create(void *opaque)
> }
>
> nmode |= perm & 0777;
> +#ifndef CONFIG_WIN32
> err = v9fs_co_mknod(pdu, fidp, &name, fidp->uid, -1,
> makedev(major, minor), nmode, &stbuf);
> +#else
> + err = -ENOTSUP;
> +#endif
> if (err < 0) {
> goto out;
> }
> @@ -2899,8 +2951,12 @@ static void coroutine_fn v9fs_create(void *opaque)
> v9fs_path_copy(&fidp->path, &path);
> v9fs_path_unlock(s);
> } else if (perm & P9_STAT_MODE_SOCKET) {
> +#ifndef CONFIG_WIN32
> err = v9fs_co_mknod(pdu, fidp, &name, fidp->uid, -1,
> 0, S_IFSOCK | (perm & 0777), &stbuf);
> +#else
> + err = -ENOTSUP;
> +#endif
As with previous patches, I would consider making the user aware to use
mapped(-xattr) with something like error_report_once().
> if (err < 0) {
> goto out;
> }
> @@ -3634,7 +3690,7 @@ out_nofid:
>
> static void coroutine_fn v9fs_mknod(void *opaque)
> {
> -
> +#ifndef CONFIG_WIN32
> int mode;
> gid_t gid;
> int32_t fid;
> @@ -3691,6 +3747,10 @@ out:
> out_nofid:
> pdu_complete(pdu, err);
> v9fs_string_free(&name);
> +#else
> + V9fsPDU *pdu = opaque;
> + pdu_complete(pdu, -1);
> +#endif
> }
>
> /*
> @@ -3963,7 +4023,7 @@ out_nofid:
> #if defined(CONFIG_LINUX)
> /* Currently, only Linux has XATTR_SIZE_MAX */
> #define P9_XATTR_SIZE_MAX XATTR_SIZE_MAX
> -#elif defined(CONFIG_DARWIN)
> +#elif defined(CONFIG_DARWIN) || defined(CONFIG_WIN32)
> /*
> * Darwin doesn't seem to define a maximum xattr size in its user
> * space header, so manually configure it across platforms as 64k.
> @@ -3980,6 +4040,7 @@ out_nofid:
>
> static void coroutine_fn v9fs_xattrcreate(void *opaque)
> {
> +#ifndef CONFIG_WIN32
> int flags, rflags = 0;
> int32_t fid;
> uint64_t size;
> @@ -4041,10 +4102,15 @@ out_put_fid:
> out_nofid:
> pdu_complete(pdu, err);
> v9fs_string_free(&name);
> +#else
> + V9fsPDU *pdu = opaque;
> + pdu_complete(pdu, -1);
> +#endif
> }
>
> static void coroutine_fn v9fs_readlink(void *opaque)
> {
> +#ifndef CONFIG_WIN32
> V9fsPDU *pdu = opaque;
> size_t offset = 7;
> V9fsString target;
> @@ -4080,6 +4146,10 @@ out:
> put_fid(pdu, fidp);
> out_nofid:
> pdu_complete(pdu, err);
> +#else
> + V9fsPDU *pdu = opaque;
> + pdu_complete(pdu, -1);
> +#endif
Unnecessary double declaration of pdu.
> }
>
> static CoroutineEntry *pdu_co_handlers[] = {
> @@ -4341,6 +4411,7 @@ void v9fs_reset(V9fsState *s)
>
> static void __attribute__((__constructor__)) v9fs_set_fd_limit(void)
> {
> +#ifndef CONFIG_WIN32
> struct rlimit rlim;
> if (getrlimit(RLIMIT_NOFILE, &rlim) < 0) {
> error_report("Failed to get the resource limit");
> @@ -4348,4 +4419,5 @@ static void __attribute__((__constructor__)) v9fs_set_fd_limit(void)
> }
> open_fd_hw = rlim.rlim_cur - MIN(400, rlim.rlim_cur / 3);
> open_fd_rc = rlim.rlim_cur / 2;
> +#endif
Really?
> }
>
next prev parent reply other threads:[~2022-11-01 17:11 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 [this message]
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
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=2442661.hKK5dv67Mp@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).