From fe52840c8760122257be7b7e4893dd951480a71f Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 17:57:30 +0000 Subject: [PATCH 01/25] 9pfs: rename virtio-9p-coth.{c,h} to coth.{c,h} Those two files are not virtio specific. Rename them to use generic names. Fix includes in various C files. Change define guards and comments in header files. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/Makefile.objs | 2 +- hw/9pfs/codir.c | 2 +- hw/9pfs/cofile.c | 2 +- hw/9pfs/cofs.c | 2 +- hw/9pfs/{virtio-9p-coth.c => coth.c} | 4 ++-- hw/9pfs/{virtio-9p-coth.h => coth.h} | 6 +++--- hw/9pfs/coxattr.c | 2 +- hw/9pfs/virtio-9p-device.c | 2 +- hw/9pfs/virtio-9p.c | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) rename hw/9pfs/{virtio-9p-coth.c => coth.c} (95%) rename hw/9pfs/{virtio-9p-coth.h => coth.h} (98%) diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index 1e9b595cb4..76dadbe1f2 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -1,7 +1,7 @@ common-obj-y = virtio-9p.o common-obj-y += virtio-9p-local.o virtio-9p-xattr.o common-obj-y += virtio-9p-xattr-user.o virtio-9p-posix-acl.o -common-obj-y += virtio-9p-coth.o cofs.o codir.o cofile.o +common-obj-y += coth.o cofs.o codir.o cofile.o common-obj-y += coxattr.o virtio-9p-synth.o common-obj-$(CONFIG_OPEN_BY_HANDLE) += virtio-9p-handle.o common-obj-y += virtio-9p-proxy.o diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c index ec9cc7fb27..5a4f74d3e0 100644 --- a/hw/9pfs/codir.c +++ b/hw/9pfs/codir.c @@ -15,7 +15,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu/thread.h" #include "qemu/coroutine.h" -#include "virtio-9p-coth.h" +#include "coth.h" int v9fs_co_readdir_r(V9fsPDU *pdu, V9fsFidState *fidp, struct dirent *dent, struct dirent **result) diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c index 7cb55ee93a..893df2c422 100644 --- a/hw/9pfs/cofile.c +++ b/hw/9pfs/cofile.c @@ -15,7 +15,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu/thread.h" #include "qemu/coroutine.h" -#include "virtio-9p-coth.h" +#include "coth.h" int v9fs_co_st_gen(V9fsPDU *pdu, V9fsPath *path, mode_t st_mode, V9fsStatDotl *v9stat) diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c index e1953a9aa1..7b4202bd77 100644 --- a/hw/9pfs/cofs.c +++ b/hw/9pfs/cofs.c @@ -15,7 +15,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu/thread.h" #include "qemu/coroutine.h" -#include "virtio-9p-coth.h" +#include "coth.h" static ssize_t __readlink(V9fsState *s, V9fsPath *path, V9fsString *buf) { diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/coth.c similarity index 95% rename from hw/9pfs/virtio-9p-coth.c rename to hw/9pfs/coth.c index ab9425c60f..56772d66be 100644 --- a/hw/9pfs/virtio-9p-coth.c +++ b/hw/9pfs/coth.c @@ -1,5 +1,5 @@ /* - * Virtio 9p backend + * 9p backend * * Copyright IBM, Corp. 2010 * @@ -16,7 +16,7 @@ #include "block/thread-pool.h" #include "qemu/coroutine.h" #include "qemu/main-loop.h" -#include "virtio-9p-coth.h" +#include "coth.h" /* Called from QEMU I/O thread. */ static void coroutine_enter_cb(void *opaque, int ret) diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/coth.h similarity index 98% rename from hw/9pfs/virtio-9p-coth.h rename to hw/9pfs/coth.h index 4ac1aaf902..209fc6a9af 100644 --- a/hw/9pfs/virtio-9p-coth.h +++ b/hw/9pfs/coth.h @@ -1,5 +1,5 @@ /* - * Virtio 9p backend + * 9p backend * * Copyright IBM, Corp. 2010 * @@ -12,8 +12,8 @@ * */ -#ifndef _QEMU_VIRTIO_9P_COTH_H -#define _QEMU_VIRTIO_9P_COTH_H +#ifndef _QEMU_9P_COTH_H +#define _QEMU_9P_COTH_H #include "qemu/thread.h" #include "qemu/coroutine.h" diff --git a/hw/9pfs/coxattr.c b/hw/9pfs/coxattr.c index 55c0d231cb..0590cbf5c7 100644 --- a/hw/9pfs/coxattr.c +++ b/hw/9pfs/coxattr.c @@ -15,7 +15,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu/thread.h" #include "qemu/coroutine.h" -#include "virtio-9p-coth.h" +#include "coth.h" int v9fs_co_llistxattr(V9fsPDU *pdu, V9fsPath *path, void *value, size_t size) { diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index b42d3b30a0..667b54aeb8 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -18,7 +18,7 @@ #include "virtio-9p.h" #include "fsdev/qemu-fsdev.h" #include "virtio-9p-xattr.h" -#include "virtio-9p-coth.h" +#include "coth.h" #include "hw/virtio/virtio-access.h" static uint64_t virtio_9p_get_features(VirtIODevice *vdev, uint64_t features, diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index f972731f5a..0f178dec32 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -19,7 +19,7 @@ #include "virtio-9p.h" #include "fsdev/qemu-fsdev.h" #include "virtio-9p-xattr.h" -#include "virtio-9p-coth.h" +#include "coth.h" #include "trace.h" #include "migration/migration.h" From 3b9ca04653113dcd0ee033d02bee5509fd856d89 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 18:03:14 +0000 Subject: [PATCH 02/25] 9pfs: rename virtio-9p-handle.c to 9p-handle.c This file is not virtio specific. Rename it to use generic name. Fix comment and remove unneeded inclusion of virtio.h. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/{virtio-9p-handle.c => 9p-handle.c} | 3 +-- hw/9pfs/Makefile.objs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename hw/9pfs/{virtio-9p-handle.c => 9p-handle.c} (99%) diff --git a/hw/9pfs/virtio-9p-handle.c b/hw/9pfs/9p-handle.c similarity index 99% rename from hw/9pfs/virtio-9p-handle.c rename to hw/9pfs/9p-handle.c index 13eabb98a4..a48dbc9e8d 100644 --- a/hw/9pfs/virtio-9p-handle.c +++ b/hw/9pfs/9p-handle.c @@ -1,5 +1,5 @@ /* - * Virtio 9p handle callback + * 9p handle callback * * Copyright IBM, Corp. 2011 * @@ -11,7 +11,6 @@ * */ -#include "hw/virtio/virtio.h" #include "virtio-9p.h" #include "virtio-9p-xattr.h" #include diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index 76dadbe1f2..9fdd8a4b09 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -3,7 +3,7 @@ common-obj-y += virtio-9p-local.o virtio-9p-xattr.o common-obj-y += virtio-9p-xattr-user.o virtio-9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o common-obj-y += coxattr.o virtio-9p-synth.o -common-obj-$(CONFIG_OPEN_BY_HANDLE) += virtio-9p-handle.o +common-obj-$(CONFIG_OPEN_BY_HANDLE) += 9p-handle.o common-obj-y += virtio-9p-proxy.o obj-y += virtio-9p-device.o From f00d4f596b1c85cf9449ef4b65fca46148bcc9bb Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 18:05:29 +0000 Subject: [PATCH 03/25] 9pfs: rename virtio-9p-local.c to 9p-local.c This file is not virtio specific. Rename it to use generic name. Fix comment and remove unneeded inclusion of virtio.h. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/{virtio-9p-local.c => 9p-local.c} | 3 +-- hw/9pfs/Makefile.objs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename hw/9pfs/{virtio-9p-local.c => 9p-local.c} (99%) diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/9p-local.c similarity index 99% rename from hw/9pfs/virtio-9p-local.c rename to hw/9pfs/9p-local.c index f1f2e2573b..877ad86c7a 100644 --- a/hw/9pfs/virtio-9p-local.c +++ b/hw/9pfs/9p-local.c @@ -1,5 +1,5 @@ /* - * Virtio 9p Posix callback + * 9p Posix callback * * Copyright IBM, Corp. 2010 * @@ -11,7 +11,6 @@ * */ -#include "hw/virtio/virtio.h" #include "virtio-9p.h" #include "virtio-9p-xattr.h" #include "fsdev/qemu-fsdev.h" /* local_ops */ diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index 9fdd8a4b09..5059681875 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -1,5 +1,5 @@ common-obj-y = virtio-9p.o -common-obj-y += virtio-9p-local.o virtio-9p-xattr.o +common-obj-y += 9p-local.o virtio-9p-xattr.o common-obj-y += virtio-9p-xattr-user.o virtio-9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o common-obj-y += coxattr.o virtio-9p-synth.o From d57b78002cd1a32f8382fc818da3940df69ff81a Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 18:10:47 +0000 Subject: [PATCH 04/25] 9pfs: rename virtio-9p-posix-acl.c to 9p-posix-acl.c This file is not virtio specific. Rename it to use generic name. Fix comment and remove unneeded inclusion of virtio.h. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/{virtio-9p-posix-acl.c => 9p-posix-acl.c} | 3 +-- hw/9pfs/Makefile.objs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) rename hw/9pfs/{virtio-9p-posix-acl.c => 9p-posix-acl.c} (98%) diff --git a/hw/9pfs/virtio-9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c similarity index 98% rename from hw/9pfs/virtio-9p-posix-acl.c rename to hw/9pfs/9p-posix-acl.c index 09dad071e4..1ee7bdc807 100644 --- a/hw/9pfs/virtio-9p-posix-acl.c +++ b/hw/9pfs/9p-posix-acl.c @@ -1,5 +1,5 @@ /* - * Virtio 9p system.posix* xattr callback + * 9p system.posix* xattr callback * * Copyright IBM, Corp. 2010 * @@ -13,7 +13,6 @@ #include #include "qemu/xattr.h" -#include "hw/virtio/virtio.h" #include "virtio-9p.h" #include "fsdev/file-op-9p.h" #include "virtio-9p-xattr.h" diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index 5059681875..0721462d88 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -1,6 +1,6 @@ common-obj-y = virtio-9p.o common-obj-y += 9p-local.o virtio-9p-xattr.o -common-obj-y += virtio-9p-xattr-user.o virtio-9p-posix-acl.o +common-obj-y += virtio-9p-xattr-user.o 9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o common-obj-y += coxattr.o virtio-9p-synth.o common-obj-$(CONFIG_OPEN_BY_HANDLE) += 9p-handle.o From 494a8ebe713055d3946183f4b395f85a18b43e9e Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 18:21:14 +0000 Subject: [PATCH 05/25] 9pfs: rename virtio-9p-proxy.{c,h} to 9p-proxy.{c,h} Those two files are not virtio specific. Rename them to use generic names. Fix includes in various C files. Change define guards and comments in header files. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- fsdev/virtfs-proxy-helper.c | 2 +- hw/9pfs/{virtio-9p-proxy.c => 9p-proxy.c} | 5 ++--- hw/9pfs/{virtio-9p-proxy.h => 9p-proxy.h} | 6 +++--- hw/9pfs/Makefile.objs | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) rename hw/9pfs/{virtio-9p-proxy.c => 9p-proxy.c} (99%) rename hw/9pfs/{virtio-9p-proxy.h => 9p-proxy.h} (95%) diff --git a/fsdev/virtfs-proxy-helper.c b/fsdev/virtfs-proxy-helper.c index ad1da0d6f5..77536548d0 100644 --- a/fsdev/virtfs-proxy-helper.c +++ b/fsdev/virtfs-proxy-helper.c @@ -24,7 +24,7 @@ #include "qemu/sockets.h" #include "qemu/xattr.h" #include "virtio-9p-marshal.h" -#include "hw/9pfs/virtio-9p-proxy.h" +#include "hw/9pfs/9p-proxy.h" #include "fsdev/virtio-9p-marshal.h" #define PROGNAME "virtfs-proxy-helper" diff --git a/hw/9pfs/virtio-9p-proxy.c b/hw/9pfs/9p-proxy.c similarity index 99% rename from hw/9pfs/virtio-9p-proxy.c rename to hw/9pfs/9p-proxy.c index 1bc7881f03..67c1fb93f8 100644 --- a/hw/9pfs/virtio-9p-proxy.c +++ b/hw/9pfs/9p-proxy.c @@ -1,5 +1,5 @@ /* - * Virtio 9p Proxy callback + * 9p Proxy callback * * Copyright IBM, Corp. 2011 * @@ -11,11 +11,10 @@ */ #include #include -#include "hw/virtio/virtio.h" #include "virtio-9p.h" #include "qemu/error-report.h" #include "fsdev/qemu-fsdev.h" -#include "virtio-9p-proxy.h" +#include "9p-proxy.h" typedef struct V9fsProxy { int sockfd; diff --git a/hw/9pfs/virtio-9p-proxy.h b/hw/9pfs/9p-proxy.h similarity index 95% rename from hw/9pfs/virtio-9p-proxy.h rename to hw/9pfs/9p-proxy.h index 005c1ad757..56150b948b 100644 --- a/hw/9pfs/virtio-9p-proxy.h +++ b/hw/9pfs/9p-proxy.h @@ -1,5 +1,5 @@ /* - * Virtio 9p Proxy callback + * 9p Proxy callback * * Copyright IBM, Corp. 2011 * @@ -9,8 +9,8 @@ * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. */ -#ifndef _QEMU_VIRTIO_9P_PROXY_H -#define _QEMU_VIRTIO_9P_PROXY_H +#ifndef _QEMU_9P_PROXY_H +#define _QEMU_9P_PROXY_H #define PROXY_MAX_IO_SZ (64 * 1024) #define V9FS_FD_VALID INT_MAX diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index 0721462d88..cd5d146a24 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -4,6 +4,6 @@ common-obj-y += virtio-9p-xattr-user.o 9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o common-obj-y += coxattr.o virtio-9p-synth.o common-obj-$(CONFIG_OPEN_BY_HANDLE) += 9p-handle.o -common-obj-y += virtio-9p-proxy.o +common-obj-y += 9p-proxy.o obj-y += virtio-9p-device.o From 364031f17932814484657e5551ba12957d993d7e Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 18:25:29 +0000 Subject: [PATCH 06/25] 9pfs: rename virtio-9p-synth.{c,h} to 9p-synth.{c,h} These two files are not virtio specific. Rename them to use generic names. Fix includes in various C files. Change define guards and comments in header files. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/{virtio-9p-synth.c => 9p-synth.c} | 2 +- hw/9pfs/{virtio-9p-synth.h => 9p-synth.h} | 6 +++--- hw/9pfs/Makefile.objs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename hw/9pfs/{virtio-9p-synth.c => 9p-synth.c} (99%) rename hw/9pfs/{virtio-9p-synth.h => 9p-synth.h} (94%) diff --git a/hw/9pfs/virtio-9p-synth.c b/hw/9pfs/9p-synth.c similarity index 99% rename from hw/9pfs/virtio-9p-synth.c rename to hw/9pfs/9p-synth.c index a0ab9a86a9..6d34b89eef 100644 --- a/hw/9pfs/virtio-9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -16,7 +16,7 @@ #include "virtio-9p.h" #include "virtio-9p-xattr.h" #include "fsdev/qemu-fsdev.h" -#include "virtio-9p-synth.h" +#include "9p-synth.h" #include "qemu/rcu.h" #include "qemu/rcu_queue.h" #include diff --git a/hw/9pfs/virtio-9p-synth.h b/hw/9pfs/9p-synth.h similarity index 94% rename from hw/9pfs/virtio-9p-synth.h rename to hw/9pfs/9p-synth.h index ab05a8e78c..eaf5a0c293 100644 --- a/hw/9pfs/virtio-9p-synth.h +++ b/hw/9pfs/9p-synth.h @@ -1,5 +1,5 @@ /* - * Virtio 9p + * 9p * * Copyright IBM, Corp. 2011 * @@ -10,8 +10,8 @@ * the COPYING file in the top-level directory. * */ -#ifndef HW_9PFS_VIRTIO9P_SYNTH_H -#define HW_9PFS_VIRTIO9P_SYNTH_H 1 +#ifndef HW_9PFS_SYNTH_H +#define HW_9PFS_SYNTH_H 1 #include #include diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index cd5d146a24..ba62571d57 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -2,7 +2,7 @@ common-obj-y = virtio-9p.o common-obj-y += 9p-local.o virtio-9p-xattr.o common-obj-y += virtio-9p-xattr-user.o 9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o -common-obj-y += coxattr.o virtio-9p-synth.o +common-obj-y += coxattr.o 9p-synth.o common-obj-$(CONFIG_OPEN_BY_HANDLE) += 9p-handle.o common-obj-y += 9p-proxy.o From 267ae092e211f4f5ffe2340b7f869fcab3c5c027 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Nov 2015 18:31:52 +0000 Subject: [PATCH 07/25] 9pfs: rename virtio-9p-xattr{,-user}.{c,h} to 9p-xattr{,-user}.{c,h} These three files are not virtio specific. Rename them to generic names. Fix comments and header inclusion in various files. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/9p-handle.c | 2 +- hw/9pfs/9p-local.c | 2 +- hw/9pfs/9p-posix-acl.c | 2 +- hw/9pfs/9p-synth.c | 2 +- hw/9pfs/{virtio-9p-xattr-user.c => 9p-xattr-user.c} | 5 ++--- hw/9pfs/{virtio-9p-xattr.c => 9p-xattr.c} | 5 ++--- hw/9pfs/{virtio-9p-xattr.h => 9p-xattr.h} | 6 +++--- hw/9pfs/Makefile.objs | 4 ++-- hw/9pfs/virtio-9p-device.c | 2 +- hw/9pfs/virtio-9p.c | 2 +- 10 files changed, 15 insertions(+), 17 deletions(-) rename hw/9pfs/{virtio-9p-xattr-user.c => 9p-xattr-user.c} (97%) rename hw/9pfs/{virtio-9p-xattr.c => 9p-xattr.c} (97%) rename hw/9pfs/{virtio-9p-xattr.h => 9p-xattr.h} (97%) diff --git a/hw/9pfs/9p-handle.c b/hw/9pfs/9p-handle.c index a48dbc9e8d..51a9d15fee 100644 --- a/hw/9pfs/9p-handle.c +++ b/hw/9pfs/9p-handle.c @@ -12,7 +12,7 @@ */ #include "virtio-9p.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" #include #include #include diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c index 877ad86c7a..ac553e0db7 100644 --- a/hw/9pfs/9p-local.c +++ b/hw/9pfs/9p-local.c @@ -12,7 +12,7 @@ */ #include "virtio-9p.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" #include "fsdev/qemu-fsdev.h" /* local_ops */ #include #include diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c index 1ee7bdc807..073af39983 100644 --- a/hw/9pfs/9p-posix-acl.c +++ b/hw/9pfs/9p-posix-acl.c @@ -15,7 +15,7 @@ #include "qemu/xattr.h" #include "virtio-9p.h" #include "fsdev/file-op-9p.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" #define MAP_ACL_ACCESS "user.virtfs.system.posix_acl_access" #define MAP_ACL_DEFAULT "user.virtfs.system.posix_acl_default" diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index 6d34b89eef..b1064e3aea 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -14,7 +14,7 @@ #include "hw/virtio/virtio.h" #include "virtio-9p.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" #include "fsdev/qemu-fsdev.h" #include "9p-synth.h" #include "qemu/rcu.h" diff --git a/hw/9pfs/virtio-9p-xattr-user.c b/hw/9pfs/9p-xattr-user.c similarity index 97% rename from hw/9pfs/virtio-9p-xattr-user.c rename to hw/9pfs/9p-xattr-user.c index 46133e06db..163b158362 100644 --- a/hw/9pfs/virtio-9p-xattr-user.c +++ b/hw/9pfs/9p-xattr-user.c @@ -1,5 +1,5 @@ /* - * Virtio 9p user. xattr callback + * 9p user. xattr callback * * Copyright IBM, Corp. 2010 * @@ -12,10 +12,9 @@ */ #include -#include "hw/virtio/virtio.h" #include "virtio-9p.h" #include "fsdev/file-op-9p.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" static ssize_t mp_user_getxattr(FsContext *ctx, const char *path, diff --git a/hw/9pfs/virtio-9p-xattr.c b/hw/9pfs/9p-xattr.c similarity index 97% rename from hw/9pfs/virtio-9p-xattr.c rename to hw/9pfs/9p-xattr.c index 07183887c5..1d7861b27b 100644 --- a/hw/9pfs/virtio-9p-xattr.c +++ b/hw/9pfs/9p-xattr.c @@ -1,5 +1,5 @@ /* - * Virtio 9p xattr callback + * 9p xattr callback * * Copyright IBM, Corp. 2010 * @@ -11,10 +11,9 @@ * */ -#include "hw/virtio/virtio.h" #include "virtio-9p.h" #include "fsdev/file-op-9p.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" static XattrOperations *get_xattr_operations(XattrOperations **h, diff --git a/hw/9pfs/virtio-9p-xattr.h b/hw/9pfs/9p-xattr.h similarity index 97% rename from hw/9pfs/virtio-9p-xattr.h rename to hw/9pfs/9p-xattr.h index 327b32b5aa..4d39a20262 100644 --- a/hw/9pfs/virtio-9p-xattr.h +++ b/hw/9pfs/9p-xattr.h @@ -1,5 +1,5 @@ /* - * Virtio 9p + * 9p * * Copyright IBM, Corp. 2010 * @@ -10,8 +10,8 @@ * the COPYING file in the top-level directory. * */ -#ifndef _QEMU_VIRTIO_9P_XATTR_H -#define _QEMU_VIRTIO_9P_XATTR_H +#ifndef _QEMU_9P_XATTR_H +#define _QEMU_9P_XATTR_H #include "qemu/xattr.h" diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index ba62571d57..838c5e1eb9 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -1,6 +1,6 @@ common-obj-y = virtio-9p.o -common-obj-y += 9p-local.o virtio-9p-xattr.o -common-obj-y += virtio-9p-xattr-user.o 9p-posix-acl.o +common-obj-y += 9p-local.o 9p-xattr.o +common-obj-y += 9p-xattr-user.o 9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o common-obj-y += coxattr.o 9p-synth.o common-obj-$(CONFIG_OPEN_BY_HANDLE) += 9p-handle.o diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 667b54aeb8..92ac19b24b 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -17,7 +17,7 @@ #include "qemu/sockets.h" #include "virtio-9p.h" #include "fsdev/qemu-fsdev.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" #include "coth.h" #include "hw/virtio/virtio-access.h" diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 0f178dec32..30ff82865e 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -18,7 +18,7 @@ #include "qemu/sockets.h" #include "virtio-9p.h" #include "fsdev/qemu-fsdev.h" -#include "virtio-9p-xattr.h" +#include "9p-xattr.h" #include "coth.h" #include "trace.h" #include "migration/migration.h" From 756cb74a59cfe5a4f5ceb4ac178d99d39cd5f0fe Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 25 Nov 2015 16:58:20 +0000 Subject: [PATCH 08/25] 9pfs: merge hw/virtio/virtio-9p.h into hw/9pfs/virtio-9p.h The deleted file only contained V9fsConf which wasn't virtio specific. Merge that to the general header of 9pfs. Fixed header inclusions as I went along. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-device.c | 1 - hw/9pfs/virtio-9p.h | 8 +++++++- hw/virtio/virtio-pci.h | 1 - include/hw/virtio/virtio-9p.h | 24 ------------------------ 4 files changed, 7 insertions(+), 27 deletions(-) delete mode 100644 include/hw/virtio/virtio-9p.h diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 92ac19b24b..885b940683 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -12,7 +12,6 @@ */ #include "hw/virtio/virtio.h" -#include "hw/virtio/virtio-9p.h" #include "hw/i386/pc.h" #include "qemu/sockets.h" #include "virtio-9p.h" diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index d7a4dc1e9a..ac4cb006b3 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -9,7 +9,6 @@ #include #include "standard-headers/linux/virtio_9p.h" #include "hw/virtio/virtio.h" -#include "hw/virtio/virtio-9p.h" #include "fsdev/file-op-9p.h" #include "fsdev/virtio-9p-marshal.h" #include "qemu/thread.h" @@ -156,6 +155,13 @@ enum { P9_FID_XATTR, }; +typedef struct V9fsConf +{ + /* tag name for the device */ + char *tag; + char *fsdev_id; +} V9fsConf; + typedef struct V9fsXattr { int64_t copied_len; diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h index a104ff2072..7cf597461b 100644 --- a/hw/virtio/virtio-pci.h +++ b/hw/virtio/virtio-pci.h @@ -23,7 +23,6 @@ #include "hw/virtio/virtio-scsi.h" #include "hw/virtio/virtio-balloon.h" #include "hw/virtio/virtio-bus.h" -#include "hw/virtio/virtio-9p.h" #include "hw/virtio/virtio-input.h" #include "hw/virtio/virtio-gpu.h" #ifdef CONFIG_VIRTFS diff --git a/include/hw/virtio/virtio-9p.h b/include/hw/virtio/virtio-9p.h deleted file mode 100644 index 65789db131..0000000000 --- a/include/hw/virtio/virtio-9p.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Virtio 9p - * - * Copyright IBM, Corp. 2010 - * - * Authors: - * Aneesh Kumar K.V - * - * This work is licensed under the terms of the GNU GPL, version 2. See - * the COPYING file in the top-level directory. - * - */ - -#ifndef QEMU_VIRTIO_9P_DEVICE_H -#define QEMU_VIRTIO_9P_DEVICE_H - -typedef struct V9fsConf -{ - /* tag name for the device */ - char *tag; - char *fsdev_id; -} V9fsConf; - -#endif From 71042cffc093a80734608649a6a47b30142c3e6a Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 19 Nov 2015 12:46:53 +0000 Subject: [PATCH 09/25] 9pfs: remove dead code Some structures in virtio-9p.h have been unused since 2011 when relevant functions switched to use coroutines. The declaration of pdu_packunpack and function do_pdu_unpack are useless. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p.h | 68 --------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index ac4cb006b3..3c78d3cee1 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -227,65 +227,6 @@ typedef struct V9fsState V9fsConf fsconf; } V9fsState; -typedef struct V9fsStatState { - V9fsPDU *pdu; - size_t offset; - V9fsStat v9stat; - V9fsFidState *fidp; - struct stat stbuf; -} V9fsStatState; - -typedef struct V9fsOpenState { - V9fsPDU *pdu; - size_t offset; - int32_t mode; - V9fsFidState *fidp; - V9fsQID qid; - struct stat stbuf; - int iounit; -} V9fsOpenState; - -typedef struct V9fsReadState { - V9fsPDU *pdu; - size_t offset; - int32_t count; - int32_t total; - int64_t off; - V9fsFidState *fidp; - struct iovec iov[128]; /* FIXME: bad, bad, bad */ - struct iovec *sg; - off_t dir_pos; - struct dirent *dent; - struct stat stbuf; - V9fsString name; - V9fsStat v9stat; - int32_t len; - int32_t cnt; - int32_t max_count; -} V9fsReadState; - -typedef struct V9fsWriteState { - V9fsPDU *pdu; - size_t offset; - int32_t len; - int32_t count; - int32_t total; - int64_t off; - V9fsFidState *fidp; - struct iovec iov[128]; /* FIXME: bad, bad, bad */ - struct iovec *sg; - int cnt; -} V9fsWriteState; - -typedef struct V9fsMkState { - V9fsPDU *pdu; - size_t offset; - V9fsQID qid; - struct stat stbuf; - V9fsString name; - V9fsString fullname; -} V9fsMkState; - /* 9p2000.L open flags */ #define P9_DOTL_RDONLY 00000000 #define P9_DOTL_WRONLY 00000001 @@ -345,15 +286,6 @@ typedef struct V9fsGetlock extern int open_fd_hw; extern int total_open_fd; -size_t pdu_packunpack(void *addr, struct iovec *sg, int sg_count, - size_t offset, size_t size, int pack); - -static inline size_t do_pdu_unpack(void *dst, struct iovec *sg, int sg_count, - size_t offset, size_t size) -{ - return pdu_packunpack(dst, sg, sg_count, offset, size, 0); -} - static inline void v9fs_path_write_lock(V9fsState *s) { if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { From 829dd2861a0f925526c5598d65a1bc05de9186c2 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 25 Nov 2015 14:38:17 +0000 Subject: [PATCH 10/25] fsdev: break out 9p-marshal.{c,h} from virtio-9p-marshal.{c,h} Break out some generic functions for marshaling 9p state. Pure code motion plus minor fixes for build system. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- Makefile | 2 +- fsdev/9p-marshal.c | 56 ++++++++++++++++++++++++++ fsdev/9p-marshal.h | 84 +++++++++++++++++++++++++++++++++++++++ fsdev/Makefile.objs | 2 +- fsdev/virtio-9p-marshal.c | 31 --------------- fsdev/virtio-9p-marshal.h | 79 +----------------------------------- 6 files changed, 143 insertions(+), 111 deletions(-) create mode 100644 fsdev/9p-marshal.c create mode 100644 fsdev/9p-marshal.h diff --git a/Makefile b/Makefile index 82b2fc8b96..7e881d8866 100644 --- a/Makefile +++ b/Makefile @@ -240,7 +240,7 @@ qemu-io$(EXESUF): qemu-io.o $(block-obj-y) $(crypto-obj-y) $(qom-obj-y) libqemuu qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o -fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/virtio-9p-marshal.o libqemuutil.a libqemustub.a +fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/virtio-9p-marshal.o libqemuutil.a libqemustub.a fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx diff --git a/fsdev/9p-marshal.c b/fsdev/9p-marshal.c new file mode 100644 index 0000000000..991e35d242 --- /dev/null +++ b/fsdev/9p-marshal.c @@ -0,0 +1,56 @@ +/* + * 9p backend + * + * Copyright IBM, Corp. 2010 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qemu/compiler.h" +#include "9p-marshal.h" + +void v9fs_string_free(V9fsString *str) +{ + g_free(str->data); + str->data = NULL; + str->size = 0; +} + +void v9fs_string_null(V9fsString *str) +{ + v9fs_string_free(str); +} + +void GCC_FMT_ATTR(2, 3) +v9fs_string_sprintf(V9fsString *str, const char *fmt, ...) +{ + va_list ap; + + v9fs_string_free(str); + + va_start(ap, fmt); + str->size = g_vasprintf(&str->data, fmt, ap); + va_end(ap); +} + +void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs) +{ + v9fs_string_free(lhs); + v9fs_string_sprintf(lhs, "%s", rhs->data); +} diff --git a/fsdev/9p-marshal.h b/fsdev/9p-marshal.h new file mode 100644 index 0000000000..e91b24e9ca --- /dev/null +++ b/fsdev/9p-marshal.h @@ -0,0 +1,84 @@ +#ifndef _QEMU_9P_MARSHAL_H +#define _QEMU_9P_MARSHAL_H + +typedef struct V9fsString +{ + uint16_t size; + char *data; +} V9fsString; + +typedef struct V9fsQID +{ + int8_t type; + int32_t version; + int64_t path; +} V9fsQID; + +typedef struct V9fsStat +{ + int16_t size; + int16_t type; + int32_t dev; + V9fsQID qid; + int32_t mode; + int32_t atime; + int32_t mtime; + int64_t length; + V9fsString name; + V9fsString uid; + V9fsString gid; + V9fsString muid; + /* 9p2000.u */ + V9fsString extension; + int32_t n_uid; + int32_t n_gid; + int32_t n_muid; +} V9fsStat; + +typedef struct V9fsIattr +{ + int32_t valid; + int32_t mode; + int32_t uid; + int32_t gid; + int64_t size; + int64_t atime_sec; + int64_t atime_nsec; + int64_t mtime_sec; + int64_t mtime_nsec; +} V9fsIattr; + +typedef struct V9fsStatDotl { + uint64_t st_result_mask; + V9fsQID qid; + uint32_t st_mode; + uint32_t st_uid; + uint32_t st_gid; + uint64_t st_nlink; + uint64_t st_rdev; + uint64_t st_size; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_atime_sec; + uint64_t st_atime_nsec; + uint64_t st_mtime_sec; + uint64_t st_mtime_nsec; + uint64_t st_ctime_sec; + uint64_t st_ctime_nsec; + uint64_t st_btime_sec; + uint64_t st_btime_nsec; + uint64_t st_gen; + uint64_t st_data_version; +} V9fsStatDotl; + +static inline void v9fs_string_init(V9fsString *str) +{ + str->data = NULL; + str->size = 0; +} +extern void v9fs_string_free(V9fsString *str); +extern void v9fs_string_null(V9fsString *str); +extern void v9fs_string_sprintf(V9fsString *str, const char *fmt, ...); +extern void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs); + +#endif diff --git a/fsdev/Makefile.objs b/fsdev/Makefile.objs index c27dad3f6d..8357851fe7 100644 --- a/fsdev/Makefile.objs +++ b/fsdev/Makefile.objs @@ -1,7 +1,7 @@ ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy) # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add. # only pull in the actual virtio-9p device if we also enabled virtio. -common-obj-y = qemu-fsdev.o virtio-9p-marshal.o +common-obj-y = qemu-fsdev.o 9p-marshal.o virtio-9p-marshal.o else common-obj-y = qemu-fsdev-dummy.o endif diff --git a/fsdev/virtio-9p-marshal.c b/fsdev/virtio-9p-marshal.c index 7748d32075..f236bab374 100644 --- a/fsdev/virtio-9p-marshal.c +++ b/fsdev/virtio-9p-marshal.c @@ -25,37 +25,6 @@ #include "virtio-9p-marshal.h" #include "qemu/bswap.h" -void v9fs_string_free(V9fsString *str) -{ - g_free(str->data); - str->data = NULL; - str->size = 0; -} - -void v9fs_string_null(V9fsString *str) -{ - v9fs_string_free(str); -} - -void GCC_FMT_ATTR(2, 3) -v9fs_string_sprintf(V9fsString *str, const char *fmt, ...) -{ - va_list ap; - - v9fs_string_free(str); - - va_start(ap, fmt); - str->size = g_vasprintf(&str->data, fmt, ap); - va_end(ap); -} - -void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs) -{ - v9fs_string_free(lhs); - v9fs_string_sprintf(lhs, "%s", rhs->data); -} - - static ssize_t v9fs_packunpack(void *addr, struct iovec *sg, int sg_count, size_t offset, size_t size, int pack) { diff --git a/fsdev/virtio-9p-marshal.h b/fsdev/virtio-9p-marshal.h index 5df65a8357..0709bcd06d 100644 --- a/fsdev/virtio-9p-marshal.h +++ b/fsdev/virtio-9p-marshal.h @@ -1,85 +1,8 @@ #ifndef _QEMU_VIRTIO_9P_MARSHAL_H #define _QEMU_VIRTIO_9P_MARSHAL_H -typedef struct V9fsString -{ - uint16_t size; - char *data; -} V9fsString; +#include "9p-marshal.h" -typedef struct V9fsQID -{ - int8_t type; - int32_t version; - int64_t path; -} V9fsQID; - -typedef struct V9fsStat -{ - int16_t size; - int16_t type; - int32_t dev; - V9fsQID qid; - int32_t mode; - int32_t atime; - int32_t mtime; - int64_t length; - V9fsString name; - V9fsString uid; - V9fsString gid; - V9fsString muid; - /* 9p2000.u */ - V9fsString extension; - int32_t n_uid; - int32_t n_gid; - int32_t n_muid; -} V9fsStat; - -typedef struct V9fsIattr -{ - int32_t valid; - int32_t mode; - int32_t uid; - int32_t gid; - int64_t size; - int64_t atime_sec; - int64_t atime_nsec; - int64_t mtime_sec; - int64_t mtime_nsec; -} V9fsIattr; - -typedef struct V9fsStatDotl { - uint64_t st_result_mask; - V9fsQID qid; - uint32_t st_mode; - uint32_t st_uid; - uint32_t st_gid; - uint64_t st_nlink; - uint64_t st_rdev; - uint64_t st_size; - uint64_t st_blksize; - uint64_t st_blocks; - uint64_t st_atime_sec; - uint64_t st_atime_nsec; - uint64_t st_mtime_sec; - uint64_t st_mtime_nsec; - uint64_t st_ctime_sec; - uint64_t st_ctime_nsec; - uint64_t st_btime_sec; - uint64_t st_btime_nsec; - uint64_t st_gen; - uint64_t st_data_version; -} V9fsStatDotl; - -static inline void v9fs_string_init(V9fsString *str) -{ - str->data = NULL; - str->size = 0; -} -extern void v9fs_string_free(V9fsString *str); -extern void v9fs_string_null(V9fsString *str); -extern void v9fs_string_sprintf(V9fsString *str, const char *fmt, ...); -extern void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs); ssize_t v9fs_pack(struct iovec *in_sg, int in_num, size_t offset, const void *src, size_t size); From 2209bd050a9287120b74f8616837293d739c5fb3 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Mon, 30 Nov 2015 16:14:29 +0000 Subject: [PATCH 11/25] fsdev: rename virtio-9p-marshal.{c,h} to 9p-iov-marshal.{c,h} And rename v9fs_marshal to v9fs_iov_marshal, v9fs_unmarshal to v9fs_iov_unmarshal. The rationale behind this change is that, this marshalling interface is used both by virtio and proxy helper. Renaming files and functions to reflect the true nature of this interface. Xen transport is going to have its own marshalling interface. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- Makefile | 2 +- .../{virtio-9p-marshal.c => 9p-iov-marshal.c} | 110 ++++++++++-------- fsdev/9p-iov-marshal.h | 13 +++ fsdev/Makefile.objs | 2 +- fsdev/virtfs-proxy-helper.c | 4 +- fsdev/virtio-9p-marshal.h | 13 --- hw/9pfs/9p-proxy.h | 4 +- hw/9pfs/virtio-9p.h | 6 +- 8 files changed, 82 insertions(+), 72 deletions(-) rename fsdev/{virtio-9p-marshal.c => 9p-iov-marshal.c} (62%) create mode 100644 fsdev/9p-iov-marshal.h delete mode 100644 fsdev/virtio-9p-marshal.h diff --git a/Makefile b/Makefile index 7e881d8866..d0de2d46b6 100644 --- a/Makefile +++ b/Makefile @@ -240,7 +240,7 @@ qemu-io$(EXESUF): qemu-io.o $(block-obj-y) $(crypto-obj-y) $(qom-obj-y) libqemuu qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o -fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/virtio-9p-marshal.o libqemuutil.a libqemustub.a +fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o libqemuutil.a libqemustub.a fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx diff --git a/fsdev/virtio-9p-marshal.c b/fsdev/9p-iov-marshal.c similarity index 62% rename from fsdev/virtio-9p-marshal.c rename to fsdev/9p-iov-marshal.c index f236bab374..4883b60d17 100644 --- a/fsdev/virtio-9p-marshal.c +++ b/fsdev/9p-iov-marshal.c @@ -1,5 +1,5 @@ /* - * Virtio 9p backend + * 9p backend * * Copyright IBM, Corp. 2010 * @@ -22,7 +22,7 @@ #include #include "qemu/compiler.h" -#include "virtio-9p-marshal.h" +#include "9p-iov-marshal.h" #include "qemu/bswap.h" static ssize_t v9fs_packunpack(void *addr, struct iovec *sg, int sg_count, @@ -76,8 +76,8 @@ ssize_t v9fs_pack(struct iovec *in_sg, int in_num, size_t offset, return v9fs_packunpack((void *)src, in_sg, in_num, offset, size, 1); } -ssize_t v9fs_unmarshal(struct iovec *out_sg, int out_num, size_t offset, - int bswap, const char *fmt, ...) +ssize_t v9fs_iov_unmarshal(struct iovec *out_sg, int out_num, size_t offset, + int bswap, const char *fmt, ...) { int i; va_list ap; @@ -127,8 +127,8 @@ ssize_t v9fs_unmarshal(struct iovec *out_sg, int out_num, size_t offset, } case 's': { V9fsString *str = va_arg(ap, V9fsString *); - copied = v9fs_unmarshal(out_sg, out_num, offset, bswap, - "w", &str->size); + copied = v9fs_iov_unmarshal(out_sg, out_num, offset, bswap, + "w", &str->size); if (copied > 0) { offset += copied; str->data = g_malloc(str->size + 1); @@ -144,31 +144,36 @@ ssize_t v9fs_unmarshal(struct iovec *out_sg, int out_num, size_t offset, } case 'Q': { V9fsQID *qidp = va_arg(ap, V9fsQID *); - copied = v9fs_unmarshal(out_sg, out_num, offset, bswap, "bdq", - &qidp->type, &qidp->version, &qidp->path); + copied = v9fs_iov_unmarshal(out_sg, out_num, offset, bswap, + "bdq", &qidp->type, &qidp->version, + &qidp->path); break; } case 'S': { V9fsStat *statp = va_arg(ap, V9fsStat *); - copied = v9fs_unmarshal(out_sg, out_num, offset, bswap, - "wwdQdddqsssssddd", - &statp->size, &statp->type, &statp->dev, - &statp->qid, &statp->mode, &statp->atime, - &statp->mtime, &statp->length, - &statp->name, &statp->uid, &statp->gid, - &statp->muid, &statp->extension, - &statp->n_uid, &statp->n_gid, - &statp->n_muid); + copied = v9fs_iov_unmarshal(out_sg, out_num, offset, bswap, + "wwdQdddqsssssddd", + &statp->size, &statp->type, + &statp->dev, &statp->qid, + &statp->mode, &statp->atime, + &statp->mtime, &statp->length, + &statp->name, &statp->uid, + &statp->gid, &statp->muid, + &statp->extension, + &statp->n_uid, &statp->n_gid, + &statp->n_muid); break; } case 'I': { V9fsIattr *iattr = va_arg(ap, V9fsIattr *); - copied = v9fs_unmarshal(out_sg, out_num, offset, bswap, - "ddddqqqqq", - &iattr->valid, &iattr->mode, - &iattr->uid, &iattr->gid, &iattr->size, - &iattr->atime_sec, &iattr->atime_nsec, - &iattr->mtime_sec, &iattr->mtime_nsec); + copied = v9fs_iov_unmarshal(out_sg, out_num, offset, bswap, + "ddddqqqqq", + &iattr->valid, &iattr->mode, + &iattr->uid, &iattr->gid, + &iattr->size, &iattr->atime_sec, + &iattr->atime_nsec, + &iattr->mtime_sec, + &iattr->mtime_nsec); break; } default: @@ -185,8 +190,8 @@ ssize_t v9fs_unmarshal(struct iovec *out_sg, int out_num, size_t offset, return offset - old_offset; } -ssize_t v9fs_marshal(struct iovec *in_sg, int in_num, size_t offset, - int bswap, const char *fmt, ...) +ssize_t v9fs_iov_marshal(struct iovec *in_sg, int in_num, size_t offset, + int bswap, const char *fmt, ...) { int i; va_list ap; @@ -233,8 +238,8 @@ ssize_t v9fs_marshal(struct iovec *in_sg, int in_num, size_t offset, } case 's': { V9fsString *str = va_arg(ap, V9fsString *); - copied = v9fs_marshal(in_sg, in_num, offset, bswap, - "w", str->size); + copied = v9fs_iov_marshal(in_sg, in_num, offset, bswap, + "w", str->size); if (copied > 0) { offset += copied; copied = v9fs_pack(in_sg, in_num, offset, str->data, str->size); @@ -243,37 +248,42 @@ ssize_t v9fs_marshal(struct iovec *in_sg, int in_num, size_t offset, } case 'Q': { V9fsQID *qidp = va_arg(ap, V9fsQID *); - copied = v9fs_marshal(in_sg, in_num, offset, bswap, "bdq", - qidp->type, qidp->version, qidp->path); + copied = v9fs_iov_marshal(in_sg, in_num, offset, bswap, "bdq", + qidp->type, qidp->version, + qidp->path); break; } case 'S': { V9fsStat *statp = va_arg(ap, V9fsStat *); - copied = v9fs_marshal(in_sg, in_num, offset, bswap, - "wwdQdddqsssssddd", - statp->size, statp->type, statp->dev, - &statp->qid, statp->mode, statp->atime, - statp->mtime, statp->length, &statp->name, - &statp->uid, &statp->gid, &statp->muid, - &statp->extension, statp->n_uid, - statp->n_gid, statp->n_muid); + copied = v9fs_iov_marshal(in_sg, in_num, offset, bswap, + "wwdQdddqsssssddd", + statp->size, statp->type, statp->dev, + &statp->qid, statp->mode, statp->atime, + statp->mtime, statp->length, + &statp->name, + &statp->uid, &statp->gid, &statp->muid, + &statp->extension, statp->n_uid, + statp->n_gid, statp->n_muid); break; } case 'A': { V9fsStatDotl *statp = va_arg(ap, V9fsStatDotl *); - copied = v9fs_marshal(in_sg, in_num, offset, bswap, - "qQdddqqqqqqqqqqqqqqq", - statp->st_result_mask, - &statp->qid, statp->st_mode, - statp->st_uid, statp->st_gid, - statp->st_nlink, statp->st_rdev, - statp->st_size, statp->st_blksize, - statp->st_blocks, statp->st_atime_sec, - statp->st_atime_nsec, statp->st_mtime_sec, - statp->st_mtime_nsec, statp->st_ctime_sec, - statp->st_ctime_nsec, statp->st_btime_sec, - statp->st_btime_nsec, statp->st_gen, - statp->st_data_version); + copied = v9fs_iov_marshal(in_sg, in_num, offset, bswap, + "qQdddqqqqqqqqqqqqqqq", + statp->st_result_mask, + &statp->qid, statp->st_mode, + statp->st_uid, statp->st_gid, + statp->st_nlink, statp->st_rdev, + statp->st_size, statp->st_blksize, + statp->st_blocks, statp->st_atime_sec, + statp->st_atime_nsec, + statp->st_mtime_sec, + statp->st_mtime_nsec, + statp->st_ctime_sec, + statp->st_ctime_nsec, + statp->st_btime_sec, + statp->st_btime_nsec, statp->st_gen, + statp->st_data_version); break; } default: diff --git a/fsdev/9p-iov-marshal.h b/fsdev/9p-iov-marshal.h new file mode 100644 index 0000000000..993614f544 --- /dev/null +++ b/fsdev/9p-iov-marshal.h @@ -0,0 +1,13 @@ +#ifndef _QEMU_9P_IOV_MARSHAL_H +#define _QEMU_9P_IOV_MARSHAL_H + +#include "9p-marshal.h" + + +ssize_t v9fs_pack(struct iovec *in_sg, int in_num, size_t offset, + const void *src, size_t size); +ssize_t v9fs_iov_unmarshal(struct iovec *out_sg, int out_num, size_t offset, + int bswap, const char *fmt, ...); +ssize_t v9fs_iov_marshal(struct iovec *in_sg, int in_num, size_t offset, + int bswap, const char *fmt, ...); +#endif diff --git a/fsdev/Makefile.objs b/fsdev/Makefile.objs index 8357851fe7..1b120a4a7d 100644 --- a/fsdev/Makefile.objs +++ b/fsdev/Makefile.objs @@ -1,7 +1,7 @@ ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy) # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add. # only pull in the actual virtio-9p device if we also enabled virtio. -common-obj-y = qemu-fsdev.o 9p-marshal.o virtio-9p-marshal.o +common-obj-y = qemu-fsdev.o 9p-marshal.o 9p-iov-marshal.o else common-obj-y = qemu-fsdev-dummy.o endif diff --git a/fsdev/virtfs-proxy-helper.c b/fsdev/virtfs-proxy-helper.c index 77536548d0..44c7d88f1b 100644 --- a/fsdev/virtfs-proxy-helper.c +++ b/fsdev/virtfs-proxy-helper.c @@ -23,9 +23,9 @@ #include "qemu-common.h" #include "qemu/sockets.h" #include "qemu/xattr.h" -#include "virtio-9p-marshal.h" +#include "9p-iov-marshal.h" #include "hw/9pfs/9p-proxy.h" -#include "fsdev/virtio-9p-marshal.h" +#include "fsdev/9p-iov-marshal.h" #define PROGNAME "virtfs-proxy-helper" diff --git a/fsdev/virtio-9p-marshal.h b/fsdev/virtio-9p-marshal.h deleted file mode 100644 index 0709bcd06d..0000000000 --- a/fsdev/virtio-9p-marshal.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _QEMU_VIRTIO_9P_MARSHAL_H -#define _QEMU_VIRTIO_9P_MARSHAL_H - -#include "9p-marshal.h" - - -ssize_t v9fs_pack(struct iovec *in_sg, int in_num, size_t offset, - const void *src, size_t size); -ssize_t v9fs_unmarshal(struct iovec *out_sg, int out_num, size_t offset, - int bswap, const char *fmt, ...); -ssize_t v9fs_marshal(struct iovec *in_sg, int in_num, size_t offset, - int bswap, const char *fmt, ...); -#endif diff --git a/hw/9pfs/9p-proxy.h b/hw/9pfs/9p-proxy.h index 56150b948b..ba9ca203de 100644 --- a/hw/9pfs/9p-proxy.h +++ b/hw/9pfs/9p-proxy.h @@ -20,9 +20,9 @@ * marsha/unmarshal doesn't do little endian conversion. */ #define proxy_unmarshal(in_sg, offset, fmt, args...) \ - v9fs_unmarshal(in_sg, 1, offset, 0, fmt, ##args) + v9fs_iov_unmarshal(in_sg, 1, offset, 0, fmt, ##args) #define proxy_marshal(out_sg, offset, fmt, args...) \ - v9fs_marshal(out_sg, 1, offset, 0, fmt, ##args) + v9fs_iov_marshal(out_sg, 1, offset, 0, fmt, ##args) union MsgControl { struct cmsghdr cmsg; diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 3c78d3cee1..3a7e136ab6 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -10,7 +10,7 @@ #include "standard-headers/linux/virtio_9p.h" #include "hw/virtio/virtio.h" #include "fsdev/file-op-9p.h" -#include "fsdev/virtio-9p-marshal.h" +#include "fsdev/9p-iov-marshal.h" #include "qemu/thread.h" #include "qemu/coroutine.h" @@ -321,9 +321,9 @@ extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, const char *name, V9fsPath *path); #define pdu_marshal(pdu, offset, fmt, args...) \ - v9fs_marshal(pdu->elem.in_sg, pdu->elem.in_num, offset, 1, fmt, ##args) + v9fs_iov_marshal(pdu->elem.in_sg, pdu->elem.in_num, offset, 1, fmt, ##args) #define pdu_unmarshal(pdu, offset, fmt, args...) \ - v9fs_unmarshal(pdu->elem.out_sg, pdu->elem.out_num, offset, 1, fmt, ##args) + v9fs_iov_unmarshal(pdu->elem.out_sg, pdu->elem.out_num, offset, 1, fmt, ##args) #define TYPE_VIRTIO_9P "virtio-9p-device" #define VIRTIO_9P(obj) \ From ad38ce9ed16c66583952c7697c62255a74de6196 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 2 Dec 2015 12:06:28 +0000 Subject: [PATCH 12/25] 9pfs: PDU processing functions don't need to take V9fsState as argument V9fsState can be referenced by pdu->s. Initialise that in device realization function. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-device.c | 1 + hw/9pfs/virtio-9p.c | 98 +++++++++++++++++--------------------- 2 files changed, 46 insertions(+), 53 deletions(-) diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 885b940683..f3091cc813 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -69,6 +69,7 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp) QLIST_INIT(&s->active_list); for (i = 0; i < (MAX_REQ - 1); i++) { QLIST_INSERT_HEAD(&s->free_list, &s->pdus[i], next); + s->pdus[i].s = s; } s->vq = virtio_add_queue(vdev, MAX_REQ, handle_9p_output); diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 30ff82865e..0a016dc11a 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -575,9 +575,10 @@ static V9fsPDU *alloc_pdu(V9fsState *s) return pdu; } -static void free_pdu(V9fsState *s, V9fsPDU *pdu) +static void free_pdu(V9fsPDU *pdu) { if (pdu) { + V9fsState *s = pdu->s; /* * Cancelled pdu are added back to the freelist * by flush request . @@ -594,9 +595,10 @@ static void free_pdu(V9fsState *s, V9fsPDU *pdu) * because we always expect to have enough space to encode * error details */ -static void complete_pdu(V9fsState *s, V9fsPDU *pdu, ssize_t len) +static void complete_pdu(V9fsPDU *pdu, ssize_t len) { int8_t id = pdu->id + 1; /* Response */ + V9fsState *s = pdu->s; if (len < 0) { int err = -len; @@ -636,7 +638,7 @@ static void complete_pdu(V9fsState *s, V9fsPDU *pdu, ssize_t len) /* Now wakeup anybody waiting in flush for this request */ qemu_co_queue_next(&pdu->complete); - free_pdu(s, pdu); + free_pdu(pdu); } static mode_t v9mode_to_mode(uint32_t mode, V9fsString *extension) @@ -931,7 +933,7 @@ static void v9fs_version(void *opaque) offset += err; trace_v9fs_version_return(pdu->tag, pdu->id, s->msize, version.data); out: - complete_pdu(s, pdu, offset); + complete_pdu(pdu, offset); v9fs_string_free(&version); } @@ -995,7 +997,7 @@ static void v9fs_attach(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&uname); v9fs_string_free(&aname); } @@ -1009,7 +1011,6 @@ static void v9fs_stat(void *opaque) struct stat stbuf; V9fsFidState *fidp; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; err = pdu_unmarshal(pdu, offset, "d", &fid); if (err < 0) { @@ -1042,7 +1043,7 @@ static void v9fs_stat(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static void v9fs_getattr(void *opaque) @@ -1105,7 +1106,7 @@ static void v9fs_getattr(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, retval); + complete_pdu(pdu, retval); } /* Attribute flags */ @@ -1129,7 +1130,6 @@ static void v9fs_setattr(void *opaque) size_t offset = 7; V9fsIattr v9iattr; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; err = pdu_unmarshal(pdu, offset, "dI", &fid, &v9iattr); if (err < 0) { @@ -1203,7 +1203,7 @@ static void v9fs_setattr(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static int v9fs_walk_marshal(V9fsPDU *pdu, uint16_t nwnames, V9fsQID *qids) @@ -1245,7 +1245,7 @@ static void v9fs_walk(void *opaque) err = pdu_unmarshal(pdu, offset, "ddw", &fid, &newfid, &nwnames); if (err < 0) { - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); return ; } offset += err; @@ -1313,7 +1313,7 @@ out: v9fs_path_free(&dpath); v9fs_path_free(&path); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); if (nwnames && nwnames <= P9_MAXWELEM) { for (name_idx = 0; name_idx < nwnames; name_idx++) { v9fs_string_free(&wnames[name_idx]); @@ -1430,7 +1430,7 @@ static void v9fs_open(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static void v9fs_lcreate(void *opaque) @@ -1487,7 +1487,7 @@ static void v9fs_lcreate(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -1499,7 +1499,6 @@ static void v9fs_fsync(void *opaque) size_t offset = 7; V9fsFidState *fidp; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; err = pdu_unmarshal(pdu, offset, "dd", &fid, &datasync); if (err < 0) { @@ -1518,7 +1517,7 @@ static void v9fs_fsync(void *opaque) } put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static void v9fs_clunk(void *opaque) @@ -1551,7 +1550,7 @@ static void v9fs_clunk(void *opaque) err = offset; } out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, @@ -1761,7 +1760,7 @@ static void v9fs_read(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static size_t v9fs_readdir_data_size(V9fsString *name) @@ -1848,7 +1847,6 @@ static void v9fs_readdir(void *opaque) int32_t count; uint32_t max_count; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; retval = pdu_unmarshal(pdu, offset, "dqd", &fid, &initial_offset, &max_count); @@ -1885,7 +1883,7 @@ static void v9fs_readdir(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, retval); + complete_pdu(pdu, retval); } static int v9fs_xattr_write(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, @@ -1952,7 +1950,7 @@ static void v9fs_write(void *opaque) err = pdu_unmarshal(pdu, offset, "dqd", &fid, &off, &count); if (err < 0) { - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); return; } offset += err; @@ -2015,7 +2013,7 @@ out: put_fid(pdu, fidp); out_nofid: qemu_iovec_destroy(&qiov_full); - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static void v9fs_create(void *opaque) @@ -2182,7 +2180,7 @@ static void v9fs_create(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); v9fs_string_free(&extension); v9fs_path_free(&path); @@ -2229,7 +2227,7 @@ static void v9fs_symlink(void *opaque) out: put_fid(pdu, dfidp); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); v9fs_string_free(&symname); } @@ -2245,7 +2243,7 @@ static void v9fs_flush(void *opaque) err = pdu_unmarshal(pdu, offset, "w", &tag); if (err < 0) { - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); return; } trace_v9fs_flush(pdu->tag, pdu->id, tag); @@ -2262,15 +2260,14 @@ static void v9fs_flush(void *opaque) */ qemu_co_queue_wait(&cancel_pdu->complete); cancel_pdu->cancelled = 0; - free_pdu(pdu->s, cancel_pdu); + free_pdu(cancel_pdu); } - complete_pdu(s, pdu, 7); + complete_pdu(pdu, 7); } static void v9fs_link(void *opaque) { V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; int32_t dfid, oldfid; V9fsFidState *dfidp, *oldfidp; V9fsString name; @@ -2303,7 +2300,7 @@ out: put_fid(pdu, dfidp); out_nofid: v9fs_string_free(&name); - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } /* Only works with path name based fid */ @@ -2348,7 +2345,7 @@ out_err: clunk_fid(pdu->s, fidp->fid); put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); } static void v9fs_unlinkat(void *opaque) @@ -2392,7 +2389,7 @@ out_err: put_fid(pdu, dfidp); v9fs_path_free(&path); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -2492,7 +2489,7 @@ static void v9fs_rename(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -2593,7 +2590,7 @@ static void v9fs_renameat(void *opaque) } out_err: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&old_name); v9fs_string_free(&new_name); } @@ -2608,7 +2605,6 @@ static void v9fs_wstat(void *opaque) struct stat stbuf; V9fsFidState *fidp; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; v9fs_stat_init(&v9stat); err = pdu_unmarshal(pdu, offset, "dwS", &fid, &unused, &v9stat); @@ -2690,7 +2686,7 @@ out: put_fid(pdu, fidp); out_nofid: v9fs_stat_free(&v9stat); - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); } static int v9fs_fill_statfs(V9fsState *s, V9fsPDU *pdu, struct statfs *stbuf) @@ -2769,7 +2765,7 @@ static void v9fs_statfs(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, retval); + complete_pdu(pdu, retval); } static void v9fs_mknod(void *opaque) @@ -2786,7 +2782,6 @@ static void v9fs_mknod(void *opaque) struct stat stbuf; V9fsFidState *fidp; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; v9fs_string_init(&name); err = pdu_unmarshal(pdu, offset, "dsdddd", &fid, &name, &mode, @@ -2817,7 +2812,7 @@ static void v9fs_mknod(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -2838,7 +2833,6 @@ static void v9fs_lock(void *opaque) V9fsFidState *fidp; int32_t fid, err = 0; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; status = P9_LOCK_ERROR; v9fs_string_init(&flock.client_id); @@ -2875,7 +2869,7 @@ out_nofid: err += offset; } trace_v9fs_lock_return(pdu->tag, pdu->id, status); - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&flock.client_id); } @@ -2891,7 +2885,6 @@ static void v9fs_getlock(void *opaque) V9fsGetlock glock; int32_t fid, err = 0; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; v9fs_string_init(&glock.client_id); err = pdu_unmarshal(pdu, offset, "dbqqds", &fid, &glock.type, @@ -2925,7 +2918,7 @@ static void v9fs_getlock(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&glock.client_id); } @@ -2969,7 +2962,7 @@ static void v9fs_mkdir(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -3075,7 +3068,7 @@ out: put_fid(pdu, xattr_fidp); } out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -3090,7 +3083,6 @@ static void v9fs_xattrcreate(void *opaque) V9fsFidState *file_fidp; V9fsFidState *xattr_fidp; V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; v9fs_string_init(&name); err = pdu_unmarshal(pdu, offset, "dsqd", &fid, &name, &size, &flags); @@ -3116,7 +3108,7 @@ static void v9fs_xattrcreate(void *opaque) err = offset; put_fid(pdu, file_fidp); out_nofid: - complete_pdu(s, pdu, err); + complete_pdu(pdu, err); v9fs_string_free(&name); } @@ -3156,7 +3148,7 @@ static void v9fs_readlink(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu->s, pdu, err); + complete_pdu(pdu, err); } static CoroutineEntry *pdu_co_handlers[] = { @@ -3199,13 +3191,13 @@ static CoroutineEntry *pdu_co_handlers[] = { static void v9fs_op_not_supp(void *opaque) { V9fsPDU *pdu = opaque; - complete_pdu(pdu->s, pdu, -EOPNOTSUPP); + complete_pdu(pdu, -EOPNOTSUPP); } static void v9fs_fs_ro(void *opaque) { V9fsPDU *pdu = opaque; - complete_pdu(pdu->s, pdu, -EROFS); + complete_pdu(pdu, -EROFS); } static inline bool is_read_only_op(V9fsPDU *pdu) @@ -3235,10 +3227,11 @@ static inline bool is_read_only_op(V9fsPDU *pdu) } } -static void submit_pdu(V9fsState *s, V9fsPDU *pdu) +static void submit_pdu(V9fsPDU *pdu) { Coroutine *co; CoroutineEntry *handler; + V9fsState *s = pdu->s; if (pdu->id >= ARRAY_SIZE(pdu_co_handlers) || (pdu_co_handlers[pdu->id] == NULL)) { @@ -3269,7 +3262,6 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) } QEMU_PACKED out; int len; - pdu->s = s; BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0); QEMU_BUILD_BUG_ON(sizeof out != 7); @@ -3283,9 +3275,9 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) pdu->tag = le16_to_cpu(out.tag_le); qemu_co_queue_init(&pdu->complete); - submit_pdu(s, pdu); + submit_pdu(pdu); } - free_pdu(s, pdu); + free_pdu(pdu); } static void __attribute__((__constructor__)) virtio_9p_set_fd_limit(void) From dc295f83538e936895c0e26d817b1a123c384c82 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 2 Dec 2015 15:00:14 +0000 Subject: [PATCH 13/25] 9pfs: PDU processing functions should start pdu_ prefix This matches naming convention of pdu_marshal and pdu_unmarshal. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p.c | 88 ++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 0a016dc11a..d8ce12ed88 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -563,7 +563,7 @@ static int fid_to_qid(V9fsPDU *pdu, V9fsFidState *fidp, V9fsQID *qidp) return 0; } -static V9fsPDU *alloc_pdu(V9fsState *s) +static V9fsPDU *pdu_alloc(V9fsState *s) { V9fsPDU *pdu = NULL; @@ -575,7 +575,7 @@ static V9fsPDU *alloc_pdu(V9fsState *s) return pdu; } -static void free_pdu(V9fsPDU *pdu) +static void pdu_free(V9fsPDU *pdu) { if (pdu) { V9fsState *s = pdu->s; @@ -595,7 +595,7 @@ static void free_pdu(V9fsPDU *pdu) * because we always expect to have enough space to encode * error details */ -static void complete_pdu(V9fsPDU *pdu, ssize_t len) +static void pdu_complete(V9fsPDU *pdu, ssize_t len) { int8_t id = pdu->id + 1; /* Response */ V9fsState *s = pdu->s; @@ -638,7 +638,7 @@ static void complete_pdu(V9fsPDU *pdu, ssize_t len) /* Now wakeup anybody waiting in flush for this request */ qemu_co_queue_next(&pdu->complete); - free_pdu(pdu); + pdu_free(pdu); } static mode_t v9mode_to_mode(uint32_t mode, V9fsString *extension) @@ -933,7 +933,7 @@ static void v9fs_version(void *opaque) offset += err; trace_v9fs_version_return(pdu->tag, pdu->id, s->msize, version.data); out: - complete_pdu(pdu, offset); + pdu_complete(pdu, offset); v9fs_string_free(&version); } @@ -997,7 +997,7 @@ static void v9fs_attach(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&uname); v9fs_string_free(&aname); } @@ -1043,7 +1043,7 @@ static void v9fs_stat(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static void v9fs_getattr(void *opaque) @@ -1106,7 +1106,7 @@ static void v9fs_getattr(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, retval); + pdu_complete(pdu, retval); } /* Attribute flags */ @@ -1203,7 +1203,7 @@ static void v9fs_setattr(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static int v9fs_walk_marshal(V9fsPDU *pdu, uint16_t nwnames, V9fsQID *qids) @@ -1245,7 +1245,7 @@ static void v9fs_walk(void *opaque) err = pdu_unmarshal(pdu, offset, "ddw", &fid, &newfid, &nwnames); if (err < 0) { - complete_pdu(pdu, err); + pdu_complete(pdu, err); return ; } offset += err; @@ -1313,7 +1313,7 @@ out: v9fs_path_free(&dpath); v9fs_path_free(&path); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); if (nwnames && nwnames <= P9_MAXWELEM) { for (name_idx = 0; name_idx < nwnames; name_idx++) { v9fs_string_free(&wnames[name_idx]); @@ -1430,7 +1430,7 @@ static void v9fs_open(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static void v9fs_lcreate(void *opaque) @@ -1487,7 +1487,7 @@ static void v9fs_lcreate(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -1517,7 +1517,7 @@ static void v9fs_fsync(void *opaque) } put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static void v9fs_clunk(void *opaque) @@ -1550,7 +1550,7 @@ static void v9fs_clunk(void *opaque) err = offset; } out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, @@ -1760,7 +1760,7 @@ static void v9fs_read(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static size_t v9fs_readdir_data_size(V9fsString *name) @@ -1883,7 +1883,7 @@ static void v9fs_readdir(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, retval); + pdu_complete(pdu, retval); } static int v9fs_xattr_write(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, @@ -1950,7 +1950,7 @@ static void v9fs_write(void *opaque) err = pdu_unmarshal(pdu, offset, "dqd", &fid, &off, &count); if (err < 0) { - complete_pdu(pdu, err); + pdu_complete(pdu, err); return; } offset += err; @@ -2013,7 +2013,7 @@ out: put_fid(pdu, fidp); out_nofid: qemu_iovec_destroy(&qiov_full); - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static void v9fs_create(void *opaque) @@ -2180,7 +2180,7 @@ static void v9fs_create(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); v9fs_string_free(&extension); v9fs_path_free(&path); @@ -2227,7 +2227,7 @@ static void v9fs_symlink(void *opaque) out: put_fid(pdu, dfidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); v9fs_string_free(&symname); } @@ -2243,7 +2243,7 @@ static void v9fs_flush(void *opaque) err = pdu_unmarshal(pdu, offset, "w", &tag); if (err < 0) { - complete_pdu(pdu, err); + pdu_complete(pdu, err); return; } trace_v9fs_flush(pdu->tag, pdu->id, tag); @@ -2260,9 +2260,9 @@ static void v9fs_flush(void *opaque) */ qemu_co_queue_wait(&cancel_pdu->complete); cancel_pdu->cancelled = 0; - free_pdu(cancel_pdu); + pdu_free(cancel_pdu); } - complete_pdu(pdu, 7); + pdu_complete(pdu, 7); } static void v9fs_link(void *opaque) @@ -2300,7 +2300,7 @@ out: put_fid(pdu, dfidp); out_nofid: v9fs_string_free(&name); - complete_pdu(pdu, err); + pdu_complete(pdu, err); } /* Only works with path name based fid */ @@ -2345,7 +2345,7 @@ out_err: clunk_fid(pdu->s, fidp->fid); put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static void v9fs_unlinkat(void *opaque) @@ -2389,7 +2389,7 @@ out_err: put_fid(pdu, dfidp); v9fs_path_free(&path); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -2489,7 +2489,7 @@ static void v9fs_rename(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -2590,7 +2590,7 @@ static void v9fs_renameat(void *opaque) } out_err: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&old_name); v9fs_string_free(&new_name); } @@ -2686,7 +2686,7 @@ out: put_fid(pdu, fidp); out_nofid: v9fs_stat_free(&v9stat); - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static int v9fs_fill_statfs(V9fsState *s, V9fsPDU *pdu, struct statfs *stbuf) @@ -2765,7 +2765,7 @@ static void v9fs_statfs(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, retval); + pdu_complete(pdu, retval); } static void v9fs_mknod(void *opaque) @@ -2812,7 +2812,7 @@ static void v9fs_mknod(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -2869,7 +2869,7 @@ out_nofid: err += offset; } trace_v9fs_lock_return(pdu->tag, pdu->id, status); - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&flock.client_id); } @@ -2918,7 +2918,7 @@ static void v9fs_getlock(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&glock.client_id); } @@ -2962,7 +2962,7 @@ static void v9fs_mkdir(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -3068,7 +3068,7 @@ out: put_fid(pdu, xattr_fidp); } out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -3108,7 +3108,7 @@ static void v9fs_xattrcreate(void *opaque) err = offset; put_fid(pdu, file_fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); v9fs_string_free(&name); } @@ -3148,7 +3148,7 @@ static void v9fs_readlink(void *opaque) out: put_fid(pdu, fidp); out_nofid: - complete_pdu(pdu, err); + pdu_complete(pdu, err); } static CoroutineEntry *pdu_co_handlers[] = { @@ -3191,13 +3191,13 @@ static CoroutineEntry *pdu_co_handlers[] = { static void v9fs_op_not_supp(void *opaque) { V9fsPDU *pdu = opaque; - complete_pdu(pdu, -EOPNOTSUPP); + pdu_complete(pdu, -EOPNOTSUPP); } static void v9fs_fs_ro(void *opaque) { V9fsPDU *pdu = opaque; - complete_pdu(pdu, -EROFS); + pdu_complete(pdu, -EROFS); } static inline bool is_read_only_op(V9fsPDU *pdu) @@ -3227,7 +3227,7 @@ static inline bool is_read_only_op(V9fsPDU *pdu) } } -static void submit_pdu(V9fsPDU *pdu) +static void pdu_submit(V9fsPDU *pdu) { Coroutine *co; CoroutineEntry *handler; @@ -3253,7 +3253,7 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) V9fsPDU *pdu; ssize_t len; - while ((pdu = alloc_pdu(s)) && + while ((pdu = pdu_alloc(s)) && (len = virtqueue_pop(vq, &pdu->elem)) != 0) { struct { uint32_t size_le; @@ -3275,9 +3275,9 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) pdu->tag = le16_to_cpu(out.tag_le); qemu_co_queue_init(&pdu->complete); - submit_pdu(pdu); + pdu_submit(pdu); } - free_pdu(pdu); + pdu_free(pdu); } static void __attribute__((__constructor__)) virtio_9p_set_fd_limit(void) From 0e2082d9e5aafbde9d1cf71159ce0123cd9fda05 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 2 Dec 2015 14:22:04 +0000 Subject: [PATCH 14/25] 9pfs: make pdu_{,un}marshal proper functions Factor out v9fs_iov_v{,un}marshal. Implement pdu_{,un}marshal with those functions. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- fsdev/9p-iov-marshal.c | 42 ++++++++++++++++++++++++++++++------------ fsdev/9p-iov-marshal.h | 5 +++++ hw/9pfs/virtio-9p.c | 26 ++++++++++++++++++++++++++ hw/9pfs/virtio-9p.h | 6 ++---- 4 files changed, 63 insertions(+), 16 deletions(-) diff --git a/fsdev/9p-iov-marshal.c b/fsdev/9p-iov-marshal.c index 4883b60d17..08d783ca11 100644 --- a/fsdev/9p-iov-marshal.c +++ b/fsdev/9p-iov-marshal.c @@ -76,15 +76,13 @@ ssize_t v9fs_pack(struct iovec *in_sg, int in_num, size_t offset, return v9fs_packunpack((void *)src, in_sg, in_num, offset, size, 1); } -ssize_t v9fs_iov_unmarshal(struct iovec *out_sg, int out_num, size_t offset, - int bswap, const char *fmt, ...) +ssize_t v9fs_iov_vunmarshal(struct iovec *out_sg, int out_num, size_t offset, + int bswap, const char *fmt, va_list ap) { int i; - va_list ap; ssize_t copied = 0; size_t old_offset = offset; - va_start(ap, fmt); for (i = 0; fmt[i]; i++) { switch (fmt[i]) { case 'b': { @@ -180,25 +178,34 @@ ssize_t v9fs_iov_unmarshal(struct iovec *out_sg, int out_num, size_t offset, break; } if (copied < 0) { - va_end(ap); return copied; } offset += copied; } - va_end(ap); return offset - old_offset; } -ssize_t v9fs_iov_marshal(struct iovec *in_sg, int in_num, size_t offset, - int bswap, const char *fmt, ...) +ssize_t v9fs_iov_unmarshal(struct iovec *out_sg, int out_num, size_t offset, + int bswap, const char *fmt, ...) +{ + ssize_t ret; + va_list ap; + + va_start(ap, fmt); + ret = v9fs_iov_vunmarshal(out_sg, out_num, offset, bswap, fmt, ap); + va_end(ap); + + return ret; +} + +ssize_t v9fs_iov_vmarshal(struct iovec *in_sg, int in_num, size_t offset, + int bswap, const char *fmt, va_list ap) { int i; - va_list ap; ssize_t copied = 0; size_t old_offset = offset; - va_start(ap, fmt); for (i = 0; fmt[i]; i++) { switch (fmt[i]) { case 'b': { @@ -290,12 +297,23 @@ ssize_t v9fs_iov_marshal(struct iovec *in_sg, int in_num, size_t offset, break; } if (copied < 0) { - va_end(ap); return copied; } offset += copied; } - va_end(ap); return offset - old_offset; } + +ssize_t v9fs_iov_marshal(struct iovec *in_sg, int in_num, size_t offset, + int bswap, const char *fmt, ...) +{ + ssize_t ret; + va_list ap; + + va_start(ap, fmt); + ret = v9fs_iov_vmarshal(in_sg, in_num, offset, bswap, fmt, ap); + va_end(ap); + + return ret; +} diff --git a/fsdev/9p-iov-marshal.h b/fsdev/9p-iov-marshal.h index 993614f544..6bccbfb41a 100644 --- a/fsdev/9p-iov-marshal.h +++ b/fsdev/9p-iov-marshal.h @@ -10,4 +10,9 @@ ssize_t v9fs_iov_unmarshal(struct iovec *out_sg, int out_num, size_t offset, int bswap, const char *fmt, ...); ssize_t v9fs_iov_marshal(struct iovec *in_sg, int in_num, size_t offset, int bswap, const char *fmt, ...); + +ssize_t v9fs_iov_vunmarshal(struct iovec *out_sg, int out_num, size_t offset, + int bswap, const char *fmt, va_list ap); +ssize_t v9fs_iov_vmarshal(struct iovec *in_sg, int in_num, size_t offset, + int bswap, const char *fmt, va_list ap); #endif diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index d8ce12ed88..a740f85625 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -39,6 +39,32 @@ enum { Oappend = 0x80, }; +ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) +{ + ssize_t ret; + va_list ap; + + va_start(ap, fmt); + ret = v9fs_iov_vmarshal(pdu->elem.in_sg, pdu->elem.in_num, + offset, 1, fmt, ap); + va_end(ap); + + return ret; +} + +ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) +{ + ssize_t ret; + va_list ap; + + va_start(ap, fmt); + ret = v9fs_iov_vunmarshal(pdu->elem.out_sg, pdu->elem.out_num, + offset, 1, fmt, ap); + va_end(ap); + + return ret; +} + static int omode_to_uflags(int8_t mode) { int ret = 0; diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 3a7e136ab6..d6f3ac08a7 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -320,10 +320,8 @@ extern void v9fs_path_copy(V9fsPath *lhs, V9fsPath *rhs); extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, const char *name, V9fsPath *path); -#define pdu_marshal(pdu, offset, fmt, args...) \ - v9fs_iov_marshal(pdu->elem.in_sg, pdu->elem.in_num, offset, 1, fmt, ##args) -#define pdu_unmarshal(pdu, offset, fmt, args...) \ - v9fs_iov_unmarshal(pdu->elem.out_sg, pdu->elem.out_num, offset, 1, fmt, ##args) +ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); +ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); #define TYPE_VIRTIO_9P "virtio-9p-device" #define VIRTIO_9P(obj) \ From fe9fa96d7c83efc1457bd6a5b07aab7550c6d197 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 3 Dec 2015 12:40:28 +0000 Subject: [PATCH 15/25] 9pfs: factor out virtio_pdu_{,un}marshal Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-device.c | 14 ++++++++++++++ hw/9pfs/virtio-9p.c | 6 ++---- hw/9pfs/virtio-9p.h | 5 +++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index f3091cc813..d77247f3cd 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -156,6 +156,20 @@ static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp) g_free(s->tag); } +ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, + const char *fmt, va_list ap) +{ + return v9fs_iov_vmarshal(pdu->elem.in_sg, pdu->elem.in_num, + offset, 1, fmt, ap); +} + +ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, + const char *fmt, va_list ap) +{ + return v9fs_iov_vunmarshal(pdu->elem.out_sg, pdu->elem.out_num, + offset, 1, fmt, ap); +} + /* virtio-9p device */ static Property virtio_9p_properties[] = { diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index a740f85625..6d32b81faa 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -45,8 +45,7 @@ ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) va_list ap; va_start(ap, fmt); - ret = v9fs_iov_vmarshal(pdu->elem.in_sg, pdu->elem.in_num, - offset, 1, fmt, ap); + ret = virtio_pdu_vmarshal(pdu, offset, fmt, ap); va_end(ap); return ret; @@ -58,8 +57,7 @@ ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) va_list ap; va_start(ap, fmt); - ret = v9fs_iov_vunmarshal(pdu->elem.out_sg, pdu->elem.out_num, - offset, 1, fmt, ap); + ret = virtio_pdu_vunmarshal(pdu, offset, fmt, ap); va_end(ap); return ret; diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index d6f3ac08a7..e298949fde 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -323,6 +323,11 @@ extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); +ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, + const char *fmt, va_list ap); +ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, + const char *fmt, va_list ap); + #define TYPE_VIRTIO_9P "virtio-9p-device" #define VIRTIO_9P(obj) \ OBJECT_CHECK(V9fsState, (obj), TYPE_VIRTIO_9P) From f657b17a6394e68f985111d3db33b299deb0cc3e Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 2 Dec 2015 14:43:40 +0000 Subject: [PATCH 16/25] 9pfs: factor out pdu_push_and_notify Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 6d32b81faa..e97adc8ba3 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -63,6 +63,17 @@ ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) return ret; } +static void pdu_push_and_notify(V9fsPDU *pdu) +{ + V9fsState *s = pdu->s; + + /* push onto queue and notify */ + virtqueue_push(s->vq, &pdu->elem, pdu->size); + + /* FIXME: we should batch these completions */ + virtio_notify(VIRTIO_DEVICE(s), s->vq); +} + static int omode_to_uflags(int8_t mode) { int ret = 0; @@ -653,11 +664,7 @@ static void pdu_complete(V9fsPDU *pdu, ssize_t len) pdu->size = len; pdu->id = id; - /* push onto queue and notify */ - virtqueue_push(s->vq, &pdu->elem, len); - - /* FIXME: we should batch these completions */ - virtio_notify(VIRTIO_DEVICE(s), s->vq); + pdu_push_and_notify(pdu); /* Now wakeup anybody waiting in flush for this request */ qemu_co_queue_next(&pdu->complete); From 592707af7f9e7098949adae6ebf2b065456e0773 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 3 Dec 2015 13:21:51 +0000 Subject: [PATCH 17/25] 9pfs: break out virtio_init_iov_from_pdu Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-device.c | 12 ++++++++++++ hw/9pfs/virtio-9p.c | 8 +------- hw/9pfs/virtio-9p.h | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index d77247f3cd..5cad654d8e 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -170,6 +170,18 @@ ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, offset, 1, fmt, ap); } +void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, + unsigned int *pniov, bool is_write) +{ + if (is_write) { + *piov = pdu->elem.out_sg; + *pniov = pdu->elem.out_num; + } else { + *piov = pdu->elem.in_sg; + *pniov = pdu->elem.in_num; + } +} + /* virtio-9p device */ static Property virtio_9p_properties[] = { diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index e97adc8ba3..2bd862fd94 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -1697,13 +1697,7 @@ static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu, struct iovec *iov; unsigned int niov; - if (is_write) { - iov = pdu->elem.out_sg; - niov = pdu->elem.out_num; - } else { - iov = pdu->elem.in_sg; - niov = pdu->elem.in_num; - } + virtio_init_iov_from_pdu(pdu, &iov, &niov, is_write); qemu_iovec_init_external(&elem, iov, niov); qemu_iovec_init(qiov, niov); diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index e298949fde..5024ad0460 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -327,6 +327,8 @@ ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); +void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, + unsigned int *pniov, bool is_write); #define TYPE_VIRTIO_9P "virtio-9p-device" #define VIRTIO_9P(obj) \ From ebe74f8ba2f1f68b87d7289696acc4741a30d2da Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 7 Jan 2016 18:18:02 +0000 Subject: [PATCH 18/25] 9pfs: break out 9p.h from virtio-9p.h Move out generic definitions from virtio-9p.h to 9p.h. Fix header inclusions. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/9p-handle.c | 2 +- hw/9pfs/9p-local.c | 2 +- hw/9pfs/9p-posix-acl.c | 2 +- hw/9pfs/9p-proxy.c | 2 +- hw/9pfs/9p-synth.c | 2 +- hw/9pfs/9p-xattr-user.c | 2 +- hw/9pfs/9p-xattr.c | 2 +- hw/9pfs/9p.h | 325 ++++++++++++++++++++++++++++++++++++++++ hw/9pfs/virtio-9p.h | 319 +-------------------------------------- 9 files changed, 333 insertions(+), 325 deletions(-) create mode 100644 hw/9pfs/9p.h diff --git a/hw/9pfs/9p-handle.c b/hw/9pfs/9p-handle.c index 51a9d15fee..58b77b4c94 100644 --- a/hw/9pfs/9p-handle.c +++ b/hw/9pfs/9p-handle.c @@ -11,7 +11,7 @@ * */ -#include "virtio-9p.h" +#include "9p.h" #include "9p-xattr.h" #include #include diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c index ac553e0db7..bf63eab729 100644 --- a/hw/9pfs/9p-local.c +++ b/hw/9pfs/9p-local.c @@ -11,7 +11,7 @@ * */ -#include "virtio-9p.h" +#include "9p.h" #include "9p-xattr.h" #include "fsdev/qemu-fsdev.h" /* local_ops */ #include diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c index 073af39983..8df822833c 100644 --- a/hw/9pfs/9p-posix-acl.c +++ b/hw/9pfs/9p-posix-acl.c @@ -13,7 +13,7 @@ #include #include "qemu/xattr.h" -#include "virtio-9p.h" +#include "9p.h" #include "fsdev/file-op-9p.h" #include "9p-xattr.h" diff --git a/hw/9pfs/9p-proxy.c b/hw/9pfs/9p-proxy.c index 67c1fb93f8..73d00dd74d 100644 --- a/hw/9pfs/9p-proxy.c +++ b/hw/9pfs/9p-proxy.c @@ -11,7 +11,7 @@ */ #include #include -#include "virtio-9p.h" +#include "9p.h" #include "qemu/error-report.h" #include "fsdev/qemu-fsdev.h" #include "9p-proxy.h" diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index b1064e3aea..090ae0cd4c 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -13,7 +13,7 @@ */ #include "hw/virtio/virtio.h" -#include "virtio-9p.h" +#include "9p.h" #include "9p-xattr.h" #include "fsdev/qemu-fsdev.h" #include "9p-synth.h" diff --git a/hw/9pfs/9p-xattr-user.c b/hw/9pfs/9p-xattr-user.c index 163b158362..c490ec3bf0 100644 --- a/hw/9pfs/9p-xattr-user.c +++ b/hw/9pfs/9p-xattr-user.c @@ -12,7 +12,7 @@ */ #include -#include "virtio-9p.h" +#include "9p.h" #include "fsdev/file-op-9p.h" #include "9p-xattr.h" diff --git a/hw/9pfs/9p-xattr.c b/hw/9pfs/9p-xattr.c index 1d7861b27b..741dd03744 100644 --- a/hw/9pfs/9p-xattr.c +++ b/hw/9pfs/9p-xattr.c @@ -11,7 +11,7 @@ * */ -#include "virtio-9p.h" +#include "9p.h" #include "fsdev/file-op-9p.h" #include "9p-xattr.h" diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h new file mode 100644 index 0000000000..9aeb8745cf --- /dev/null +++ b/hw/9pfs/9p.h @@ -0,0 +1,325 @@ +#ifndef _QEMU_9P_H +#define _QEMU_9P_H + +#include +#include +#include +#include +#include +#include +#include "standard-headers/linux/virtio_9p.h" +#include "hw/virtio/virtio.h" +#include "fsdev/file-op-9p.h" +#include "fsdev/9p-iov-marshal.h" +#include "qemu/thread.h" +#include "qemu/coroutine.h" + +enum { + P9_TLERROR = 6, + P9_RLERROR, + P9_TSTATFS = 8, + P9_RSTATFS, + P9_TLOPEN = 12, + P9_RLOPEN, + P9_TLCREATE = 14, + P9_RLCREATE, + P9_TSYMLINK = 16, + P9_RSYMLINK, + P9_TMKNOD = 18, + P9_RMKNOD, + P9_TRENAME = 20, + P9_RRENAME, + P9_TREADLINK = 22, + P9_RREADLINK, + P9_TGETATTR = 24, + P9_RGETATTR, + P9_TSETATTR = 26, + P9_RSETATTR, + P9_TXATTRWALK = 30, + P9_RXATTRWALK, + P9_TXATTRCREATE = 32, + P9_RXATTRCREATE, + P9_TREADDIR = 40, + P9_RREADDIR, + P9_TFSYNC = 50, + P9_RFSYNC, + P9_TLOCK = 52, + P9_RLOCK, + P9_TGETLOCK = 54, + P9_RGETLOCK, + P9_TLINK = 70, + P9_RLINK, + P9_TMKDIR = 72, + P9_RMKDIR, + P9_TRENAMEAT = 74, + P9_RRENAMEAT, + P9_TUNLINKAT = 76, + P9_RUNLINKAT, + P9_TVERSION = 100, + P9_RVERSION, + P9_TAUTH = 102, + P9_RAUTH, + P9_TATTACH = 104, + P9_RATTACH, + P9_TERROR = 106, + P9_RERROR, + P9_TFLUSH = 108, + P9_RFLUSH, + P9_TWALK = 110, + P9_RWALK, + P9_TOPEN = 112, + P9_ROPEN, + P9_TCREATE = 114, + P9_RCREATE, + P9_TREAD = 116, + P9_RREAD, + P9_TWRITE = 118, + P9_RWRITE, + P9_TCLUNK = 120, + P9_RCLUNK, + P9_TREMOVE = 122, + P9_RREMOVE, + P9_TSTAT = 124, + P9_RSTAT, + P9_TWSTAT = 126, + P9_RWSTAT, +}; + + +/* qid.types */ +enum { + P9_QTDIR = 0x80, + P9_QTAPPEND = 0x40, + P9_QTEXCL = 0x20, + P9_QTMOUNT = 0x10, + P9_QTAUTH = 0x08, + P9_QTTMP = 0x04, + P9_QTSYMLINK = 0x02, + P9_QTLINK = 0x01, + P9_QTFILE = 0x00, +}; + +enum p9_proto_version { + V9FS_PROTO_2000U = 0x01, + V9FS_PROTO_2000L = 0x02, +}; + +#define P9_NOTAG (u16)(~0) +#define P9_NOFID (u32)(~0) +#define P9_MAXWELEM 16 + +#define FID_REFERENCED 0x1 +#define FID_NON_RECLAIMABLE 0x2 +static inline char *rpath(FsContext *ctx, const char *path) +{ + return g_strdup_printf("%s/%s", ctx->fs_root, path); +} + +/* + * ample room for Twrite/Rread header + * size[4] Tread/Twrite tag[2] fid[4] offset[8] count[4] + */ +#define P9_IOHDRSZ 24 + +typedef struct V9fsPDU V9fsPDU; +struct V9fsState; + +struct V9fsPDU +{ + uint32_t size; + uint16_t tag; + uint8_t id; + uint8_t cancelled; + CoQueue complete; + VirtQueueElement elem; + struct V9fsState *s; + QLIST_ENTRY(V9fsPDU) next; +}; + + +/* FIXME + * 1) change user needs to set groups and stuff + */ + +#define MAX_REQ 128 +#define MAX_TAG_LEN 32 + +#define BUG_ON(cond) assert(!(cond)) + +typedef struct V9fsFidState V9fsFidState; + +enum { + P9_FID_NONE = 0, + P9_FID_FILE, + P9_FID_DIR, + P9_FID_XATTR, +}; + +typedef struct V9fsConf +{ + /* tag name for the device */ + char *tag; + char *fsdev_id; +} V9fsConf; + +typedef struct V9fsXattr +{ + int64_t copied_len; + int64_t len; + void *value; + V9fsString name; + int flags; +} V9fsXattr; + +/* + * Filled by fs driver on open and other + * calls. + */ +union V9fsFidOpenState { + int fd; + DIR *dir; + V9fsXattr xattr; + /* + * private pointer for fs drivers, that + * have its own internal representation of + * open files. + */ + void *private; +}; + +struct V9fsFidState +{ + int fid_type; + int32_t fid; + V9fsPath path; + V9fsFidOpenState fs; + V9fsFidOpenState fs_reclaim; + int flags; + int open_flags; + uid_t uid; + int ref; + int clunked; + V9fsFidState *next; + V9fsFidState *rclm_lst; +}; + +typedef struct V9fsState +{ + VirtIODevice parent_obj; + VirtQueue *vq; + V9fsPDU pdus[MAX_REQ]; + QLIST_HEAD(, V9fsPDU) free_list; + QLIST_HEAD(, V9fsPDU) active_list; + V9fsFidState *fid_list; + FileOperations *ops; + FsContext ctx; + char *tag; + size_t config_size; + enum p9_proto_version proto_version; + int32_t msize; + /* + * lock ensuring atomic path update + * on rename. + */ + CoRwlock rename_lock; + int32_t root_fid; + Error *migration_blocker; + V9fsConf fsconf; +} V9fsState; + +/* 9p2000.L open flags */ +#define P9_DOTL_RDONLY 00000000 +#define P9_DOTL_WRONLY 00000001 +#define P9_DOTL_RDWR 00000002 +#define P9_DOTL_NOACCESS 00000003 +#define P9_DOTL_CREATE 00000100 +#define P9_DOTL_EXCL 00000200 +#define P9_DOTL_NOCTTY 00000400 +#define P9_DOTL_TRUNC 00001000 +#define P9_DOTL_APPEND 00002000 +#define P9_DOTL_NONBLOCK 00004000 +#define P9_DOTL_DSYNC 00010000 +#define P9_DOTL_FASYNC 00020000 +#define P9_DOTL_DIRECT 00040000 +#define P9_DOTL_LARGEFILE 00100000 +#define P9_DOTL_DIRECTORY 00200000 +#define P9_DOTL_NOFOLLOW 00400000 +#define P9_DOTL_NOATIME 01000000 +#define P9_DOTL_CLOEXEC 02000000 +#define P9_DOTL_SYNC 04000000 + +/* 9p2000.L at flags */ +#define P9_DOTL_AT_REMOVEDIR 0x200 + +/* 9P2000.L lock type */ +#define P9_LOCK_TYPE_RDLCK 0 +#define P9_LOCK_TYPE_WRLCK 1 +#define P9_LOCK_TYPE_UNLCK 2 + +#define P9_LOCK_SUCCESS 0 +#define P9_LOCK_BLOCKED 1 +#define P9_LOCK_ERROR 2 +#define P9_LOCK_GRACE 3 + +#define P9_LOCK_FLAGS_BLOCK 1 +#define P9_LOCK_FLAGS_RECLAIM 2 + +typedef struct V9fsFlock +{ + uint8_t type; + uint32_t flags; + uint64_t start; /* absolute offset */ + uint64_t length; + uint32_t proc_id; + V9fsString client_id; +} V9fsFlock; + +typedef struct V9fsGetlock +{ + uint8_t type; + uint64_t start; /* absolute offset */ + uint64_t length; + uint32_t proc_id; + V9fsString client_id; +} V9fsGetlock; + +extern int open_fd_hw; +extern int total_open_fd; + +static inline void v9fs_path_write_lock(V9fsState *s) +{ + if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { + qemu_co_rwlock_wrlock(&s->rename_lock); + } +} + +static inline void v9fs_path_read_lock(V9fsState *s) +{ + if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { + qemu_co_rwlock_rdlock(&s->rename_lock); + } +} + +static inline void v9fs_path_unlock(V9fsState *s) +{ + if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { + qemu_co_rwlock_unlock(&s->rename_lock); + } +} + +static inline uint8_t v9fs_request_cancelled(V9fsPDU *pdu) +{ + return pdu->cancelled; +} + +extern void v9fs_reclaim_fd(V9fsPDU *pdu); +extern void v9fs_path_init(V9fsPath *path); +extern void v9fs_path_free(V9fsPath *path); +extern void v9fs_path_copy(V9fsPath *lhs, V9fsPath *rhs); +extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, + const char *name, V9fsPath *path); + +ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); +ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); + +#endif diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 5024ad0460..b4d344af95 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -1,328 +1,11 @@ #ifndef _QEMU_VIRTIO_9P_H #define _QEMU_VIRTIO_9P_H -#include -#include -#include -#include -#include -#include #include "standard-headers/linux/virtio_9p.h" #include "hw/virtio/virtio.h" -#include "fsdev/file-op-9p.h" -#include "fsdev/9p-iov-marshal.h" -#include "qemu/thread.h" -#include "qemu/coroutine.h" - -enum { - P9_TLERROR = 6, - P9_RLERROR, - P9_TSTATFS = 8, - P9_RSTATFS, - P9_TLOPEN = 12, - P9_RLOPEN, - P9_TLCREATE = 14, - P9_RLCREATE, - P9_TSYMLINK = 16, - P9_RSYMLINK, - P9_TMKNOD = 18, - P9_RMKNOD, - P9_TRENAME = 20, - P9_RRENAME, - P9_TREADLINK = 22, - P9_RREADLINK, - P9_TGETATTR = 24, - P9_RGETATTR, - P9_TSETATTR = 26, - P9_RSETATTR, - P9_TXATTRWALK = 30, - P9_RXATTRWALK, - P9_TXATTRCREATE = 32, - P9_RXATTRCREATE, - P9_TREADDIR = 40, - P9_RREADDIR, - P9_TFSYNC = 50, - P9_RFSYNC, - P9_TLOCK = 52, - P9_RLOCK, - P9_TGETLOCK = 54, - P9_RGETLOCK, - P9_TLINK = 70, - P9_RLINK, - P9_TMKDIR = 72, - P9_RMKDIR, - P9_TRENAMEAT = 74, - P9_RRENAMEAT, - P9_TUNLINKAT = 76, - P9_RUNLINKAT, - P9_TVERSION = 100, - P9_RVERSION, - P9_TAUTH = 102, - P9_RAUTH, - P9_TATTACH = 104, - P9_RATTACH, - P9_TERROR = 106, - P9_RERROR, - P9_TFLUSH = 108, - P9_RFLUSH, - P9_TWALK = 110, - P9_RWALK, - P9_TOPEN = 112, - P9_ROPEN, - P9_TCREATE = 114, - P9_RCREATE, - P9_TREAD = 116, - P9_RREAD, - P9_TWRITE = 118, - P9_RWRITE, - P9_TCLUNK = 120, - P9_RCLUNK, - P9_TREMOVE = 122, - P9_RREMOVE, - P9_TSTAT = 124, - P9_RSTAT, - P9_TWSTAT = 126, - P9_RWSTAT, -}; - - -/* qid.types */ -enum { - P9_QTDIR = 0x80, - P9_QTAPPEND = 0x40, - P9_QTEXCL = 0x20, - P9_QTMOUNT = 0x10, - P9_QTAUTH = 0x08, - P9_QTTMP = 0x04, - P9_QTSYMLINK = 0x02, - P9_QTLINK = 0x01, - P9_QTFILE = 0x00, -}; - -enum p9_proto_version { - V9FS_PROTO_2000U = 0x01, - V9FS_PROTO_2000L = 0x02, -}; - -#define P9_NOTAG (u16)(~0) -#define P9_NOFID (u32)(~0) -#define P9_MAXWELEM 16 - -#define FID_REFERENCED 0x1 -#define FID_NON_RECLAIMABLE 0x2 -static inline char *rpath(FsContext *ctx, const char *path) -{ - return g_strdup_printf("%s/%s", ctx->fs_root, path); -} - -/* - * ample room for Twrite/Rread header - * size[4] Tread/Twrite tag[2] fid[4] offset[8] count[4] - */ -#define P9_IOHDRSZ 24 - -typedef struct V9fsPDU V9fsPDU; -struct V9fsState; - -struct V9fsPDU -{ - uint32_t size; - uint16_t tag; - uint8_t id; - uint8_t cancelled; - CoQueue complete; - VirtQueueElement elem; - struct V9fsState *s; - QLIST_ENTRY(V9fsPDU) next; -}; - - -/* FIXME - * 1) change user needs to set groups and stuff - */ - -#define MAX_REQ 128 -#define MAX_TAG_LEN 32 - -#define BUG_ON(cond) assert(!(cond)) - -typedef struct V9fsFidState V9fsFidState; - -enum { - P9_FID_NONE = 0, - P9_FID_FILE, - P9_FID_DIR, - P9_FID_XATTR, -}; - -typedef struct V9fsConf -{ - /* tag name for the device */ - char *tag; - char *fsdev_id; -} V9fsConf; - -typedef struct V9fsXattr -{ - int64_t copied_len; - int64_t len; - void *value; - V9fsString name; - int flags; -} V9fsXattr; - -/* - * Filled by fs driver on open and other - * calls. - */ -union V9fsFidOpenState { - int fd; - DIR *dir; - V9fsXattr xattr; - /* - * private pointer for fs drivers, that - * have its own internal representation of - * open files. - */ - void *private; -}; - -struct V9fsFidState -{ - int fid_type; - int32_t fid; - V9fsPath path; - V9fsFidOpenState fs; - V9fsFidOpenState fs_reclaim; - int flags; - int open_flags; - uid_t uid; - int ref; - int clunked; - V9fsFidState *next; - V9fsFidState *rclm_lst; -}; - -typedef struct V9fsState -{ - VirtIODevice parent_obj; - VirtQueue *vq; - V9fsPDU pdus[MAX_REQ]; - QLIST_HEAD(, V9fsPDU) free_list; - QLIST_HEAD(, V9fsPDU) active_list; - V9fsFidState *fid_list; - FileOperations *ops; - FsContext ctx; - char *tag; - size_t config_size; - enum p9_proto_version proto_version; - int32_t msize; - /* - * lock ensuring atomic path update - * on rename. - */ - CoRwlock rename_lock; - int32_t root_fid; - Error *migration_blocker; - V9fsConf fsconf; -} V9fsState; - -/* 9p2000.L open flags */ -#define P9_DOTL_RDONLY 00000000 -#define P9_DOTL_WRONLY 00000001 -#define P9_DOTL_RDWR 00000002 -#define P9_DOTL_NOACCESS 00000003 -#define P9_DOTL_CREATE 00000100 -#define P9_DOTL_EXCL 00000200 -#define P9_DOTL_NOCTTY 00000400 -#define P9_DOTL_TRUNC 00001000 -#define P9_DOTL_APPEND 00002000 -#define P9_DOTL_NONBLOCK 00004000 -#define P9_DOTL_DSYNC 00010000 -#define P9_DOTL_FASYNC 00020000 -#define P9_DOTL_DIRECT 00040000 -#define P9_DOTL_LARGEFILE 00100000 -#define P9_DOTL_DIRECTORY 00200000 -#define P9_DOTL_NOFOLLOW 00400000 -#define P9_DOTL_NOATIME 01000000 -#define P9_DOTL_CLOEXEC 02000000 -#define P9_DOTL_SYNC 04000000 - -/* 9p2000.L at flags */ -#define P9_DOTL_AT_REMOVEDIR 0x200 - -/* 9P2000.L lock type */ -#define P9_LOCK_TYPE_RDLCK 0 -#define P9_LOCK_TYPE_WRLCK 1 -#define P9_LOCK_TYPE_UNLCK 2 - -#define P9_LOCK_SUCCESS 0 -#define P9_LOCK_BLOCKED 1 -#define P9_LOCK_ERROR 2 -#define P9_LOCK_GRACE 3 - -#define P9_LOCK_FLAGS_BLOCK 1 -#define P9_LOCK_FLAGS_RECLAIM 2 - -typedef struct V9fsFlock -{ - uint8_t type; - uint32_t flags; - uint64_t start; /* absolute offset */ - uint64_t length; - uint32_t proc_id; - V9fsString client_id; -} V9fsFlock; - -typedef struct V9fsGetlock -{ - uint8_t type; - uint64_t start; /* absolute offset */ - uint64_t length; - uint32_t proc_id; - V9fsString client_id; -} V9fsGetlock; - -extern int open_fd_hw; -extern int total_open_fd; - -static inline void v9fs_path_write_lock(V9fsState *s) -{ - if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { - qemu_co_rwlock_wrlock(&s->rename_lock); - } -} - -static inline void v9fs_path_read_lock(V9fsState *s) -{ - if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { - qemu_co_rwlock_rdlock(&s->rename_lock); - } -} - -static inline void v9fs_path_unlock(V9fsState *s) -{ - if (s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT) { - qemu_co_rwlock_unlock(&s->rename_lock); - } -} - -static inline uint8_t v9fs_request_cancelled(V9fsPDU *pdu) -{ - return pdu->cancelled; -} +#include "9p.h" extern void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq); -extern void v9fs_reclaim_fd(V9fsPDU *pdu); -extern void v9fs_path_init(V9fsPath *path); -extern void v9fs_path_free(V9fsPath *path); -extern void v9fs_path_copy(V9fsPath *lhs, V9fsPath *rhs); -extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, - const char *name, V9fsPath *path); - -ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); -ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); - ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, From 0d3716b4e6ba81e8632c4ca698488b6e843f9daf Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 7 Jan 2016 18:30:29 +0000 Subject: [PATCH 19/25] 9pfs: factor out virtio_9p_push_and_notify The new function resides in virtio specific file. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-device.c | 11 +++++++++++ hw/9pfs/virtio-9p.c | 8 +------- hw/9pfs/virtio-9p.h | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 5cad654d8e..cfad13afe7 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -20,6 +20,17 @@ #include "coth.h" #include "hw/virtio/virtio-access.h" +void virtio_9p_push_and_notify(V9fsPDU *pdu) +{ + V9fsState *s = pdu->s; + + /* push onto queue and notify */ + virtqueue_push(s->vq, &pdu->elem, pdu->size); + + /* FIXME: we should batch these completions */ + virtio_notify(VIRTIO_DEVICE(s), s->vq); +} + static uint64_t virtio_9p_get_features(VirtIODevice *vdev, uint64_t features, Error **errp) { diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 2bd862fd94..691a1d91f2 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -65,13 +65,7 @@ ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) static void pdu_push_and_notify(V9fsPDU *pdu) { - V9fsState *s = pdu->s; - - /* push onto queue and notify */ - virtqueue_push(s->vq, &pdu->elem, pdu->size); - - /* FIXME: we should batch these completions */ - virtio_notify(VIRTIO_DEVICE(s), s->vq); + virtio_9p_push_and_notify(pdu); } static int omode_to_uflags(int8_t mode) diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index b4d344af95..a1ac3980ee 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -6,6 +6,8 @@ #include "9p.h" extern void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq); +extern void virtio_9p_push_and_notify(V9fsPDU *pdu); + ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap); ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, From 4b311c5f0b298bef6880656f00c628526a827081 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 7 Jan 2016 18:35:12 +0000 Subject: [PATCH 20/25] 9pfs: export pdu_{submit,alloc,free} They will be used in later patches. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/9p.h | 3 +++ hw/9pfs/virtio-9p.c | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h index 9aeb8745cf..b62c9a885a 100644 --- a/hw/9pfs/9p.h +++ b/hw/9pfs/9p.h @@ -321,5 +321,8 @@ extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); +V9fsPDU *pdu_alloc(V9fsState *s); +void pdu_free(V9fsPDU *pdu); +void pdu_submit(V9fsPDU *pdu); #endif diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 691a1d91f2..3d5140d1e3 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -592,7 +592,7 @@ static int fid_to_qid(V9fsPDU *pdu, V9fsFidState *fidp, V9fsQID *qidp) return 0; } -static V9fsPDU *pdu_alloc(V9fsState *s) +V9fsPDU *pdu_alloc(V9fsState *s) { V9fsPDU *pdu = NULL; @@ -604,7 +604,7 @@ static V9fsPDU *pdu_alloc(V9fsState *s) return pdu; } -static void pdu_free(V9fsPDU *pdu) +void pdu_free(V9fsPDU *pdu) { if (pdu) { V9fsState *s = pdu->s; @@ -3246,7 +3246,7 @@ static inline bool is_read_only_op(V9fsPDU *pdu) } } -static void pdu_submit(V9fsPDU *pdu) +void pdu_submit(V9fsPDU *pdu) { Coroutine *co; CoroutineEntry *handler; From 0192cc5d796a0bdf679b786c7244ec5211be6791 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 7 Jan 2016 18:37:25 +0000 Subject: [PATCH 21/25] 9pfs: move handle_9p_output and make it static function It's only used in virtio device. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-device.c | 34 ++++++++++++++++++++++++++++++++++ hw/9pfs/virtio-9p.c | 33 --------------------------------- hw/9pfs/virtio-9p.h | 1 - 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index cfad13afe7..bc103b7fa7 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -19,6 +19,7 @@ #include "9p-xattr.h" #include "coth.h" #include "hw/virtio/virtio-access.h" +#include "qemu/iov.h" void virtio_9p_push_and_notify(V9fsPDU *pdu) { @@ -31,6 +32,39 @@ void virtio_9p_push_and_notify(V9fsPDU *pdu) virtio_notify(VIRTIO_DEVICE(s), s->vq); } +static void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) +{ + V9fsState *s = (V9fsState *)vdev; + V9fsPDU *pdu; + ssize_t len; + + while ((pdu = pdu_alloc(s)) && + (len = virtqueue_pop(vq, &pdu->elem)) != 0) { + struct { + uint32_t size_le; + uint8_t id; + uint16_t tag_le; + } QEMU_PACKED out; + int len; + + BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0); + QEMU_BUILD_BUG_ON(sizeof out != 7); + + len = iov_to_buf(pdu->elem.out_sg, pdu->elem.out_num, 0, + &out, sizeof out); + BUG_ON(len != sizeof out); + + pdu->size = le32_to_cpu(out.size_le); + + pdu->id = out.id; + pdu->tag = le16_to_cpu(out.tag_le); + + qemu_co_queue_init(&pdu->complete); + pdu_submit(pdu); + } + pdu_free(pdu); +} + static uint64_t virtio_9p_get_features(VirtIODevice *vdev, uint64_t features, Error **errp) { diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 3d5140d1e3..7fb0524098 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -3266,39 +3266,6 @@ void pdu_submit(V9fsPDU *pdu) qemu_coroutine_enter(co, pdu); } -void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) -{ - V9fsState *s = (V9fsState *)vdev; - V9fsPDU *pdu; - ssize_t len; - - while ((pdu = pdu_alloc(s)) && - (len = virtqueue_pop(vq, &pdu->elem)) != 0) { - struct { - uint32_t size_le; - uint8_t id; - uint16_t tag_le; - } QEMU_PACKED out; - int len; - - BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0); - QEMU_BUILD_BUG_ON(sizeof out != 7); - - len = iov_to_buf(pdu->elem.out_sg, pdu->elem.out_num, 0, - &out, sizeof out); - BUG_ON(len != sizeof out); - - pdu->size = le32_to_cpu(out.size_le); - - pdu->id = out.id; - pdu->tag = le16_to_cpu(out.tag_le); - - qemu_co_queue_init(&pdu->complete); - pdu_submit(pdu); - } - pdu_free(pdu); -} - static void __attribute__((__constructor__)) virtio_9p_set_fd_limit(void) { struct rlimit rlim; diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index a1ac3980ee..474ab94c08 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -5,7 +5,6 @@ #include "hw/virtio/virtio.h" #include "9p.h" -extern void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq); extern void virtio_9p_push_and_notify(V9fsPDU *pdu); ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, From 72a189770a2d88a589e5ba024f34b8696f8c1a70 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 7 Jan 2016 18:40:09 +0000 Subject: [PATCH 22/25] 9pfs: rename virtio_9p_set_fd_limit to use v9fs_ prefix It's not virtio specific. Signed-off-by: Wei Liu --- hw/9pfs/virtio-9p.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 7fb0524098..379fdcb2fe 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -3266,7 +3266,7 @@ void pdu_submit(V9fsPDU *pdu) qemu_coroutine_enter(co, pdu); } -static void __attribute__((__constructor__)) virtio_9p_set_fd_limit(void) +static void __attribute__((__constructor__)) v9fs_set_fd_limit(void) { struct rlimit rlim; if (getrlimit(RLIMIT_NOFILE, &rlim) < 0) { From 60ce86c7140d5ca33d5fd87ce821681165d06b2a Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 7 Jan 2016 18:42:20 +0000 Subject: [PATCH 23/25] 9pfs: rename virtio-9p.c to 9p.c Now that file only contains generic code. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/{virtio-9p.c => 9p.c} | 0 hw/9pfs/Makefile.objs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename hw/9pfs/{virtio-9p.c => 9p.c} (100%) diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/9p.c similarity index 100% rename from hw/9pfs/virtio-9p.c rename to hw/9pfs/9p.c diff --git a/hw/9pfs/Makefile.objs b/hw/9pfs/Makefile.objs index 838c5e1eb9..da0ae0cfdb 100644 --- a/hw/9pfs/Makefile.objs +++ b/hw/9pfs/Makefile.objs @@ -1,4 +1,4 @@ -common-obj-y = virtio-9p.o +common-obj-y = 9p.o common-obj-y += 9p-local.o 9p-xattr.o common-obj-y += 9p-xattr-user.o 9p-posix-acl.o common-obj-y += coth.o cofs.o codir.o cofile.o From 2a0c56aa4c3e9a9f0b7678015ef96afe3e841506 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Thu, 3 Dec 2015 11:55:49 +0000 Subject: [PATCH 24/25] 9pfs: factor out v9fs_device_{,un}realize_common Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/9p.c | 95 ++++++++++++++++++++++++++++++++++++++ hw/9pfs/9p.h | 2 + hw/9pfs/virtio-9p-device.c | 90 +++--------------------------------- 3 files changed, 104 insertions(+), 83 deletions(-) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 379fdcb2fe..a9044039ae 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -3266,6 +3266,101 @@ void pdu_submit(V9fsPDU *pdu) qemu_coroutine_enter(co, pdu); } +/* Returns 0 on success, 1 on failure. */ +int v9fs_device_realize_common(V9fsState *s, Error **errp) +{ + int i, len; + struct stat stat; + FsDriverEntry *fse; + V9fsPath path; + int rc = 1; + + /* initialize pdu allocator */ + QLIST_INIT(&s->free_list); + QLIST_INIT(&s->active_list); + for (i = 0; i < (MAX_REQ - 1); i++) { + QLIST_INSERT_HEAD(&s->free_list, &s->pdus[i], next); + s->pdus[i].s = s; + } + + v9fs_path_init(&path); + + fse = get_fsdev_fsentry(s->fsconf.fsdev_id); + + if (!fse) { + /* We don't have a fsdev identified by fsdev_id */ + error_setg(errp, "9pfs device couldn't find fsdev with the " + "id = %s", + s->fsconf.fsdev_id ? s->fsconf.fsdev_id : "NULL"); + goto out; + } + + if (!s->fsconf.tag) { + /* we haven't specified a mount_tag */ + error_setg(errp, "fsdev with id %s needs mount_tag arguments", + s->fsconf.fsdev_id); + goto out; + } + + s->ctx.export_flags = fse->export_flags; + s->ctx.fs_root = g_strdup(fse->path); + s->ctx.exops.get_st_gen = NULL; + len = strlen(s->fsconf.tag); + if (len > MAX_TAG_LEN - 1) { + error_setg(errp, "mount tag '%s' (%d bytes) is longer than " + "maximum (%d bytes)", s->fsconf.tag, len, MAX_TAG_LEN - 1); + goto out; + } + + s->tag = g_strdup(s->fsconf.tag); + s->ctx.uid = -1; + + s->ops = fse->ops; + + s->fid_list = NULL; + qemu_co_rwlock_init(&s->rename_lock); + + if (s->ops->init(&s->ctx) < 0) { + error_setg(errp, "9pfs Failed to initialize fs-driver with id:%s" + " and export path:%s", s->fsconf.fsdev_id, s->ctx.fs_root); + goto out; + } + + /* + * Check details of export path, We need to use fs driver + * call back to do that. Since we are in the init path, we don't + * use co-routines here. + */ + if (s->ops->name_to_path(&s->ctx, NULL, "/", &path) < 0) { + error_setg(errp, + "error in converting name to path %s", strerror(errno)); + goto out; + } + if (s->ops->lstat(&s->ctx, &path, &stat)) { + error_setg(errp, "share path %s does not exist", fse->path); + goto out; + } else if (!S_ISDIR(stat.st_mode)) { + error_setg(errp, "share path %s is not a directory", fse->path); + goto out; + } + v9fs_path_free(&path); + + rc = 0; +out: + if (rc) { + g_free(s->ctx.fs_root); + g_free(s->tag); + v9fs_path_free(&path); + } + return rc; +} + +void v9fs_device_unrealize_common(V9fsState *s, Error **errp) +{ + g_free(s->ctx.fs_root); + g_free(s->tag); +} + static void __attribute__((__constructor__)) v9fs_set_fd_limit(void) { struct rlimit rlim; diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h index b62c9a885a..3fe4da4e28 100644 --- a/hw/9pfs/9p.h +++ b/hw/9pfs/9p.h @@ -318,6 +318,8 @@ extern void v9fs_path_free(V9fsPath *path); extern void v9fs_path_copy(V9fsPath *lhs, V9fsPath *rhs); extern int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, const char *name, V9fsPath *path); +extern int v9fs_device_realize_common(V9fsState *s, Error **errp); +extern void v9fs_device_unrealize_common(V9fsState *s, Error **errp); ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...); diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index bc103b7fa7..4aa8a6b33e 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -101,93 +101,18 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp) { VirtIODevice *vdev = VIRTIO_DEVICE(dev); V9fsState *s = VIRTIO_9P(dev); - int i, len; - struct stat stat; - FsDriverEntry *fse; - V9fsPath path; - virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P, - sizeof(struct virtio_9p_config) + MAX_TAG_LEN); - - /* initialize pdu allocator */ - QLIST_INIT(&s->free_list); - QLIST_INIT(&s->active_list); - for (i = 0; i < (MAX_REQ - 1); i++) { - QLIST_INSERT_HEAD(&s->free_list, &s->pdus[i], next); - s->pdus[i].s = s; + if (v9fs_device_realize_common(s, errp)) { + goto out; } + s->config_size = sizeof(struct virtio_9p_config) + strlen(s->fsconf.tag); + virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P, s->config_size); s->vq = virtio_add_queue(vdev, MAX_REQ, handle_9p_output); - - v9fs_path_init(&path); - - fse = get_fsdev_fsentry(s->fsconf.fsdev_id); - - if (!fse) { - /* We don't have a fsdev identified by fsdev_id */ - error_setg(errp, "Virtio-9p device couldn't find fsdev with the " - "id = %s", - s->fsconf.fsdev_id ? s->fsconf.fsdev_id : "NULL"); - goto out; - } - - if (!s->fsconf.tag) { - /* we haven't specified a mount_tag */ - error_setg(errp, "fsdev with id %s needs mount_tag arguments", - s->fsconf.fsdev_id); - goto out; - } - - s->ctx.export_flags = fse->export_flags; - s->ctx.fs_root = g_strdup(fse->path); - s->ctx.exops.get_st_gen = NULL; - len = strlen(s->fsconf.tag); - if (len > MAX_TAG_LEN - 1) { - error_setg(errp, "mount tag '%s' (%d bytes) is longer than " - "maximum (%d bytes)", s->fsconf.tag, len, MAX_TAG_LEN - 1); - goto out; - } - - s->tag = g_strdup(s->fsconf.tag); - s->ctx.uid = -1; - - s->ops = fse->ops; - s->config_size = sizeof(struct virtio_9p_config) + len; - s->fid_list = NULL; - qemu_co_rwlock_init(&s->rename_lock); - - if (s->ops->init(&s->ctx) < 0) { - error_setg(errp, "Virtio-9p Failed to initialize fs-driver with id:%s" - " and export path:%s", s->fsconf.fsdev_id, s->ctx.fs_root); - goto out; - } - - /* - * Check details of export path, We need to use fs driver - * call back to do that. Since we are in the init path, we don't - * use co-routines here. - */ - if (s->ops->name_to_path(&s->ctx, NULL, "/", &path) < 0) { - error_setg(errp, - "error in converting name to path %s", strerror(errno)); - goto out; - } - if (s->ops->lstat(&s->ctx, &path, &stat)) { - error_setg(errp, "share path %s does not exist", fse->path); - goto out; - } else if (!S_ISDIR(stat.st_mode)) { - error_setg(errp, "share path %s is not a directory", fse->path); - goto out; - } - v9fs_path_free(&path); - register_savevm(dev, "virtio-9p", -1, 1, virtio_9p_save, virtio_9p_load, s); - return; + out: - g_free(s->ctx.fs_root); - g_free(s->tag); - virtio_cleanup(vdev); - v9fs_path_free(&path); + return; } static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp) @@ -197,8 +122,7 @@ static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp) virtio_cleanup(vdev); unregister_savevm(dev, "virtio-9p", s); - g_free(s->ctx.fs_root); - g_free(s->tag); + v9fs_device_unrealize_common(s, errp); } ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, From 00588a0aa2ade2e32a552633bbbefdc6ae5e32a2 Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Mon, 11 Jan 2016 09:29:37 +0000 Subject: [PATCH 25/25] 9pfs: introduce V9fsVirtioState V9fsState now only contains generic fields. Introduce V9fsVirtioState for virtio transport. Change virtio-pci and virtio-ccw to use V9fsVirtioState. Signed-off-by: Wei Liu Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/9p.c | 11 ++++-- hw/9pfs/9p.h | 6 +-- hw/9pfs/virtio-9p-device.c | 78 ++++++++++++++++++++++++-------------- hw/9pfs/virtio-9p.h | 12 +++++- hw/s390x/virtio-ccw.h | 2 +- hw/virtio/virtio-pci.h | 2 +- 6 files changed, 71 insertions(+), 40 deletions(-) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index a9044039ae..3ff310605c 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -1585,6 +1585,8 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, size_t offset = 7; int read_count; int64_t xattr_len; + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); + VirtQueueElement *elem = &v->elems[pdu->idx]; xattr_len = fidp->fs.xattr.len; read_count = xattr_len - off; @@ -1601,7 +1603,8 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, return err; } offset += err; - err = v9fs_pack(pdu->elem.in_sg, pdu->elem.in_num, offset, + + err = v9fs_pack(elem->in_sg, elem->in_num, offset, ((char *)fidp->fs.xattr.value) + off, read_count); if (err < 0) { @@ -3269,6 +3272,7 @@ void pdu_submit(V9fsPDU *pdu) /* Returns 0 on success, 1 on failure. */ int v9fs_device_realize_common(V9fsState *s, Error **errp) { + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); int i, len; struct stat stat; FsDriverEntry *fse; @@ -3279,8 +3283,9 @@ int v9fs_device_realize_common(V9fsState *s, Error **errp) QLIST_INIT(&s->free_list); QLIST_INIT(&s->active_list); for (i = 0; i < (MAX_REQ - 1); i++) { - QLIST_INSERT_HEAD(&s->free_list, &s->pdus[i], next); - s->pdus[i].s = s; + QLIST_INSERT_HEAD(&s->free_list, &v->pdus[i], next); + v->pdus[i].s = s; + v->pdus[i].idx = i; } v9fs_path_init(&path); diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h index 3fe4da4e28..edcd51be15 100644 --- a/hw/9pfs/9p.h +++ b/hw/9pfs/9p.h @@ -131,9 +131,9 @@ struct V9fsPDU uint8_t id; uint8_t cancelled; CoQueue complete; - VirtQueueElement elem; struct V9fsState *s; QLIST_ENTRY(V9fsPDU) next; + uint32_t idx; }; @@ -205,16 +205,12 @@ struct V9fsFidState typedef struct V9fsState { - VirtIODevice parent_obj; - VirtQueue *vq; - V9fsPDU pdus[MAX_REQ]; QLIST_HEAD(, V9fsPDU) free_list; QLIST_HEAD(, V9fsPDU) active_list; V9fsFidState *fid_list; FileOperations *ops; FsContext ctx; char *tag; - size_t config_size; enum p9_proto_version proto_version; int32_t msize; /* diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 4aa8a6b33e..5643fd5b13 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -24,33 +24,41 @@ void virtio_9p_push_and_notify(V9fsPDU *pdu) { V9fsState *s = pdu->s; + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); + VirtQueueElement *elem = &v->elems[pdu->idx]; /* push onto queue and notify */ - virtqueue_push(s->vq, &pdu->elem, pdu->size); + virtqueue_push(v->vq, elem, pdu->size); /* FIXME: we should batch these completions */ - virtio_notify(VIRTIO_DEVICE(s), s->vq); + virtio_notify(VIRTIO_DEVICE(v), v->vq); } static void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) { - V9fsState *s = (V9fsState *)vdev; + V9fsVirtioState *v = (V9fsVirtioState *)vdev; + V9fsState *s = &v->state; V9fsPDU *pdu; ssize_t len; - while ((pdu = pdu_alloc(s)) && - (len = virtqueue_pop(vq, &pdu->elem)) != 0) { + while ((pdu = pdu_alloc(s))) { struct { uint32_t size_le; uint8_t id; uint16_t tag_le; } QEMU_PACKED out; - int len; + VirtQueueElement *elem = &v->elems[pdu->idx]; - BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0); + len = virtqueue_pop(vq, elem); + if (!len) { + pdu_free(pdu); + break; + } + + BUG_ON(elem->out_num == 0 || elem->in_num == 0); QEMU_BUILD_BUG_ON(sizeof out != 7); - len = iov_to_buf(pdu->elem.out_sg, pdu->elem.out_num, 0, + len = iov_to_buf(elem->out_sg, elem->out_num, 0, &out, sizeof out); BUG_ON(len != sizeof out); @@ -62,7 +70,6 @@ static void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq) qemu_co_queue_init(&pdu->complete); pdu_submit(pdu); } - pdu_free(pdu); } static uint64_t virtio_9p_get_features(VirtIODevice *vdev, uint64_t features, @@ -76,14 +83,15 @@ static void virtio_9p_get_config(VirtIODevice *vdev, uint8_t *config) { int len; struct virtio_9p_config *cfg; - V9fsState *s = VIRTIO_9P(vdev); + V9fsVirtioState *v = VIRTIO_9P(vdev); + V9fsState *s = &v->state; len = strlen(s->tag); cfg = g_malloc0(sizeof(struct virtio_9p_config) + len); virtio_stw_p(vdev, &cfg->tag_len, len); /* We don't copy the terminating null to config space */ memcpy(cfg->tag, s->tag, len); - memcpy(config, cfg, s->config_size); + memcpy(config, cfg, v->config_size); g_free(cfg); } @@ -100,16 +108,17 @@ static int virtio_9p_load(QEMUFile *f, void *opaque, int version_id) static void virtio_9p_device_realize(DeviceState *dev, Error **errp) { VirtIODevice *vdev = VIRTIO_DEVICE(dev); - V9fsState *s = VIRTIO_9P(dev); + V9fsVirtioState *v = VIRTIO_9P(dev); + V9fsState *s = &v->state; if (v9fs_device_realize_common(s, errp)) { goto out; } - s->config_size = sizeof(struct virtio_9p_config) + strlen(s->fsconf.tag); - virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P, s->config_size); - s->vq = virtio_add_queue(vdev, MAX_REQ, handle_9p_output); - register_savevm(dev, "virtio-9p", -1, 1, virtio_9p_save, virtio_9p_load, s); + v->config_size = sizeof(struct virtio_9p_config) + strlen(s->fsconf.tag); + virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P, v->config_size); + v->vq = virtio_add_queue(vdev, MAX_REQ, handle_9p_output); + register_savevm(dev, "virtio-9p", -1, 1, virtio_9p_save, virtio_9p_load, v); out: return; @@ -118,44 +127,55 @@ out: static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp) { VirtIODevice *vdev = VIRTIO_DEVICE(dev); - V9fsState *s = VIRTIO_9P(dev); + V9fsVirtioState *v = VIRTIO_9P(dev); + V9fsState *s = &v->state; virtio_cleanup(vdev); - unregister_savevm(dev, "virtio-9p", s); + unregister_savevm(dev, "virtio-9p", v); v9fs_device_unrealize_common(s, errp); } ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap) { - return v9fs_iov_vmarshal(pdu->elem.in_sg, pdu->elem.in_num, - offset, 1, fmt, ap); + V9fsState *s = pdu->s; + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); + VirtQueueElement *elem = &v->elems[pdu->idx]; + + return v9fs_iov_vmarshal(elem->in_sg, elem->in_num, offset, 1, fmt, ap); } ssize_t virtio_pdu_vunmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, va_list ap) { - return v9fs_iov_vunmarshal(pdu->elem.out_sg, pdu->elem.out_num, - offset, 1, fmt, ap); + V9fsState *s = pdu->s; + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); + VirtQueueElement *elem = &v->elems[pdu->idx]; + + return v9fs_iov_vunmarshal(elem->out_sg, elem->out_num, offset, 1, fmt, ap); } void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, unsigned int *pniov, bool is_write) { + V9fsState *s = pdu->s; + V9fsVirtioState *v = container_of(s, V9fsVirtioState, state); + VirtQueueElement *elem = &v->elems[pdu->idx]; + if (is_write) { - *piov = pdu->elem.out_sg; - *pniov = pdu->elem.out_num; + *piov = elem->out_sg; + *pniov = elem->out_num; } else { - *piov = pdu->elem.in_sg; - *pniov = pdu->elem.in_num; + *piov = elem->in_sg; + *pniov = elem->in_num; } } /* virtio-9p device */ static Property virtio_9p_properties[] = { - DEFINE_PROP_STRING("mount_tag", V9fsState, fsconf.tag), - DEFINE_PROP_STRING("fsdev", V9fsState, fsconf.fsdev_id), + DEFINE_PROP_STRING("mount_tag", V9fsVirtioState, state.fsconf.tag), + DEFINE_PROP_STRING("fsdev", V9fsVirtioState, state.fsconf.fsdev_id), DEFINE_PROP_END_OF_LIST(), }; @@ -175,7 +195,7 @@ static void virtio_9p_class_init(ObjectClass *klass, void *data) static const TypeInfo virtio_device_info = { .name = TYPE_VIRTIO_9P, .parent = TYPE_VIRTIO_DEVICE, - .instance_size = sizeof(V9fsState), + .instance_size = sizeof(V9fsVirtioState), .class_init = virtio_9p_class_init, }; diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 474ab94c08..1cdf0a2d65 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -5,6 +5,16 @@ #include "hw/virtio/virtio.h" #include "9p.h" +typedef struct V9fsVirtioState +{ + VirtIODevice parent_obj; + VirtQueue *vq; + size_t config_size; + V9fsPDU pdus[MAX_REQ]; + VirtQueueElement elems[MAX_REQ]; + V9fsState state; +} V9fsVirtioState; + extern void virtio_9p_push_and_notify(V9fsPDU *pdu); ssize_t virtio_pdu_vmarshal(V9fsPDU *pdu, size_t offset, @@ -16,6 +26,6 @@ void virtio_init_iov_from_pdu(V9fsPDU *pdu, struct iovec **piov, #define TYPE_VIRTIO_9P "virtio-9p-device" #define VIRTIO_9P(obj) \ - OBJECT_CHECK(V9fsState, (obj), TYPE_VIRTIO_9P) + OBJECT_CHECK(V9fsVirtioState, (obj), TYPE_VIRTIO_9P) #endif diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h index 7ab8367baa..a526d2f2ae 100644 --- a/hw/s390x/virtio-ccw.h +++ b/hw/s390x/virtio-ccw.h @@ -210,7 +210,7 @@ VirtIODevice *virtio_ccw_get_vdev(SubchDev *sch); typedef struct V9fsCCWState { VirtioCcwDevice parent_obj; - V9fsState vdev; + V9fsVirtioState vdev; } V9fsCCWState; #endif /* CONFIG_VIRTFS */ diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h index 7cf597461b..e096e989c0 100644 --- a/hw/virtio/virtio-pci.h +++ b/hw/virtio/virtio-pci.h @@ -242,7 +242,7 @@ struct VirtIONetPCI { typedef struct V9fsPCIState { VirtIOPCIProxy parent_obj; - V9fsState vdev; + V9fsVirtioState vdev; } V9fsPCIState; #endif