/part/Makefile
/drivers/Makefile
/control/Makefile
+/xenio/Makefile
/include/Makefile
/vhd/Makefile
/vhd/lib/Makefile
AC_CANONICAL_HOST
AC_CHECK_HEADERS([uuid/uuid.h], [], [Need uuid-dev])
AC_CHECK_HEADERS([libaio.h], [], [Need libaio-dev])
+AC_CHECK_HEADERS([xen/xen.h], [], [Need libxen-dev])
AC_ARG_WITH([libiconv],
[AS_HELP_STRING([--with-libiconv],
[:],
AC_MSG_ERROR([Missing iconv in libc]))])
+AC_CHECK_LIB([xenctrl], [main],
+ [:],
+ AC_MSG_ERROR([Need libxen-dev]))
+
AC_ARG_ENABLE([tests],
[AS_HELP_STRING([--enable-tests],
[build test programs])],
Makefile
lvm/Makefile
part/Makefile
+xenio/Makefile
vhd/Makefile
vhd/lib/Makefile
vhd/lib/test/Makefile
tap_ctl_connect_xenblkif(pid_t pid, int minor,
domid_t domid, int devid,
const grant_ref_t *grefs, int order,
+ evtchn_port_t port,
int proto,
- evtchn_port_t port)
+ const char *pool)
{
tapdisk_message_t message;
int i, err;
message.u.blkif.domid = domid;
message.u.blkif.devid = devid;
- message.u.blkif.order = order;
- message.u.blkif.port = port;
-
for (i = 0; i < 1<<order; i++)
message.u.blkif.gref[i] = grefs[i];
+ message.u.blkif.order = order;
+ message.u.blkif.port = port;
+ message.u.blkif.proto = proto;
+ strncpy(message.u.blkif.pool, pool, sizeof(message.u.blkif.pool));
err = tap_ctl_connect_send_and_receive(pid, &message, NULL);
if (err)
int tap_ctl_connect_xenblkif(pid_t pid, int minor,
domid_t domid, int devid,
const grant_ref_t *grefs, int order,
+ evtchn_port_t port,
int proto,
- evtchn_port_t port);
+ const char *pool);
int tap_ctl_disconnect_xenblkif(pid_t pid, int minor,
domid_t domid, int devid,
libtapdisk_la_LIBADD = ../vhd/lib/libvhd.la
libtapdisk_la_LIBADD += -laio
+libtapdisk_la_LIBADD += ../xenio/libxenio.la
if (flags & TAPDISK_MSG_VERBOSE_ERROR)
DBG("sending '%s' message (uuid = %u): %d",
tapdisk_message_name(message->type), message->cookie,
- message->u.response.error);
+ -message->u.response.error);
else
DBG("sending '%s' message (uuid = %u)",
tapdisk_message_name(message->type), message->cookie);
tapdisk_message_blkif_t *blkif = &request->u.blkif;
tapdisk_message_t response;
td_vbd_t *vbd;
+ const char *pool;
+ size_t len;
int err;
+
vbd = tapdisk_server_get_vbd(request->cookie);
if (!vbd) {
err = -ENODEV;
goto out;
}
- DPRINTF("connecting vbd-%d-%d to vbd %d\n",
- blkif->domid, blkif->devid, request->cookie);
-
- err = tapdisk_xenblkif_connect(blkif->domid, blkif->devid,
- blkif->gref, blkif->order,
- blkif->proto, blkif->port,
- NULL, vbd);
+ len = strnlen(blkif->pool, sizeof(blkif->pool));
+ if (!len)
+ pool = NULL;
+ else if (len >= sizeof(blkif->pool)) {
+ err = -EINVAL;
+ goto out;
+ } else
+ pool = blkif->pool;
+
+ DPRINTF("connecting vbd-%d-%d to minor %d, pool %s, evt %d\n",
+ blkif->domid, blkif->devid, request->cookie, pool, blkif->port);
+
+ err = tapdisk_xenblkif_connect(blkif->domid,
+ blkif->devid,
+ blkif->gref,
+ blkif->order,
+ blkif->port,
+ blkif->proto,
+ pool,
+ vbd);
out:
memset(&response, 0, sizeof(response));
response.type = TAPDISK_MESSAGE_XENBLKIF_CONNECT_RSP;
err = tapdisk_xenblkif_disconnect(blkif->domid, blkif->devid);
-out:
memset(&response, 0, sizeof(response));
response.type = TAPDISK_MESSAGE_XENBLKIF_DISCONNECT_RSP;
response.cookie = request->cookie;
#include "xenio.h"
#include "list.h"
-#define unlikely(_cond) (_cond)
+/* NB. may be NULL, but then the image must be bouncing I/O */
+#define TD_XENBLKIF_DEFAULT_POOL "td-xenio-default"
+
#define BUG_ON(_cond) if (unlikely(_cond)) { td_panic(); }
#define WARN(_fmt, _args ...) \
__cond; \
})
-#define containerof(_ptr, _type, _member) \
- ((_type*)((void*)(_ptr) - offsetof(_type, _member)))
-
typedef struct td_xenio_ctx td_xenio_ctx_t;
typedef struct td_xenblkif td_xenblkif_t;
typedef struct td_xenblkif_req td_xenblkif_req_t;
void
tapdisk_xenblkif_ring_event(td_xenblkif_t *blkif)
{
- int n_reqs, final, err;
+ int n_reqs, final;
blkif->stats.kicks.in++;
td_xenio_ctx_t *ctx = private;
xenio_blkif_t *xenio;
td_xenblkif_t *blkif;
- void *data;
xenio = xenio_pending_blkif(ctx->xenio,
(void**)&blkif);
goto fail;
}
+ /*
+ * attach to some frame pool
+ */
+
if (pool) {
ctx->pool = strdup(pool);
if (!ctx->pool) {
if (ctx->pool) {
err = xenio_bind_frame_pool(ctx->xenio, ctx->pool);
+ WARN_ON_WITH_ERRNO(err);
if (err) {
err = -errno;
goto fail;
td_xenio_ctx_t *ctx;
int err = 0;
-retry:
- tapdisk_xenio_find_ctx(ctx,
- __td_xenio_ctx_match(ctx, pool));
- if (!ctx) {
- err = tapdisk_xenio_ctx_open(pool);
- if (!err)
- goto retry;
- }
+ do {
+ tapdisk_xenio_find_ctx(ctx,
+ __td_xenio_ctx_match(ctx, pool));
+ if (ctx) {
+ *_ctx = ctx;
+ return 0;
+ }
- *_ctx = ctx;
+ err = tapdisk_xenio_ctx_open(pool);
+ } while (!err);
return err;
}
int
tapdisk_xenblkif_connect(domid_t domid, int devid,
- const grant_ref_t *grefs, int order, int proto,
- evtchn_port_t port, const char *pool, td_vbd_t *vbd)
+ const grant_ref_t *grefs, int order,
+ evtchn_port_t port,
+ int proto,
+ const char *pool,
+ td_vbd_t *vbd)
{
td_xenblkif_t *blkif = NULL;
td_xenio_ctx_t *ctx;
list_add_tail(&blkif->ctx_entry, &ctx->blkifs);
blkif->xenio = xenio_blkif_connect(ctx->xenio,
- domid, grefs, order, port,
- proto,
+ domid,
+ grefs, order, port, proto,
blkif);
+ WARN_ON_WITH_ERRNO(!blkif->xenio);
if (!blkif->xenio) {
err = -errno;
goto fail;
#ifndef _TAPDISK_XENBLKIF_H_
#define _TAPDISK_XENBLKIF_H_
-/* NB. may be NULL, but then the image must be bouncing I/O */
-#define TD_XENBLKIF_DEFAULT_POOL "td-xenio-default"
+#include <xen/xen.h>
+#include <xen/grant_table.h>
+#include <xen/event_channel.h>
int tapdisk_xenblkif_connect(domid_t domid, int devid,
const grant_ref_t *grefs, int order,
- int proto, evtchn_port_t port,
- const char *pool, td_vbd_t *vbd);
+ evtchn_port_t port,
+ int proto,
+ const char *pool,
+ td_vbd_t *vbd);
int tapdisk_xenblkif_disconnect(domid_t domid, int devid);
uint32_t gref[8];
uint32_t order;
uint32_t proto;
+ char pool[TAPDISK_MESSAGE_STRING_LENGTH];
uint32_t port;
};
+++ /dev/null
-
-CC = gcc
-
-CFLAGS = -O2 -Wall -Werror -g
-CFLAGS += -Wp,-MD,.$(@F).d
-DEPS = .*.d
-
-CPPFLAGS = -I.
-CPPFLAGS += -D_GNU_SOURCE
-CPPFLAGS += -D_LARGEFILE64_SOURCE
-
-XENIO-OBJS = xenio-ctx.o
-XENIO-OBJS += xenio-blkif.o
-
-all: libxenio.a
-
-libxenio.a: libxenio.a($(XENIO-OBJS))
-
-clean:
- rm -f libxenio.a
- rm -f $(XENIO-OBJS)
- rm -f $(DEPS)
- rm -f *~
-
--include $(DEPS)
--- /dev/null
+
+AM_CFLAGS = -Wall
+AM_CFLAGS += -Werror
+
+AM_CPPFLAGS = -D_GNU_SOURCE
+AM_CPPFLAGS += -D_FILE_OFFSET_BITS=64
+AM_CPPFLAGS += -I$(top_srcdir)/include
+AM_CPPFLAGS += -I$(top_srcdir)/xenio
+
+lib_LTLIBRARIES = libxenio.la
+
+libxenio_la_SOURCES = xenio.h
+libxenio_la_SOURCES += xenio-private.h
+libxenio_la_SOURCES += xenio-ctx.c
+libxenio_la_SOURCES += xenio-blkif.c
+libxenio_la_SOURCES += gntdev.h
+
+libxenio_la_LIBADD = -lxenctrl -lpthread
+
+libxenio_la_LDFLAGS = -version-info 0:1:0
evtchn_port_t port;
grant_ref_t gref;
int n, proto, err;
+ char *pool;
n = xenio_device_scanf_otherend(xbdev, "ring-ref",
"%u", &gref);
if (proto < 0)
goto fail;
+ pool = xenio_device_read(xbdev, "sm-data/frame-pool");
+
err = blkback_find_tapdisk(bdev);
if (err)
goto fail;
- DBG("connecting vbd-%d-%d (gnt %d, evt %d) to tapdisk %d minor %d\n",
+ DBG("connecting vbd-%d-%d (gnt %d, evt %d, proto %d, pool %s)"
+ " to tapdisk %d minor %d\n",
bdev->domid, bdev->devid,
- gref, port,
+ gref, port, proto, pool,
bdev->tap.pid, bdev->tap.minor);
err = tap_ctl_connect_xenblkif(bdev->tap.pid,
bdev->domid,
bdev->devid,
&gref, 0,
- proto,
- bdev->port);
+ port, proto,
+ pool);
DBG("err=%d errno=%d\n", err, errno);
if (err)
goto fail;
xenio_bind_frame_pool(xenio_ctx_t *ctx, const char *name)
{
struct ioctl_gntdev_bind_pool bind;
- const size_t max = sizeof(bind.name) - 1;
+ const size_t max = sizeof(bind.name);
int err;
- if (strnlen(name, max) >= max)
- return -EINVAL;
+ if (strnlen(name, max) >= max) {
+ err = -EINVAL;
+ goto fail;
+
+ }
strcpy(bind.name, name);
err = ioctl(ctx->xcg_handle, IOCTL_GNTDEV_BIND_POOL, &bind);
if (err)
- err = -errno;
+ return -errno;
+ return 0;
+
+fail:
+ errno = -err;
return err;
}
#ifndef _XENIO_H
#define _XENIO_H
+#define _FILE_OFFSET_BITS 64
+
#include <stdint.h>
#include <sys/types.h>
#include <sys/mman.h>
uint64_t id;
int status;
- off64_t offset;
+ off_t offset;
struct xenio_blkif_seg {
uint8_t first;
uint8_t last;