qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] [WIP] [RFC ]Add initial 9pfs support for Win


From: Greg Kurz
Subject: Re: [Qemu-devel] [PATCH v2] [WIP] [RFC ]Add initial 9pfs support for Windows hosts v2
Date: Thu, 14 Apr 2016 21:17:01 +0200

Hi Michael,

I have some more comments that should end up in a preliminary patch.

Cheers.

--
Greg

On Tue, 12 Apr 2016 09:52:00 +0200
Michael Fritscher <address@hidden> wrote:

> It was tested on Windows & Linux hosts, on the later no obvious regressions 
> could be found. The guest was a Knoppix 7.6.0 live cd.
> 
> This is WIP and a RFC - it isn't meant to be upstreamed yet. The error_printf 
> are only for debugging and will be deleted in the final patch.
> 
> There are some comments with "mifritscher" - I'm not quite sure how to handle 
> these problems (e.g. on mingw, this in 32 bit, while on Linux this is 16 bit 
> and so on). Additionally, some places from which I suspect problems are 
> marked with a #warning.
> 
> Changes against v1:
>   * fixed open (added binary flag) -> read/write is fine now, file
> creation was fixed as well
>   * added inode calculation using own crude hash algorithm
>   * fixed xattr returning -1  + EOPNOTSUP -> fixes e.g. executing files
>   * fixed unlinkat / remove für directories by trying rmdir as well
>   * prepend 777 mode on files (for executing)
> 
> What does work:
>   * reading/writing "big" files (5MB, verified with md5sum)
>   * creating files
>   * executing files
>   * mkdir
>   * rm / rmdir
>   * cp files
>   * running gcc
>   * cp first 250 files & directories from /etc
>   * tar it from and to the 9p mount
>   * create a 100 MB swap file and do a mkswap on it
> 
> What does not work:
>   * swapon - no real surprise (doesn't work on Linux as well - with the same 
> error message) ;-) (swapon returns -1 EINVAL)
>   * link / symlink (there is no real aequivalent for this on windows)
>   * mknod (dito)
>   * chown (dito - prepend success for compatibility)
> 
> State of v1:
> What works:
>    * mount
>    * stat
>    * chdir
>    * readdir (aka ls)
>    * read of small files (<10k)
>    * overwrite
> 
> What does not work:
>    * create new files (in 90% problems with path handling (old path occurs)
>    * read / probably write big files
> 
> 
> Signed-off-by: Michael Fritscher <address@hidden>
> ---
> On https://github.com/mifritscher/qemu/tree/9pfs_windows is a git tree with 
> the patch.
> 
> I gave a shot at xattr (try to include xattr stuff) but it ended up even more 
> #ifdefs. So I gave up at this.
> Now I'm waiting on comments etc. If there are no big objections, I'll remove 
> the debug output and make a patch which is meant for upstreaming.
> 
> Thanks to everybody which helped me!
> 
>  Makefile.objs              |   1 +
>  configure                  |  15 ++-
>  fsdev/9p-iov-marshal.c     |   2 +
>  fsdev/9p-marshal.c         |   4 +-
>  fsdev/file-op-9p.h         |  35 ++++-
>  fsdev/qemu-fsdev.c         |   2 +
>  hw/9pfs/9p-local.c         | 326 
> +++++++++++++++++++++++++++++++++++++++++----
>  hw/9pfs/9p-synth.c         |  10 +-
>  hw/9pfs/9p.c               | 102 +++++++++++++-
>  hw/9pfs/9p.h               |  70 +++++++++-
>  hw/9pfs/Makefile.objs      |   7 +-
>  hw/9pfs/codir.c            |  31 +++++
>  hw/9pfs/cofile.c           |  15 +++
>  hw/9pfs/cofs.c             |  15 +++
>  hw/9pfs/coxattr.c          |   6 +
>  hw/9pfs/virtio-9p-device.c |   4 +-
>  16 files changed, 600 insertions(+), 45 deletions(-)
> 
> diff --git a/Makefile.objs b/Makefile.objs
> index 8f705f6..6fd02bc 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -48,6 +48,7 @@ common-obj-$(CONFIG_WIN32) += os-win32.o
>  common-obj-$(CONFIG_POSIX) += os-posix.o
> 
>  common-obj-$(CONFIG_LINUX) += fsdev/
> +common-obj-$(CONFIG_WIN32) += fsdev/
> 
>  common-obj-y += migration/
>  common-obj-y += qemu-char.o #aio.o
> diff --git a/configure b/configure
> index 5db29f0..a4797c3 100755
> --- a/configure
> +++ b/configure
> @@ -4566,12 +4566,21 @@ if test "$want_tools" = "yes" ; then
>  fi
>  if test "$softmmu" = yes ; then
>    if test "$virtfs" != no ; then
> -    if test "$cap" = yes && test "$linux" = yes && test "$attr" = yes ; then
> +    if test "$linux" = yes ; then
> +      if test "$cap" = yes  && test "$attr" = yes ; then
> +        virtfs=yes
> +        tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
> +      else
> +        if test "$virtfs" = yes; then
> +          error_exit "VirtFS requires libcap-devel and libattr-devel on 
> Linux"
> +        fi
> +        virtfs=no
> +      fi
> +    elif test "$mingw32" = yes; then
>        virtfs=yes
> -      tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
>      else
>        if test "$virtfs" = yes; then
> -        error_exit "VirtFS is supported only on Linux and requires 
> libcap-devel and libattr-devel"
> +        error_exit "VirtFS is only supported on Linux or Windows"
>        fi
>        virtfs=no
>      fi
> diff --git a/fsdev/9p-iov-marshal.c b/fsdev/9p-iov-marshal.c
> index fb40bdf..1a292c6 100644
> --- a/fsdev/9p-iov-marshal.c
> +++ b/fsdev/9p-iov-marshal.c
> @@ -15,7 +15,9 @@
>  #include <glib.h>
>  #include <glib/gprintf.h>
>  #include <utime.h>
> +#ifndef _WIN32
>  #include <sys/uio.h>
> +#endif
> 
>  #include "9p-iov-marshal.h"
>  #include "qemu/bswap.h"
> diff --git a/fsdev/9p-marshal.c b/fsdev/9p-marshal.c
> index 183d366..081cb88 100644
> --- a/fsdev/9p-marshal.c
> +++ b/fsdev/9p-marshal.c
> @@ -16,7 +16,9 @@
>  #include <glib/gprintf.h>
>  #include <dirent.h>
>  #include <utime.h>
> -#include <sys/uio.h>
> +#ifndef WIN32
> +    #include <sys/uio.h>
> +#endif
> 
>  #include "9p-marshal.h"
> 
> diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h
> index b8c2602..446c6a5 100644
> --- a/fsdev/file-op-9p.h
> +++ b/fsdev/file-op-9p.h
> @@ -14,12 +14,43 @@
>  #define _FILEOP_H
>  #include <dirent.h>
>  #include <utime.h>
> -#include <sys/uio.h>
> -#include <sys/vfs.h>
> +#ifndef _WIN32
> +    #include <sys/uio.h>
> +    #include <sys/vfs.h>

This should be included by include/sysemu/os-posix.h, and you just need to add 
a 
forward declaration for struct statfs before struct FileOperations somewhere 
below.

> +#endif
> 
>  #define SM_LOCAL_MODE_BITS    0600
>  #define SM_LOCAL_DIR_MODE_BITS    0700
> 
> +#ifdef _WIN32
> +typedef uint32_t uid_t;
> +typedef uint32_t gid_t;
> +
> +/* from http://man7.org/linux/man-pages/man2/statfs.2.html */
> +typedef uint32_t __fsword_t;
> +typedef uint32_t fsblkcnt_t;
> +typedef uint32_t fsfilcnt_t;
> +
> +/* from linux/include/uapi/asm-generic/posix_types.h */
> +typedef struct {
> +        long    __val[2];
> +} fsid_t;
> +
> +struct statfs {
> +    __fsword_t f_type;
> +    __fsword_t f_bsize;
> +    fsblkcnt_t f_blocks;
> +    fsblkcnt_t f_bfree;
> +    fsblkcnt_t f_bavail;
> +    fsfilcnt_t f_files;
> +    fsfilcnt_t f_ffree;
> +    fsid_t f_fsid;
> +    __fsword_t f_namelen;
> +    __fsword_t f_frsize;
> +    __fsword_t f_flags;
> +};

All this block belongs to include/sysemu/os-win32.h.

> +#endif
> +




reply via email to

[Prev in Thread] Current Thread [Next in Thread]