From: Gautham R Shenoy <e...@in.ibm.com> Currently the share_path is an attribute of the virtio-9p device.
This patch makes fsdev object as an attribute of virtio-9p device by decoupling the latter's association with share_path. This abstraction would be useful in the future when we want to specify certain file-system specific operations/flags as a part of the command line. So, for now, the command line is going to look something like #qemu -fsdev namefs,id=foo,path="path/to/share" \ -device virtio-9p-pci,fsdev=foo,mount_tag=mount_tag \ . . Signed-off-by: Gautham R Shenoy <e...@in.ibm.com> Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.vnet.ibm.com> --- hw/9p.h | 2 +- hw/virtio-9p-local.c | 5 ----- hw/virtio-9p.c | 29 +++++++++++++++++++++-------- hw/virtio-pci.c | 2 +- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/hw/9p.h b/hw/9p.h index f0ff45b..5fdd770 100644 --- a/hw/9p.h +++ b/hw/9p.h @@ -18,9 +18,9 @@ typedef struct V9fsConf { - char *share_path; /* tag name for the device */ char *tag; + char *fsdev_id; } V9fsConf; #endif diff --git a/hw/virtio-9p-local.c b/hw/virtio-9p-local.c index aae82d2..a0cbcc0 100644 --- a/hw/virtio-9p-local.c +++ b/hw/virtio-9p-local.c @@ -284,8 +284,3 @@ FileOperations local_ops = { .remove = local_remove, .fsync = local_fsync, }; - -FileOperations *virtio_9p_init_local(const char *path) -{ - return &local_ops; -} diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c index d03693d..5ccaeac 100644 --- a/hw/virtio-9p.c +++ b/hw/virtio-9p.c @@ -15,6 +15,7 @@ #include "pc.h" #include "qemu_socket.h" #include "virtio-9p.h" +#include "fsdev/qemu-fsdev.h" #include <assert.h> int dotu = 1; @@ -2214,6 +2215,7 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf) V9fsState *s; int i, len; struct stat stat; + FsTypeEntry *fse; s = (V9fsState *)virtio_common_init("virtio-9p", @@ -2230,21 +2232,32 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf) s->vq = virtio_add_queue(&s->vdev, MAX_REQ, handle_9p_output); - if (!conf->share_path || !conf->tag) { + fse = get_fsdev_fsentry(conf->fsdev_id); + + if (!fse) { + /* We don't have a fsdev identified by fsdev_id */ + fprintf(stderr, "Virtio-9p device couldn't find fsdev " + "with the id %s\n", conf->fsdev_id); + exit(1); + } + + if (!fse->path || !conf->tag) { /* we haven't specified a mount_tag */ - fprintf(stderr, "Virtio-9p devices need share_path " - "and mount_tag arguments\n"); + fprintf(stderr, "fsdev with id %s needs path " + "and Virtio-9p device needs " + "mount_tag arguments\n", conf->fsdev_id); exit(1); } - if (lstat(conf->share_path, &stat)) { - fprintf(stderr, "share path %s does not exist\n", conf->share_path); + if (lstat(fse->path, &stat)) { + fprintf(stderr, "share path %s does not exist\n", fse->path); exit(1); } else if (!S_ISDIR(stat.st_mode)) { - fprintf(stderr, "share path %s is not a directory \n", conf->share_path); + fprintf(stderr, "share path %s is not a directory \n", + fse->path); exit(1); } - s->ctx.fs_root = qemu_strdup(conf->share_path); + s->ctx.fs_root = qemu_strdup(fse->path); len = strlen(conf->tag); if (len > MAX_TAG_LEN) len = MAX_TAG_LEN; @@ -2254,7 +2267,7 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf) s->tag_len = len; s->ctx.uid = -1; - s->ops = virtio_9p_init_local(conf->share_path); + s->ops = fse->ops; s->vdev.get_features = virtio_9p_get_features; s->config_size = sizeof(struct virtio_9p_config) + s->tag_len; diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 73e7df7..6f26b88 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -626,8 +626,8 @@ static PCIDeviceInfo virtio_info[] = { .init = virtio_9p_init_pci, .qdev.props = (Property[]) { DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features), - DEFINE_PROP_STRING("share_path", VirtIOPCIProxy, fsconf.share_path), DEFINE_PROP_STRING("mount_tag", VirtIOPCIProxy, fsconf.tag), + DEFINE_PROP_STRING("fsdev", VirtIOPCIProxy, fsconf.fsdev_id), DEFINE_PROP_END_OF_LIST(), }, },{ -- 1.7.0.2.323.g0d092