mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/kvaneesh/tags/for-upstream-signed' into staging
VirtFS update: Cleanups mostly isolating virtio related details into separate files. This is done to enable easy addition of Xen transport for VirtFS. The changes include: 1. Rename a bunch of files and functions to make clear they are generic. 2. disentangle virtio transport code and generic 9pfs code. 3. Some function name clean-up. # gpg: Signature made Tue 12 Jan 2016 06:04:35 GMT using RSA key ID 04C4E23A # gpg: Good signature from "Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 4846 9DE7 1860 360F A6E9 968C DE41 A4FE 04C4 E23A * remotes/kvaneesh/tags/for-upstream-signed: (25 commits) 9pfs: introduce V9fsVirtioState 9pfs: factor out v9fs_device_{,un}realize_common 9pfs: rename virtio-9p.c to 9p.c 9pfs: rename virtio_9p_set_fd_limit to use v9fs_ prefix 9pfs: move handle_9p_output and make it static function 9pfs: export pdu_{submit,alloc,free} 9pfs: factor out virtio_9p_push_and_notify 9pfs: break out 9p.h from virtio-9p.h 9pfs: break out virtio_init_iov_from_pdu 9pfs: factor out pdu_push_and_notify 9pfs: factor out virtio_pdu_{,un}marshal 9pfs: make pdu_{,un}marshal proper functions 9pfs: PDU processing functions should start pdu_ prefix 9pfs: PDU processing functions don't need to take V9fsState as argument fsdev: rename virtio-9p-marshal.{c,h} to 9p-iov-marshal.{c,h} fsdev: break out 9p-marshal.{c,h} from virtio-9p-marshal.{c,h} 9pfs: remove dead code 9pfs: merge hw/virtio/virtio-9p.h into hw/9pfs/virtio-9p.h 9pfs: rename virtio-9p-xattr{,-user}.{c,h} to 9p-xattr{,-user}.{c,h} 9pfs: rename virtio-9p-synth.{c,h} to 9p-synth.{c,h} ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -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/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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Virtio 9p backend
|
||||
* 9p backend
|
||||
*
|
||||
* Copyright IBM, Corp. 2010
|
||||
*
|
||||
@@ -22,40 +22,9 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include "qemu/compiler.h"
|
||||
#include "virtio-9p-marshal.h"
|
||||
#include "9p-iov-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)
|
||||
{
|
||||
@@ -107,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_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': {
|
||||
@@ -158,8 +125,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);
|
||||
@@ -175,56 +142,70 @@ 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:
|
||||
break;
|
||||
}
|
||||
if (copied < 0) {
|
||||
va_end(ap);
|
||||
return copied;
|
||||
}
|
||||
offset += copied;
|
||||
}
|
||||
va_end(ap);
|
||||
|
||||
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_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': {
|
||||
@@ -264,8 +245,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);
|
||||
@@ -274,49 +255,65 @@ 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:
|
||||
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;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#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, ...);
|
||||
|
||||
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
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* 9p backend
|
||||
*
|
||||
* Copyright IBM, Corp. 2010
|
||||
*
|
||||
* Authors:
|
||||
* Anthony Liguori <aliguori@us.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 <glib.h>
|
||||
#include <glib/gprintf.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/time.h>
|
||||
#include <utime.h>
|
||||
#include <sys/uio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <errno.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef _QEMU_VIRTIO_9P_MARSHAL_H
|
||||
#define _QEMU_VIRTIO_9P_MARSHAL_H
|
||||
#ifndef _QEMU_9P_MARSHAL_H
|
||||
#define _QEMU_9P_MARSHAL_H
|
||||
|
||||
typedef struct V9fsString
|
||||
{
|
||||
@@ -30,7 +30,7 @@ typedef struct V9fsStat
|
||||
V9fsString muid;
|
||||
/* 9p2000.u */
|
||||
V9fsString extension;
|
||||
int32_t n_uid;
|
||||
int32_t n_uid;
|
||||
int32_t n_gid;
|
||||
int32_t n_muid;
|
||||
} V9fsStat;
|
||||
@@ -81,10 +81,4 @@ 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);
|
||||
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
|
||||
+1
-1
@@ -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 9p-iov-marshal.o
|
||||
else
|
||||
common-obj-y = qemu-fsdev-dummy.o
|
||||
endif
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include "qemu/xattr.h"
|
||||
#include "virtio-9p-marshal.h"
|
||||
#include "hw/9pfs/virtio-9p-proxy.h"
|
||||
#include "fsdev/virtio-9p-marshal.h"
|
||||
#include "9p-iov-marshal.h"
|
||||
#include "hw/9pfs/9p-proxy.h"
|
||||
#include "fsdev/9p-iov-marshal.h"
|
||||
|
||||
#define PROGNAME "virtfs-proxy-helper"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Virtio 9p handle callback
|
||||
* 9p handle callback
|
||||
*
|
||||
* Copyright IBM, Corp. 2011
|
||||
*
|
||||
@@ -11,9 +11,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "virtio-9p.h"
|
||||
#include "virtio-9p-xattr.h"
|
||||
#include "9p.h"
|
||||
#include "9p-xattr.h"
|
||||
#include <arpa/inet.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Virtio 9p Posix callback
|
||||
* 9p Posix callback
|
||||
*
|
||||
* Copyright IBM, Corp. 2010
|
||||
*
|
||||
@@ -11,9 +11,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "virtio-9p.h"
|
||||
#include "virtio-9p-xattr.h"
|
||||
#include "9p.h"
|
||||
#include "9p-xattr.h"
|
||||
#include "fsdev/qemu-fsdev.h" /* local_ops */
|
||||
#include <arpa/inet.h>
|
||||
#include <pwd.h>
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Virtio 9p system.posix* xattr callback
|
||||
* 9p system.posix* xattr callback
|
||||
*
|
||||
* Copyright IBM, Corp. 2010
|
||||
*
|
||||
@@ -13,10 +13,9 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "qemu/xattr.h"
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "virtio-9p.h"
|
||||
#include "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"
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Virtio 9p Proxy callback
|
||||
* 9p Proxy callback
|
||||
*
|
||||
* Copyright IBM, Corp. 2011
|
||||
*
|
||||
@@ -11,11 +11,10 @@
|
||||
*/
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "virtio-9p.h"
|
||||
#include "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;
|
||||
@@ -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
|
||||
@@ -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;
|
||||
@@ -13,10 +13,10 @@
|
||||
*/
|
||||
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "virtio-9p.h"
|
||||
#include "virtio-9p-xattr.h"
|
||||
#include "9p.h"
|
||||
#include "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 <sys/stat.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 <unistd.h>
|
||||
#include <sys/types.h>
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Virtio 9p user. xattr callback
|
||||
* 9p user. xattr callback
|
||||
*
|
||||
* Copyright IBM, Corp. 2010
|
||||
*
|
||||
@@ -12,10 +12,9 @@
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "virtio-9p.h"
|
||||
#include "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,
|
||||
@@ -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 "9p.h"
|
||||
#include "fsdev/file-op-9p.h"
|
||||
#include "virtio-9p-xattr.h"
|
||||
#include "9p-xattr.h"
|
||||
|
||||
|
||||
static XattrOperations *get_xattr_operations(XattrOperations **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"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+326
@@ -0,0 +1,326 @@
|
||||
#ifndef _QEMU_9P_H
|
||||
#define _QEMU_9P_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/time.h>
|
||||
#include <utime.h>
|
||||
#include <sys/resource.h>
|
||||
#include <glib.h>
|
||||
#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;
|
||||
struct V9fsState *s;
|
||||
QLIST_ENTRY(V9fsPDU) next;
|
||||
uint32_t idx;
|
||||
};
|
||||
|
||||
|
||||
/* 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
|
||||
{
|
||||
QLIST_HEAD(, V9fsPDU) free_list;
|
||||
QLIST_HEAD(, V9fsPDU) active_list;
|
||||
V9fsFidState *fid_list;
|
||||
FileOperations *ops;
|
||||
FsContext ctx;
|
||||
char *tag;
|
||||
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);
|
||||
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, ...);
|
||||
V9fsPDU *pdu_alloc(V9fsState *s);
|
||||
void pdu_free(V9fsPDU *pdu);
|
||||
void pdu_submit(V9fsPDU *pdu);
|
||||
|
||||
#endif
|
||||
@@ -1,9 +1,9 @@
|
||||
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 += coxattr.o virtio-9p-synth.o
|
||||
common-obj-$(CONFIG_OPEN_BY_HANDLE) += virtio-9p-handle.o
|
||||
common-obj-y += virtio-9p-proxy.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
|
||||
common-obj-y += coxattr.o 9p-synth.o
|
||||
common-obj-$(CONFIG_OPEN_BY_HANDLE) += 9p-handle.o
|
||||
common-obj-y += 9p-proxy.o
|
||||
|
||||
obj-y += virtio-9p-device.o
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user