[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1 of 6 v2] blktap3/sring: Headers required for compiling the shared ring
This patch series introduces the headers required for the shared ring library to compile. The files are: * io-optimize.h: imported from blktap2 * scheduler.h: imported from blktap2, contains definitions for the tapdisk scheduler, the component that processes events, be it I/O requests or control commands * tapdisk.h: imported from blktap2, core header file that contains the definition of the I/O request * tapdisk-image.h: imported from blktap2, contains the definition of the Virtual Disk Image (VDI). * tapdisk-log.h: imported from blktap2, contains logging stuff * tapdisk-queue.h: imported from blktap2, contains the tapdisk I/O request and event queue. * tapdisk-server.h: imported from blktap2 * tapdisk-stats.h: imported from blktap2.5, contains stats stuff * tapdisk-utils.h: imported from blktap2.5, contains assorted utility functions * tapdisk-vbd.h: imported from blktap2, contains the definition of the Virtual Block Device (VBD) Also, the patch series contains the following blktap3-related changes: * Update declaration of function tapdisk_image_open_chain as it now uses the parent /path/to/file instead of the parent minor number. * Update declaration of function tapdisk_server_get_vbd as it now uses type:/path/to/file instead of the minor number. Signed-off-by: Thanos Makatos <thanos.makatos@xxxxxxxxxx> diff --git a/tools/blktap3/drivers/io-optimize.h b/tools/blktap3/drivers/io-optimize.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/io-optimize.h @@ -0,0 +1,68 @@ +/* + * 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 __IO_OPTIMIZE_H__ +#define __IO_OPTIMIZE_H__ + +#include <libaio.h> + +struct opio; + +struct opio_list { + struct opio *head; + struct opio *tail; +}; + +struct opio { + char *buf; + unsigned long nbytes; + long long offset; + void *data; + struct iocb *iocb; + struct io_event event; + struct opio *head; + struct opio *next; + struct opio_list list; +}; + +struct opioctx { + int num_opios; + int free_opio_cnt; + struct opio *opios; + struct opio **free_opios; + struct iocb **iocb_queue; + struct io_event *event_queue; +}; + +int opio_init(struct opioctx *ctx, int num_iocbs); +void opio_free(struct opioctx *ctx); +int io_merge(struct opioctx *ctx, struct iocb **queue, int num); +int io_split(struct opioctx *ctx, struct io_event *events, int num); +int io_expand_iocbs(struct opioctx *ctx, struct iocb **queue, int idx, int num); + +#endif diff --git a/tools/blktap3/drivers/scheduler.h b/tools/blktap3/drivers/scheduler.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/scheduler.h @@ -0,0 +1,88 @@ +/* + * 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 _SCHEDULER_H_ +#define _SCHEDULER_H_ + +#include <sys/select.h> +#include "blktap3.h" + +#define SCHEDULER_POLL_READ_FD 0x1 +#define SCHEDULER_POLL_WRITE_FD 0x2 +#define SCHEDULER_POLL_EXCEPT_FD 0x4 +#define SCHEDULER_POLL_TIMEOUT 0x8 + +typedef int event_id_t; +typedef void (*event_cb_t) (event_id_t id, char mode, void *private); + +typedef struct event { + char mode; + char dead; + char pending; + char masked; + + event_id_t id; + + int fd; + int timeout; + int deadline; + + event_cb_t cb; + void *private; + + /* + * for linked lists + */ + TAILQ_ENTRY(event) entry; +} event_t; + +TAILQ_HEAD(tqh_event, event); + +typedef struct scheduler { + fd_set read_fds; + fd_set write_fds; + fd_set except_fds; + + struct tqh_event events; + + int uuid; + int max_fd; + int timeout; + int max_timeout; + int depth; +} scheduler_t; + +void scheduler_initialize(scheduler_t *); +event_id_t scheduler_register_event(scheduler_t *, char mode, + int fd, int timeout, + event_cb_t cb, void *private); +void scheduler_unregister_event(scheduler_t *, event_id_t); +void scheduler_mask_event(scheduler_t *, event_id_t, int masked); +void scheduler_set_max_timeout(scheduler_t *, int); +int scheduler_wait_for_events(scheduler_t *); + +#endif diff --git a/tools/blktap3/drivers/tapdisk-blktap.h b/tools/blktap3/drivers/tapdisk-blktap.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-blktap.h @@ -0,0 +1,84 @@ +/* + * 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. + */ + +#ifndef _TAPDISK_BLKTAP_H_ +#define _TAPDISK_BLKTAP_H_ + +typedef struct td_blktap td_blktap_t; +typedef struct td_blktap_req td_blktap_req_t; + +#include "blktap3.h" +#include "tapdisk-vbd.h" + +#if 0 +struct td_blktap_stats { + struct { + unsigned long long in; + unsigned long long out; + } reqs; + struct { + unsigned long long in; + unsigned long long out; + } kicks; +}; +#endif + +struct td_blktap { + int minor; + //td_vbd_t *vbd; + +#if 0 + int fd; +#endif + +#if 0 + void *vma; + size_t vma_size; + + struct blktap_sring *sring; + unsigned int req_cons; + unsigned int rsp_prod_pvt; +#endif + +#if 0 + int event_id; + void *vstart; + + int n_reqs; + td_blktap_req_t *reqs; + int n_reqs_free; + td_blktap_req_t **reqs_free; +#endif + + //TAILQ_ENTRY(td_blktap) entry; + + //struct td_blktap_stats stats; +}; + +#endif /* _TAPDISK_BLKTAP_H_ */ diff --git a/tools/blktap3/drivers/tapdisk-image.h b/tools/blktap3/drivers/tapdisk-image.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-image.h @@ -0,0 +1,119 @@ +/* + * 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_IMAGE_H_ +#define _TAPDISK_IMAGE_H_ + +#include "tapdisk.h" + +TAILQ_HEAD(tqh_td_image_handle, td_image_handle); + +struct td_image_handle { + int type; + char *name; + + td_flag_t flags; + + td_driver_t *driver; + td_disk_info_t info; + + /* + * for linked lists + */ + TAILQ_ENTRY(td_image_handle) entry; + + /* + * Basic datapath statistics, in sectors read/written. + * + * hits: requests completed by this image. + * fail: requests completed with failure by this image. + * + * Not that we do not count e.g. + * miss: requests forwarded. + * total: requests processed by this image. + * + * This is because we'd have to compensate for restarts due to + * -EBUSY conditions. Those can be extrapolated by following + * the chain instead: sum(image[i].hits, i=0..) == vbd.secs; + */ + struct { + td_sector_count_t hits; + td_sector_count_t fail; + } stats; +}; + +#define tapdisk_for_each_image(_image, _head) \ + TAILQ_FOREACH(_image, _head, entry) + +#define tapdisk_for_each_image_safe(_image, _next, _head) \ + TAILQ_FOREACH_SAFE(_image, _head, entry, _next) + +#define tapdisk_for_each_image_reverse(_image, _head) \ + TAILQ_FOREACH_REVERSE(_image, _head, tqh_td_image_handle, entry) + +#define tapdisk_image_entry(_head) \ + list_entry(_head, td_image_t, next) + +/** + * Opens an image. + * + * @param type the image type (DISK_TYPE_*) + * @param name TODO ? + * @param flags TODO ? + * @param _image output parameter that receives a handle to the opened image + * @returns 0 on success + */ +int tapdisk_image_open(const int type, const char *name, const int flags, + td_image_t ** _image); + +void tapdisk_image_close(td_image_t *, struct tqh_td_image_handle *); + +/** + * Opens the image chain. + * + * @param params type:/path/to/file + * @param flags + * @param prt_path parent /path/to/file (optional) + * @param head + */ +int tapdisk_image_open_chain(const char *params, int flags, + const char* prt_path, struct tqh_td_image_handle *head); + +/** + * Closes all the images. + */ +void tapdisk_image_close_chain(struct tqh_td_image_handle *); +int tapdisk_image_validate_chain(struct tqh_td_image_handle *); + +td_image_t *tapdisk_image_allocate(const char *, int, td_flag_t); +void tapdisk_image_free(td_image_t *, struct tqh_td_image_handle *head); + +int tapdisk_image_check_td_request(td_image_t *, td_request_t); +int tapdisk_image_check_request(td_image_t *, struct td_vbd_request *); +void tapdisk_image_stats(td_image_t *, td_stats_t *); + +#endif diff --git a/tools/blktap3/drivers/tapdisk-log.h b/tools/blktap3/drivers/tapdisk-log.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-log.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2009, 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_LOG_H_ +#define _TAPDISK_LOG_H_ + +#define TLOG_WARN 0 +#define TLOG_INFO 1 +#define TLOG_DBG 2 + +#define TLOG_DIR "/var/log/blktap" + +#include <stdarg.h> +#include "blktap3.h" + +int tlog_open(const char *, int, int); +void tlog_close(void); +void tlog_precious(void); +void tlog_vsyslog(int, const char *, va_list); +void tlog_syslog(int, const char *, ...); + +#include <syslog.h> + +#define EPRINTF(_f, _a...) syslog(LOG_ERR, "%s:%d " _f, __FILE__, __LINE__, \ + ##_a) +#define DPRINTF(_f, _a...) syslog(LOG_INFO, "%s:%d "_f, __FILE__, __LINE__, \ + ##_a) +#define PERROR(_f, _a...) EPRINTF(_f ": %s", ##_a, strerror(errno)) + +void __tlog_write(int, const char *, ...) __printf(2, 3); +void __tlog_error(const char *fmt, ...) __printf(1, 2); + +#define tlog_write(_level, _f, _a...) \ + __tlog_write(_level, "%s: " _f, __func__, ##_a) + +#define tlog_error(_err, _f, _a...) \ + __tlog_error("ERROR: errno %d at %s: " _f, \ + (int)_err, __func__, ##_a) + +#define tlog_drv_error(_drv, _err, _f, _a ...) do { \ + if (tapdisk_driver_log_pass(_drv, __func__)) \ + tlog_error(_err, _f, ##_a); \ +} while (0) + +#endif /* __TAPDISK_LOG_H__ */ diff --git a/tools/blktap3/drivers/tapdisk-queue.h b/tools/blktap3/drivers/tapdisk-queue.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-queue.h @@ -0,0 +1,125 @@ +/* + * 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_QUEUE_H +#define TAPDISK_QUEUE_H + +#include <libaio.h> + +#include "io-optimize.h" +#include "scheduler.h" + +struct tiocb; +struct tfilter; + +typedef void (*td_queue_callback_t)(void *arg, struct tiocb *, int err); + + +struct tiocb { + td_queue_callback_t cb; + void *arg; + + struct iocb iocb; + struct tiocb *next; +}; + +struct tlist { + struct tiocb *head; + struct tiocb *tail; +}; + +struct tqueue { + int size; + + const struct tio *tio; + void *tio_data; + + struct opioctx opioctx; + + int queued; + struct iocb **iocbs; + + /* number of iocbs pending in the aio layer */ + int iocbs_pending; + + /* number of tiocbs pending in the queue -- + * this is likely to be larger than iocbs_pending + * due to request coalescing */ + int tiocbs_pending; + + /* iocbs may be deferred if the aio ring is full. + * tapdisk_queue_complete will ensure deferred + * iocbs are queued as slots become available. */ + struct tlist deferred; + int tiocbs_deferred; + + /* optional tapdisk filter */ + struct tfilter *filter; + + uint64_t deferrals; +}; + +struct tio { + const char *name; + size_t data_size; + + int (*tio_setup) (struct tqueue *queue, int qlen); + void (*tio_destroy) (struct tqueue *queue); + int (*tio_submit) (struct tqueue *queue); +}; + +enum { + TIO_DRV_LIO = 1, + TIO_DRV_RWIO = 2, +}; + +/* + * Interface for request producer (i.e., tapdisk) + * NB: the following functions may cause additional tiocbs to be queued: + * - tapdisk_submit_tiocbs + * - tapdisk_cancel_tiocbs + * - tapdisk_complete_tiocbs + * The *_all_tiocbs variants will handle the first two cases; + * be sure to call submit after calling complete in the third case. + */ +#define tapdisk_queue_count(q) ((q)->queued) +#define tapdisk_queue_empty(q) ((q)->queued == 0) +#define tapdisk_queue_full(q) \ + (((q)->tiocbs_pending + (q)->queued) >= (q)->size) +int tapdisk_init_queue(struct tqueue *, int size, int drv, struct tfilter *); +void tapdisk_free_queue(struct tqueue *); +void tapdisk_debug_queue(struct tqueue *); +void tapdisk_queue_tiocb(struct tqueue *, struct tiocb *); +int tapdisk_submit_tiocbs(struct tqueue *); +int tapdisk_submit_all_tiocbs(struct tqueue *); +int tapdisk_cancel_tiocbs(struct tqueue *); +int tapdisk_cancel_all_tiocbs(struct tqueue *); +void tapdisk_prep_tiocb(struct tiocb *, int, int, char *, size_t, + long long, td_queue_callback_t, void *); + +#endif diff --git a/tools/blktap3/drivers/tapdisk-server.h b/tools/blktap3/drivers/tapdisk-server.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-server.h @@ -0,0 +1,76 @@ +/* + * 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_SERVER_H_ +#define _TAPDISK_SERVER_H_ + +#include "tapdisk-vbd.h" +#include "tapdisk-queue.h" + +struct tap_disk *tapdisk_server_find_driver_interface(int); + +td_image_t *tapdisk_server_get_shared_image(td_image_t *); + +struct tqh_td_vbd_handle *tapdisk_server_get_all_vbds(void); + +/** + * Returns the VBD that corresponds to the specified type:/path/to/file. + * Returns NULL if such a VBD does not exist. + */ +td_vbd_t *tapdisk_server_get_vbd(const char *params); + +/** + * Adds the VBD to end of the list of VBDs. + */ +void tapdisk_server_add_vbd(td_vbd_t *); + +/** + * Removes the VBDs from the list of VBDs. + */ +void tapdisk_server_remove_vbd(td_vbd_t *); + +void tapdisk_server_queue_tiocb(struct tiocb *); + +void tapdisk_server_check_state(void); + +event_id_t tapdisk_server_register_event(char, int, int, event_cb_t, void *); +void tapdisk_server_unregister_event(event_id_t); +void tapdisk_server_mask_event(event_id_t, int); +void tapdisk_server_set_max_timeout(int); + +int tapdisk_server_init(void); +int tapdisk_server_initialize(const char *, const char *); +int tapdisk_server_complete(void); +int tapdisk_server_run(void); +void tapdisk_server_iterate(void); + +int tapdisk_server_openlog(const char *, int, int); +void tapdisk_server_closelog(void); +void tapdisk_start_logging(const char *, const char *); +void tapdisk_stop_logging(void); + +#endif diff --git a/tools/blktap3/drivers/tapdisk-stats.h b/tools/blktap3/drivers/tapdisk-stats.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-stats.h @@ -0,0 +1,70 @@ +/* + * 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. + */ + +#ifndef _TAPDISK_STATS_H_ +#define _TAPDISK_STATS_H_ + +#include <string.h> + +#define TD_STATS_MAX_DEPTH 8 + +struct tapdisk_stats_ctx { + void *pos; + + void *buf; + size_t size; + + int n_elem[TD_STATS_MAX_DEPTH]; + int depth; +}; + +typedef struct tapdisk_stats_ctx td_stats_t; + +static inline void +tapdisk_stats_init(td_stats_t * st, char *buf, size_t size) +{ + memset(st, 0, sizeof(*st)); + + st->pos = buf; + st->buf = buf; + st->size = size; +} + +static inline size_t tapdisk_stats_length(td_stats_t * st) +{ + return st->pos - st->buf; +} + +void tapdisk_stats_enter(td_stats_t * st, char t); +void tapdisk_stats_leave(td_stats_t * st, char t); +void tapdisk_stats_field(td_stats_t * st, const char *key, + const char *conv, ...); +void tapdisk_stats_val(td_stats_t * st, const char *conv, ...); + +#endif /* _TAPDISK_STATS_H_ */ diff --git a/tools/blktap3/drivers/tapdisk-utils.h b/tools/blktap3/drivers/tapdisk-utils.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk-utils.h @@ -0,0 +1,49 @@ +/* + * 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_UTILS_H_ +#define _TAPDISK_UTILS_H_ + +#include <inttypes.h> +#include <sys/time.h> +#include <stddef.h> + +#define MAX_NAME_LEN 1000 +#define TD_SYSLOG_IDENT_MAX 32 +#define TD_SYSLOG_STRTIME_LEN 15 + +int tapdisk_syslog_facility(const char *); +char *tapdisk_syslog_ident(const char *); +size_t tapdisk_syslog_strftime(char *, size_t, const struct timeval *); +size_t tapdisk_syslog_strftv(char *, size_t, const struct timeval *); +int tapdisk_set_resource_limits(void); +int tapdisk_namedup(char **, const char *); +int tapdisk_parse_disk_type(const char *, char **, int *); +int tapdisk_get_image_size(int, uint64_t *, uint32_t *); +int tapdisk_linux_version(void); + +#endif diff --git a/tools/blktap2/drivers/tapdisk-vbd.h b/tools/blktap3/drivers/tapdisk-vbd.h copy from tools/blktap2/drivers/tapdisk-vbd.h copy to tools/blktap3/drivers/tapdisk-vbd.h --- a/tools/blktap2/drivers/tapdisk-vbd.h +++ b/tools/blktap3/drivers/tapdisk-vbd.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2008, XenSource Inc. * All rights reserved. * @@ -24,18 +24,18 @@ * 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_VBD_H_ #define _TAPDISK_VBD_H_ #include <sys/time.h> -#include <xenctrl.h> -#include <xen/io/blkif.h> #include "tapdisk.h" #include "scheduler.h" #include "tapdisk-image.h" +#include "sring/td-blkif.h" +#define TD_VBD_REQUEST_TIMEOUT 120 #define TD_VBD_MAX_RETRIES 100 #define TD_VBD_RETRY_INTERVAL 1 @@ -47,75 +47,54 @@ #define TD_VBD_PAUSED 0x0020 #define TD_VBD_SHUTDOWN_REQUESTED 0x0040 #define TD_VBD_LOCKING 0x0080 -#define TD_VBD_RETRY_NEEDED 0x0100 -#define TD_VBD_LOG_DROPPED 0x0200 +#define TD_VBD_LOG_DROPPED 0x0100 -typedef struct td_ring td_ring_t; -typedef struct td_vbd_request td_vbd_request_t; -typedef struct td_vbd_driver_info td_vbd_driver_info_t; -typedef struct td_vbd_handle td_vbd_t; -typedef void (*td_vbd_cb_t) (void *, blkif_response_t *); +#define TD_VBD_SECONDARY_DISABLED 0 +#define TD_VBD_SECONDARY_MIRROR 1 +#define TD_VBD_SECONDARY_STANDBY 2 -struct td_ring { - int fd; - char *mem; - blkif_sring_t *sring; - blkif_back_ring_t fe_ring; - unsigned long vstart; -}; - -struct td_vbd_request { - blkif_request_t req; - int16_t status; - - int error; - int blocked; /* blocked on a dependency */ - int submitting; - int secs_pending; - int num_retries; - struct timeval last_try; - - td_vbd_t *vbd; - struct list_head next; -}; - -struct td_vbd_driver_info { - char *params; - int type; - struct list_head next; -}; +TAILQ_HEAD(tqh_td_vbd_handle, td_vbd_handle); struct td_vbd_handle { + /** + * type:/path/to/file + */ char *name; - td_uuid_t uuid; - int minor; + /** + * shared ring + */ + struct td_xenblkif *tap; - struct list_head driver_stack; - - int storage; - - uint8_t reopened; - uint8_t reactivated; td_flag_t flags; td_flag_t state; - struct list_head images; + struct tqh_td_image_handle images; - struct list_head new_requests; - struct list_head pending_requests; - struct list_head failed_requests; - struct list_head completed_requests; + int parent_devnum; + char *secondary_name; + td_image_t *secondary; + uint8_t secondary_mode; - td_vbd_request_t request_list[MAX_REQUESTS]; + /* TODO ??? */ + int FIXME_enospc_redirect_count_enabled; + uint64_t FIXME_enospc_redirect_count; - td_ring_t ring; - event_id_t ring_event_id; + /* when we encounter ENOSPC on the primary leaf image in mirror mode, + * we need to remove it from the VBD chain so that writes start going + * on the secondary leaf. However, we cannot free the image at that + * time since it might still have in-flight treqs referencing it. + * Therefore, we move it into 'retired' until shutdown. */ + td_image_t *retired; - td_vbd_cb_t callback; - void *argument; + struct tqh_td_vbd_request new_requests; + struct tqh_td_vbd_request pending_requests; + struct tqh_td_vbd_request failed_requests; + struct tqh_td_vbd_request completed_requests; - struct list_head next; + td_vbd_request_t request_list[MAX_REQUESTS]; /* XXX */ + + TAILQ_ENTRY(td_vbd_handle) entry; struct timeval ts; @@ -125,83 +104,119 @@ struct td_vbd_handle { uint64_t secs_pending; uint64_t retries; uint64_t errors; + td_sector_count_t secs; }; #define tapdisk_vbd_for_each_request(vreq, tmp, list) \ - list_for_each_entry_safe((vreq), (tmp), (list), next) + TAILQ_FOREACH_SAFE((vreq), (list), next, (tmp)) #define tapdisk_vbd_for_each_image(vbd, image, tmp) \ - list_for_each_entry_safe((image), (tmp), &(vbd)->images, next) + tapdisk_for_each_image_safe(image, tmp, &vbd->images) +/** + * Removes the request from its current queue and inserts it to the specified + * one. + */ static inline void -tapdisk_vbd_move_request(td_vbd_request_t *vreq, struct list_head *dest) +tapdisk_vbd_move_request(td_vbd_request_t * vreq, + struct tqh_td_vbd_request *dest) { - list_del(&vreq->next); - INIT_LIST_HEAD(&vreq->next); - list_add_tail(&vreq->next, dest); + assert(vreq); + assert(dest); + + assert(vreq->list_head); + TAILQ_REMOVE(vreq->list_head, vreq, next); + + TAILQ_INSERT_TAIL(dest, vreq, next); + + vreq->list_head = dest; } static inline void tapdisk_vbd_add_image(td_vbd_t *vbd, td_image_t *image) { - list_add_tail(&image->next, &vbd->images); + TAILQ_INSERT_TAIL(&vbd->images, image, entry); } static inline int tapdisk_vbd_is_last_image(td_vbd_t *vbd, td_image_t *image) { - return list_is_last(&image->next, &vbd->images); + return TAILQ_LAST(&vbd->images, tqh_td_image_handle) == image; } -td_image_t * -tapdisk_vbd_first_image(td_vbd_t *vbd); +/** + * Retrieves the first image of this VBD. + */ +static inline td_image_t * +tapdisk_vbd_first_image(td_vbd_t *vbd) +{ + td_image_t *image = NULL; + if (!TAILQ_EMPTY(&vbd->images)) + image = TAILQ_FIRST(&vbd->images); + return image; +} static inline td_image_t * tapdisk_vbd_last_image(td_vbd_t *vbd) { - return list_entry(vbd->images.prev, td_image_t, next); + td_image_t *image = NULL; + if (!TAILQ_EMPTY(&vbd->images)) + image = TAILQ_LAST(&vbd->images, tqh_td_image_handle); + return image; } -static inline td_image_t * -tapdisk_vbd_next_image(td_image_t *image) +static inline td_image_t *tapdisk_vbd_next_image(td_image_t * image) { - return list_entry(image->next.next, td_image_t, next); + return TAILQ_NEXT(image, entry); } -td_vbd_t *tapdisk_vbd_create(td_uuid_t); -int tapdisk_vbd_initialize(td_uuid_t); -void tapdisk_vbd_set_callback(td_vbd_t *, td_vbd_cb_t, void *); -int tapdisk_vbd_parse_stack(td_vbd_t *vbd, const char *path); -int tapdisk_vbd_open(td_vbd_t *, const char *, uint16_t, - uint16_t, int, const char *, td_flag_t); +td_vbd_t *tapdisk_vbd_create(void); + +int tapdisk_vbd_initialize(int rfd, int wfd, const char * params); + +/* + * XXX Function definition commented out in blktap2.5. + */ +int tapdisk_vbd_open(td_vbd_t *, const char *, int, const char *, td_flag_t); + int tapdisk_vbd_close(td_vbd_t *); -void tapdisk_vbd_free(td_vbd_t *); -void tapdisk_vbd_free_stack(td_vbd_t *); -int tapdisk_vbd_open_stack(td_vbd_t *, uint16_t, td_flag_t); -int tapdisk_vbd_open_vdi(td_vbd_t *, const char *, - uint16_t, uint16_t, td_flag_t); +/** + * Opens a VDI. + * + * @params vbd output parameter that receives a handle to the opened VDI + * @param params type:/path/to/file + * @params flags TD_OPEN_* TODO which TD_OPEN_* flags are honored? How does + * each flag affect the behavior of this functions? Move TD_OPEN_* flag + * definitions close to this function (check if they're used only by this + * function)? + * @param prt_path parent /path/to/file (optional) + * @returns 0 on success + */ +int tapdisk_vbd_open_vdi(td_vbd_t * vbd, const char *params, td_flag_t flags, + const char * prt_path); + +/** + * Closes a VDI. + */ void tapdisk_vbd_close_vdi(td_vbd_t *); -int tapdisk_vbd_attach(td_vbd_t *, const char *, int); -void tapdisk_vbd_detach(td_vbd_t *); - +int tapdisk_vbd_queue_request(td_vbd_t *, td_vbd_request_t *); void tapdisk_vbd_forward_request(td_request_t); -int tapdisk_vbd_get_image_info(td_vbd_t *, image_t *); -int tapdisk_vbd_queue_ready(td_vbd_t *); +int tapdisk_vbd_get_disk_info(td_vbd_t *, td_disk_info_t *); int tapdisk_vbd_retry_needed(td_vbd_t *); int tapdisk_vbd_quiesce_queue(td_vbd_t *); int tapdisk_vbd_start_queue(td_vbd_t *); int tapdisk_vbd_issue_requests(td_vbd_t *); int tapdisk_vbd_kill_queue(td_vbd_t *); int tapdisk_vbd_pause(td_vbd_t *); -int tapdisk_vbd_resume(td_vbd_t *, const char *, uint16_t); -int tapdisk_vbd_kick(td_vbd_t *); +int tapdisk_vbd_resume(td_vbd_t *, const char *); +void tapdisk_vbd_kick(td_vbd_t *); void tapdisk_vbd_check_state(td_vbd_t *); +int tapdisk_vbd_recheck_state(td_vbd_t *); void tapdisk_vbd_check_progress(td_vbd_t *); void tapdisk_vbd_debug(td_vbd_t *); - -void tapdisk_vbd_complete_vbd_request(td_vbd_t *, td_vbd_request_t *); +void tapdisk_vbd_stats(td_vbd_t *, td_stats_t *); #endif diff --git a/tools/blktap3/drivers/tapdisk.h b/tools/blktap3/drivers/tapdisk.h new file mode 100644 --- /dev/null +++ b/tools/blktap3/drivers/tapdisk.h @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2007, 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. + * + * Some notes on the tap_disk interface: + * + * tap_disk aims to provide a generic interface to easily implement new + * types of image accessors. The structure-of-function-calls is similar + * to disk interfaces used in qemu/denali/etc, with the significant + * difference being the expectation of asynchronous rather than synchronous + * I/O. The asynchronous interface is intended to allow lots of requests to + * be pipelined through a disk, without the disk requiring any of its own + * threads of control. As such, a batch of requests is delivered to the disk + * using: + * + * td_queue_[read,write]() + * + * and passing in a completion callback, which the disk is responsible for + * tracking. Disks should transform these requests as necessary and return + * the resulting iocbs to tapdisk using td_prep_[read,write]() and + * td_queue_tiocb(). + * + * NOTE: tapdisk uses the number of sectors submitted per request as a + * ref count. Plugins must use the callback function to communicate the + * completion -- or error -- of every sector submitted to them. + * + * td_get_parent_id returns: + * 0 if parent id successfully retrieved + * TD_NO_PARENT if no parent exists + * -errno on error + */ + +#ifndef _TAPDISK_H_ +#define _TAPDISK_H_ + +#include <sys/time.h> +#include <stdint.h> +#include <assert.h> + +// XXX? +//#include "blktaplib.h" +#include "blktap3.h" + +// TODO necessary? +#include "tapdisk-log.h" +#include "tapdisk-utils.h" +#include "tapdisk-stats.h" + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a)[0]) + +#define MAX_SEGMENTS_PER_REQ 11 +#define MAX_REQUESTS 32U +#define SECTOR_SHIFT 9 +#define DEFAULT_SECTOR_SIZE 512 + +#define TAPDISK_DATA_REQUESTS (MAX_REQUESTS * MAX_SEGMENTS_PER_REQ) + +//#define BLK_NOT_ALLOCATED (-99) +#define TD_NO_PARENT 1 + +#define MAX_RAMDISK_SIZE 1024000 /*500MB disk limit */ + +#define TD_OP_READ 0 +#define TD_OP_WRITE 1 + +#define TD_OPEN_QUIET 0x00001 +#define TD_OPEN_QUERY 0x00002 +#define TD_OPEN_RDONLY 0x00004 +#define TD_OPEN_STRICT 0x00008 +#define TD_OPEN_SHAREABLE 0x00010 +#define TD_OPEN_ADD_CACHE 0x00020 +#define TD_OPEN_VHD_INDEX 0x00040 +#define TD_OPEN_LOG_DIRTY 0x00080 +#define TD_OPEN_LOCAL_CACHE 0x00100 +#define TD_OPEN_REUSE_PARENT 0x00200 +#define TD_OPEN_SECONDARY 0x00400 +#define TD_OPEN_STANDBY 0x00800 +#define TD_IGNORE_ENOSPC 0x01000 + +#define TD_CREATE_SPARSE 0x00001 +#define TD_CREATE_MULTITYPE 0x00002 + +#define td_flag_set(word, flag) ((word) |= (flag)) +#define td_flag_clear(word, flag) ((word) &= ~(flag)) +#define td_flag_test(word, flag) ((word) & (flag)) + +typedef uint16_t td_uuid_t; +typedef uint32_t td_flag_t; +typedef uint64_t td_sector_t; +typedef struct td_disk_id td_disk_id_t; +typedef struct td_disk_info td_disk_info_t; +typedef struct td_request td_request_t; +typedef struct td_driver_handle td_driver_t; +typedef struct td_image_handle td_image_t; +typedef struct td_sector_count td_sector_count_t; +typedef struct td_vbd_request td_vbd_request_t; +typedef struct td_vbd_handle td_vbd_t; + +/* + * Prototype of the callback to activate as requests complete. + */ +typedef void (*td_callback_t) (td_request_t, int); +typedef void (*td_vreq_callback_t) (td_vbd_request_t *, int, void *, int); + +struct td_disk_id { + char *name; + int type; + int flags; +}; + +struct td_disk_info { + td_sector_t size; + long sector_size; + uint32_t info; +}; + + +TAILQ_HEAD(tqh_td_vbd_request, td_vbd_request); + +struct td_vbd_request { + + /** + * Operation: read/write + */ + int op; + + /** + * Start sector. + */ + td_sector_t sec; + + /** + * Scatter/gather list. + */ + struct td_iovec *iov; + int iovcnt; + + /** + * Completion callback. + */ + td_vreq_callback_t cb; + + void *token; + const char *name; + + int error; + int prev_error; + + int submitting; + int secs_pending; + int num_retries; + struct timeval ts; + struct timeval last_try; + + /** + * VBD this request belongs to. + */ + td_vbd_t *vbd; + + /* + * linked list of struct td_vbd_request + */ + TAILQ_ENTRY(td_vbd_request) next; + + /* + * TODO list head of what? + */ + struct tqh_td_vbd_request *list_head; +}; + +/* TODO why have these two types (td_request and td_vbd_request) separate? */ +struct td_request { + int op; + void *buf; + + td_sector_t sec; + int secs; + + td_image_t *image; + + td_callback_t cb; + void *cb_data; + + int sidx; + td_vbd_request_t *vreq; +}; + +/* + * Structure describing the interface to a virtual disk implementation. + * See note at the top of this file describing this interface. + */ +struct tap_disk { + const char *disk_type; + td_flag_t flags; + int private_data_size; + int (*td_open) (td_driver_t *, const char *, td_flag_t); + int (*td_close) (td_driver_t *); + int (*td_get_parent_id) (td_driver_t *, td_disk_id_t *); + int (*td_validate_parent) (td_driver_t *, td_driver_t *, td_flag_t); + void (*td_queue_read) (td_driver_t *, td_request_t); + void (*td_queue_write) (td_driver_t *, td_request_t); + void (*td_debug) (td_driver_t *); + void (*td_stats) (td_driver_t *, td_stats_t *); +}; + +struct td_sector_count { + td_sector_t rd; + td_sector_t wr; +}; + +static inline void +td_sector_count_add(td_sector_count_t * s, td_sector_t v, int write) +{ + if (write) + s->wr += v; + else + s->rd += v; +} + +void td_panic(void); + +/* TODO why not use struct iovec? */ +struct td_iovec { + void *base; + unsigned int secs; +}; + +#endif /* __TAPDISK_H__ */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |