The new option is: -fsdev fstype,id=myid,path=/share_path/,security_model=[mapped|passthrough] -virtfs fstype,path=/share_path/,security_model=[mapped|passthrough],mnt_tag=tag In the case of mapped security model, files are created with QEMU user credentials and the client-user's credentials are saved in extended attributes. Whereas in the case of passthrough security model, files on the filesystem are directly created with client-user's credentials. Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
/*
|
|
* 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 = &local_ops},
|
|
};
|
|
|
|
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;
|
|
}
|
|
|
|
if (qemu_opt_get(opts, "security_model") == NULL) {
|
|
fprintf(stderr, "fsdev: No security_model specified.\n");
|
|
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.security_model = qemu_strdup(qemu_opt_get(opts,
|
|
"security_model"));
|
|
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;
|
|
}
|