memset(&message, 0, sizeof(message));
message.type = TAPDISK_MESSAGE_OPEN;
message.cookie = minor;
- message.u.params.storage = TAPDISK_STORAGE_TYPE_DEFAULT;
message.u.params.devnum = minor;
message.u.params.prt_devnum = prt_minor;
message.u.params.flags = flags;
TAP-OBJS += tapdisk-disktype.o
TAP-OBJS += tapdisk-syslog.o
TAP-OBJS += tapdisk-stats.o
+TAP-OBJS += tapdisk-storage.o
TAP-OBJS += io-optimize.o
TAP-OBJS += lock.o
#include "tapdisk-driver.h"
#include "tapdisk-interface.h"
#include "tapdisk-disktype.h"
+#include "tapdisk-storage.h"
unsigned int SPB;
VHD_FLAG_OPEN_NO_CACHE);
/* pre-allocate for all but NFS and LVM storage */
+ driver->storage = tapdisk_storage_type(name);
+
if (driver->storage != TAPDISK_STORAGE_TYPE_NFS &&
driver->storage != TAPDISK_STORAGE_TYPE_LVM)
vhd_flags |= VHD_FLAG_OPEN_PREALLOCATE;
err = tapdisk_vbd_open_vdi(vbd,
type, path,
- request->u.params.storage,
flags, request->u.params.prt_devnum,
secondary_type, secondary_path);
if (err)
tapdisk_vbd_set_callback(s->vbd, tapdisk_stream_dequeue, s);
err = tapdisk_vbd_open_vdi(s->vbd, type, path,
- TAPDISK_STORAGE_TYPE_DEFAULT,
TD_OPEN_RDONLY, -1, -1, NULL);
if (err)
goto out;
#include "tapdisk-stats.h"
td_driver_t *
-tapdisk_driver_allocate(int type, char *name, td_flag_t flags, int storage)
+tapdisk_driver_allocate(int type, char *name, td_flag_t flags)
{
int err;
td_driver_t *driver;
driver->ops = ops;
driver->type = type;
- driver->storage = storage;
+ driver->storage = -1;
driver->data = calloc(1, ops->private_data_size);
if (!driver->data)
goto fail;
struct list_head next;
};
-td_driver_t *tapdisk_driver_allocate(int, char *, td_flag_t, int);
+td_driver_t *tapdisk_driver_allocate(int, char *, td_flag_t);
void tapdisk_driver_free(td_driver_t *);
void tapdisk_driver_queue_tiocb(td_driver_t *, struct tiocb *);
#define ERR(_err, _f, _a...) tlog_error(_err, _f, ##_a)
td_image_t *
-tapdisk_image_allocate(char *file, int type, int storage,
- td_flag_t flags, void *private)
+tapdisk_image_allocate(char *file, int type, td_flag_t flags, void *private)
{
int err;
td_image_t *image;
image->type = type;
image->flags = flags;
- image->storage = storage;
image->private = private;
INIT_LIST_HEAD(&image->next);
char *name;
td_flag_t flags;
- int storage;
td_driver_t *driver;
td_disk_info_t info;
} stats;
};
-td_image_t *tapdisk_image_allocate(char *, int, int, td_flag_t, void *);
+td_image_t *tapdisk_image_allocate(char *, int, td_flag_t, void *);
void tapdisk_image_free(td_image_t *);
int tapdisk_image_check_td_request(td_image_t *, td_request_t);
if (!driver) {
driver = tapdisk_driver_allocate(image->type,
image->name,
- image->flags,
- image->storage);
+ image->flags);
if (!driver)
return -ENOMEM;
err = tapdisk_vbd_open(vbd,
type, path,
- message.u.params.storage,
message.u.params.devnum,
devname, flags);
free(devname);
--- /dev/null
+/*
+ * Copyright (c) 2010, Citrix Systems, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of XenSource Inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+
+#include "tapdisk-storage.h"
+
+#ifndef NFS_SUPER_MAGIC
+#define NFS_SUPER_MAGIC 0x6969
+#endif
+
+static int
+__tapdisk_fs_storage_type(const char *rpath)
+{
+ struct statfs fst;
+ int type, err;
+
+ err = statfs(rpath, &fst);
+ if (err)
+ return -errno;
+
+ switch (fst.f_type) {
+ case NFS_SUPER_MAGIC:
+ type = TAPDISK_STORAGE_TYPE_NFS;
+ break;
+ default:
+ type = TAPDISK_STORAGE_TYPE_EXT;
+ break;
+ }
+
+ return type;
+}
+
+static int
+__tapdisk_blk_storage_type(const char *rpath)
+{
+ return TAPDISK_STORAGE_TYPE_LVM;
+}
+
+int
+tapdisk_storage_type(const char *path)
+{
+ char rpath[PATH_MAX], *p;
+ struct stat st;
+ int err, rv;
+
+ p = realpath(path, rpath);
+ if (!p)
+ return -errno;
+
+ err = stat(rpath, &st);
+ if (err)
+ return -errno;
+
+ switch (st.st_mode & S_IFMT) {
+ case S_IFBLK:
+ rv = __tapdisk_blk_storage_type(rpath);
+ break;
+ case S_IFREG:
+ rv = __tapdisk_fs_storage_type(rpath);
+ break;
+ default:
+ rv = -EINVAL;
+ break;
+ }
+
+ return rv;
+}
+
+const char *
+tapdisk_storage_name(int type)
+{
+ const char *name;
+
+ switch (type) {
+ case TAPDISK_STORAGE_TYPE_NFS:
+ return "nfs";
+ case TAPDISK_STORAGE_TYPE_EXT:
+ return "ext";
+ case TAPDISK_STORAGE_TYPE_LVM:
+ return "lvm";
+ case -1:
+ return "n/a";
+ default:
+ return "<unknown-type>";
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2008, XenSource Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of XenSource Inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _TAPDISK_STORAGE_H_
+#define _TAPDISK_STORAGE_H_
+
+#define TAPDISK_STORAGE_TYPE_NFS 1
+#define TAPDISK_STORAGE_TYPE_EXT 2
+#define TAPDISK_STORAGE_TYPE_LVM 3
+
+int tapdisk_storage_type(const char *path);
+const char *tapdisk_storage_name(int type);
+
+#endif
tapdisk_vbd_set_callback(s->vbd, tapdisk_stream_dequeue, s);
err = tapdisk_vbd_open_vdi(s->vbd, type, path,
- TAPDISK_STORAGE_TYPE_DEFAULT,
TD_OPEN_RDONLY, -1, -1, NULL);
if (err)
goto out;
#include "tapdisk-disktype.h"
#include "tapdisk-interface.h"
#include "tapdisk-stats.h"
+#include "tapdisk-storage.h"
#include "blktap2.h"
DPRINTF("VBD CHAIN:\n");
tapdisk_vbd_for_each_image(vbd, image, tmp) {
- DPRINTF("%s: %d\n", image->name, image->type);
+ DPRINTF("%s: type:%s(%d) storage:%s(%d)\n",
+ image->name,
+ tapdisk_disk_types[image->type]->name,
+ image->type,
+ tapdisk_storage_name(image->driver->storage),
+ image->driver->storage);
if (tapdisk_vbd_is_last_image(vbd, image))
break;
cache = tapdisk_image_allocate(target->name,
DISK_TYPE_BLOCK_CACHE,
- target->storage,
target->flags,
target->private);
if (!cache)
cache->driver = tapdisk_driver_allocate(cache->type,
cache->name,
- cache->flags,
- cache->storage);
+ cache->flags);
if (!cache->driver) {
err = -ENOMEM;
goto fail;
cache = tapdisk_image_allocate(parent->name,
DISK_TYPE_LOCAL_CACHE,
- parent->storage,
parent->flags,
parent->private);
goto done;
cache->driver = tapdisk_driver_allocate(cache->type,
- cache->name,
- cache->flags,
- cache->storage);
+ cache->name,
+ cache->flags);
if (!cache->driver) {
err = -ENOMEM;
leaf = tapdisk_vbd_first_image(vbd);
second = tapdisk_image_allocate(vbd->secondary_name,
- vbd->secondary_type,
- leaf->storage,
- leaf->flags,
- leaf->private);
+ vbd->secondary_type,
+ leaf->flags,
+ leaf->private);
if (!second)
return -ENOMEM;
second->driver = tapdisk_driver_allocate(second->type,
- second->name,
- second->flags,
- second->storage);
+ second->name,
+ second->flags);
if (!second->driver) {
err = -ENOMEM;
}
flags = vbd->flags | TD_OPEN_RDONLY | TD_OPEN_SHAREABLE;
- image = tapdisk_image_allocate(path, DISK_TYPE_VINDEX,
- vbd->storage, flags, vbd);
+ image = tapdisk_image_allocate(path, DISK_TYPE_VINDEX, flags, vbd);
if (!image) {
err = -ENOMEM;
goto fail;
log = tapdisk_image_allocate(parent->name,
DISK_TYPE_LOG,
- parent->storage,
parent->flags,
vbd);
if (!log)
driver = tapdisk_driver_allocate(log->type,
log->name,
- log->flags,
- log->storage);
+ log->flags);
if (!driver) {
err = -ENOMEM;
goto fail;
for (;;) {
err = -ENOMEM;
- image = tapdisk_image_allocate(file, type,
- vbd->storage, flags, vbd);
+ image = tapdisk_image_allocate(file, type, flags, vbd);
if (file != vbd->name) {
free(file);
goto fail;
}
- if (!image->storage)
- image->storage = vbd->storage;
-
tapdisk_vbd_add_image(vbd, image);
image = NULL;
int
tapdisk_vbd_open_vdi(td_vbd_t *vbd, int type, const char *path,
- uint16_t storage, td_flag_t flags, int prt_devnum,
+ td_flag_t flags, int prt_devnum,
int secondary_type, const char *secondary_name)
{
const disk_info_t *info;
}
vbd->flags = flags;
- vbd->storage = storage;
vbd->type = type;
err = __tapdisk_vbd_open_vdi(vbd, 0);
int
tapdisk_vbd_open(td_vbd_t *vbd, int type, const char *path,
- uint16_t storage, int minor, const char *ring, td_flag_t flags)
+ int minor, const char *ring, td_flag_t flags)
{
int err;
- err = tapdisk_vbd_open_vdi(vbd, type, path, storage, flags, -1, -1,
- NULL);
+ err = tapdisk_vbd_open_vdi(vbd, type, path, flags, -1, -1, NULL);
if (err)
goto out;
int minor;
int type;
- int storage;
-
td_flag_t flags;
td_flag_t state;
int tapdisk_vbd_initialize(int, int, td_uuid_t);
void tapdisk_vbd_set_callback(td_vbd_t *, td_vbd_cb_t, void *);
int tapdisk_vbd_open(td_vbd_t *, int, const char *,
- uint16_t, int, const char *, td_flag_t);
+ int, const char *, td_flag_t);
int tapdisk_vbd_close(td_vbd_t *);
-int tapdisk_vbd_open_vdi(td_vbd_t *, int, const char *, uint16_t, td_flag_t,
- int, int, const char *);
+int tapdisk_vbd_open_vdi(td_vbd_t *, int, const char *, td_flag_t,
+ int, int, const char *);
void tapdisk_vbd_close_vdi(td_vbd_t *);
int tapdisk_vbd_attach(td_vbd_t *, const char *, int);
#define CTLMSG_RESUME 17
#define CTLMSG_RESUME_RSP 18
-#define TAPDISK_STORAGE_TYPE_NFS 1
-#define TAPDISK_STORAGE_TYPE_EXT 2
-#define TAPDISK_STORAGE_TYPE_LVM 3
-#define TAPDISK_STORAGE_TYPE_DEFAULT TAPDISK_STORAGE_TYPE_EXT
-
/* Abitrary values, must match the underlying driver... */
#define MAX_TAP_DEV 1024
struct tapdisk_message_params {
tapdisk_message_flag_t flags;
- uint8_t storage;
uint32_t devnum;
uint32_t domid;
char path[TAPDISK_MESSAGE_MAX_PATH_LENGTH];