Commit 74db920c authored by Gautham R Shenoy's avatar Gautham R Shenoy Committed by Anthony Liguori
Browse files

virtio-9p: Create a commandline option -fsdev



This patch creates a new command line option named -fsdev to hold any file
system specific information.

The option will currently hold the following attributes:
-fsdev fstype id=id,path=path_to_share
where
fstype: Type of the file system.
id:     Identifier used to refer to this fsdev
path:   The path on the host that is identified by this fsdev.

[aneesh.kumar@linux.vnet.ibm.com: Abstraction using FsContext]
Signed-off-by: default avatarGautham R Shenoy <ego@in.ibm.com>
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent a1c59752
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -35,6 +35,9 @@ net-nested-$(CONFIG_SLIRP) += slirp.o
net-nested-$(CONFIG_VDE) += vde.o
net-obj-y += $(addprefix net/, $(net-nested-y))

fsdev-nested-$(CONFIG_LINUX) = qemu-fsdev.o
fsdev-obj-$(CONFIG_LINUX) += $(addprefix fsdev/, $(fsdev-nested-y))

######################################################################
# libqemu_common.a: Target independent part of system emulation. The
# long term path is to suppress *all* target specific code in case of
@@ -44,8 +47,8 @@ net-obj-y += $(addprefix net/, $(net-nested-y))
common-obj-y = $(block-obj-y)
common-obj-y += $(net-obj-y)
common-obj-y += $(qobject-obj-y)
common-obj-$(CONFIG_LINUX) += $(fsdev-obj-$(CONFIG_LINUX))
common-obj-y += readline.o console.o async.o qemu-error.o

common-obj-y += tcg-runtime.o host-utils.o
common-obj-y += irq.o ioport.o input.o
common-obj-$(CONFIG_PTIMER) += ptimer.o
+1 −0
Original line number Diff line number Diff line
@@ -2757,6 +2757,7 @@ done # for target in $targets
if test "$source_path_used" = "yes" ; then
    DIRS="tests tests/cris slirp audio block net pc-bios/optionrom"
    DIRS="$DIRS roms/seabios roms/vgabios"
    DIRS="$DIRS fsdev"
    FILES="Makefile tests/Makefile"
    FILES="$FILES tests/cris/Makefile tests/cris/.gdbinit"
    FILES="$FILES tests/test-mmap.c"

fsdev/qemu-fsdev.c

0 → 100644
+70 −0
Original line number Diff line number Diff line
/*
 * Virtio 9p
 *
 * Copyright IBM, Corp. 2010
 *
 * Authors:
 *  Gautham R Shenoy <ego@in.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */
#include <stdio.h>
#include <string.h>
#include "qemu-fsdev.h"
#include "qemu-queue.h"
#include "osdep.h"
#include "qemu-common.h"

static QTAILQ_HEAD(FsTypeEntry_head, FsTypeListEntry) fstype_entries =
    QTAILQ_HEAD_INITIALIZER(fstype_entries);

static FsTypeTable FsTypes[] = {
    { .name = "local", .ops = NULL},
};

int qemu_fsdev_add(QemuOpts *opts)
{
    struct FsTypeListEntry *fsle;
    int i;

    if (qemu_opts_id(opts) == NULL) {
        fprintf(stderr, "fsdev: No id specified\n");
        return -1;
    }

     for (i = 0; i < ARRAY_SIZE(FsTypes); i++) {
        if (strcmp(FsTypes[i].name, qemu_opt_get(opts, "fstype")) == 0) {
            break;
        }
    }

    if (i == ARRAY_SIZE(FsTypes)) {
        fprintf(stderr, "fsdev: fstype %s not found\n",
                    qemu_opt_get(opts, "fstype"));
        return -1;
    }

    fsle = qemu_malloc(sizeof(*fsle));

    fsle->fse.fsdev_id = qemu_strdup(qemu_opts_id(opts));
    fsle->fse.path = qemu_strdup(qemu_opt_get(opts, "path"));
    fsle->fse.ops = FsTypes[i].ops;

    QTAILQ_INSERT_TAIL(&fstype_entries, fsle, next);
    return 0;

}

FsTypeEntry *get_fsdev_fsentry(char *id)
{
    struct FsTypeListEntry *fsle;

    QTAILQ_FOREACH(fsle, &fstype_entries, next) {
        if (strcmp(fsle->fse.fsdev_id, id) == 0) {
            return &fsle->fse;
        }
    }
    return NULL;
}

fsdev/qemu-fsdev.h

0 → 100644
+53 −0
Original line number Diff line number Diff line
/*
 * Virtio 9p
 *
 * Copyright IBM, Corp. 2010
 *
 * Authors:
 *  Gautham R Shenoy <ego@in.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */
#ifndef QEMU_FSDEV_H
#define QEMU_FSDEV_H
#include "qemu-option.h"
#include "hw/file-op-9p.h"


/*
 * A table to store the various file systems and their callback operations.
 * -----------------
 * fstype | ops
 * -----------------
 *  local | local_ops
 *  .     |
 *  .     |
 *  .     |
 *  .     |
 * -----------------
 *  etc
 */
typedef struct FsTypeTable {
    const char *name;
    FileOperations *ops;
} FsTypeTable;

/*
 * Structure to store the various fsdev's passed through command line.
 */
typedef struct FsTypeEntry {
    char *fsdev_id;
    char *path;
    FileOperations *ops;
} FsTypeEntry;

typedef struct FsTypeListEntry {
    FsTypeEntry fse;
    QTAILQ_ENTRY(FsTypeListEntry) next;
} FsTypeListEntry;

extern int qemu_fsdev_add(QemuOpts *opts);
extern FsTypeEntry *get_fsdev_fsentry(char *id);
#endif

hw/file-op-9p.h

0 → 100644
+32 −0
Original line number Diff line number Diff line
/*
 * Virtio 9p
 *
 * Copyright IBM, Corp. 2010
 *
 * Authors:
 *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */
#ifndef _FILEOP_H
#define _FILEOP_H
#include <sys/types.h>
#include <dirent.h>
#include <sys/time.h>
#include <utime.h>
#include <sys/stat.h>
#include <sys/uio.h>

typedef struct FsContext
{
    char *fs_root;
    uid_t uid;
} FsContext;

typedef struct FileOperations
{
    void *opaque;
} FileOperations;
#endif
Loading