|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 14 of 21 RESEND] blktap3/drivers: Introduce core tapdisk server
This patch copies from blktap2 the core of the tapdisk process, with most
changes coming from blktap2.5. Also, it replaces the minor number with
type:/path/to/file in function tapdisk_server_get_vbd as there is no minor
number in blktap3.
Signed-off-by: Thanos Makatos <thanos.makatos@xxxxxxxxxx>
diff --git a/tools/blktap2/drivers/tapdisk-server.c
b/tools/blktap3/drivers/tapdisk-server.c
copy from tools/blktap2/drivers/tapdisk-server.c
copy to tools/blktap3/drivers/tapdisk-server.c
--- a/tools/blktap2/drivers/tapdisk-server.c
+++ b/tools/blktap3/drivers/tapdisk-server.c
@@ -25,6 +25,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
@@ -32,18 +33,32 @@
#include <sys/ioctl.h>
#include <sys/signal.h>
-#include "tapdisk-utils.h"
+#include "tapdisk-syslog.h"
#include "tapdisk-server.h"
#include "tapdisk-driver.h"
#include "tapdisk-interface.h"
+#include "tapdisk-log.h"
#define DBG(_level, _f, _a...) tlog_write(_level, _f, ##_a)
#define ERR(_err, _f, _a...) tlog_error(_err, _f, ##_a)
- tapdisk_server_t server;
+#define TAPDISK_TIOCBS (TAPDISK_DATA_REQUESTS + 50)
+
+typedef struct tapdisk_server {
+ int run;
+
+ struct tqh_td_vbd_handle vbds;
+ scheduler_t scheduler;
+ struct tqueue aio_queue;
+ char *name;
+ char *ident;
+ int facility;
+} tapdisk_server_t;
+
+static tapdisk_server_t server;
#define tapdisk_server_for_each_vbd(vbd, tmp) \
- list_for_each_entry_safe(vbd, tmp, &server.vbds, next)
+ TAILQ_FOREACH_SAFE(vbd, &server.vbds, entry, tmp)
td_image_t *
tapdisk_server_get_shared_image(td_image_t *image)
@@ -56,26 +71,26 @@ tapdisk_server_get_shared_image(td_image
tapdisk_server_for_each_vbd(vbd, tmpv)
tapdisk_vbd_for_each_image(vbd, img, tmpi)
- if (img->type == image->type &&
- !strcmp(img->name, image->name))
+ if (img->type == image->type && !strcmp(img->name, image->name))
return img;
return NULL;
}
-struct list_head *
-tapdisk_server_get_all_vbds(void)
+struct tqh_td_vbd_handle *tapdisk_server_get_all_vbds(void)
{
return &server.vbds;
}
td_vbd_t *
-tapdisk_server_get_vbd(uint16_t uuid)
+tapdisk_server_get_vbd(const char *params)
{
td_vbd_t *vbd, *tmp;
+ assert(params);
+
tapdisk_server_for_each_vbd(vbd, tmp)
- if (vbd->uuid == uuid)
+ if (!strcmp(vbd->name, params))
return vbd;
return NULL;
@@ -84,14 +99,13 @@ tapdisk_server_get_vbd(uint16_t uuid)
void
tapdisk_server_add_vbd(td_vbd_t *vbd)
{
- list_add_tail(&vbd->next, &server.vbds);
+ TAILQ_INSERT_TAIL(&server.vbds, vbd, entry);
}
void
tapdisk_server_remove_vbd(td_vbd_t *vbd)
{
- list_del(&vbd->next);
- INIT_LIST_HEAD(&vbd->next);
+ TAILQ_REMOVE(&server.vbds, vbd, entry);
tapdisk_server_check_state();
}
@@ -111,13 +125,14 @@ tapdisk_server_debug(void)
tapdisk_server_for_each_vbd(vbd, tmp)
tapdisk_vbd_debug(vbd);
- tlog_flush();
+ DBG(TLOG_INFO, "debug log completed\n");
+ tlog_precious();
}
void
tapdisk_server_check_state(void)
{
- if (list_empty(&server.vbds))
+ if (TAILQ_EMPTY(&server.vbds))
server.run = 0;
}
@@ -136,7 +151,12 @@ tapdisk_server_unregister_event(event_id
}
void
-tapdisk_server_set_max_timeout(int seconds)
+tapdisk_server_mask_event(event_id_t event, int masked)
+{
+ return scheduler_mask_event(&server.scheduler, event, masked);
+}
+
+void tapdisk_server_set_max_timeout(int seconds)
{
scheduler_set_max_timeout(&server.scheduler, seconds);
}
@@ -180,7 +200,6 @@ tapdisk_server_submit_tiocbs(void)
static void
tapdisk_server_kick_responses(void)
{
- int n;
td_vbd_t *vbd, *tmp;
tapdisk_server_for_each_vbd(vbd, tmp)
@@ -196,8 +215,19 @@ tapdisk_server_check_vbds(void)
tapdisk_vbd_check_state(vbd);
}
-static void
-tapdisk_server_stop_vbds(void)
+static int
+tapdisk_server_recheck_vbds(void)
+{
+ td_vbd_t *vbd, *tmp;
+ int rv = 0;
+
+ tapdisk_server_for_each_vbd(vbd, tmp)
+ rv += tapdisk_vbd_recheck_state(vbd);
+
+ return rv;
+}
+
+static void tapdisk_server_stop_vbds(void)
{
td_vbd_t *vbd, *tmp;
@@ -218,9 +248,49 @@ tapdisk_server_close_aio(void)
tapdisk_free_queue(&server.aio_queue);
}
-static void
-tapdisk_server_close(void)
+int tapdisk_server_openlog(const char *name, int options, int facility)
{
+ server.facility = facility;
+ server.name = strdup(name);
+ server.ident = tapdisk_syslog_ident(name);
+
+ if (!server.name || !server.ident)
+ return -errno;
+
+ openlog(server.ident, options, facility);
+
+ return 0;
+}
+
+void tapdisk_server_closelog(void)
+{
+ closelog();
+
+ free(server.name);
+ server.name = NULL;
+
+ free(server.ident);
+ server.ident = NULL;
+}
+
+static int tapdisk_server_open_tlog(void)
+{
+ int err = 0;
+
+ if (server.name)
+ err = tlog_open(server.name, server.facility, TLOG_WARN);
+
+ return err;
+}
+
+static void tapdisk_server_close_tlog(void)
+{
+ tlog_close();
+}
+
+static void tapdisk_server_close(void)
+{
+ tapdisk_server_close_tlog();
tapdisk_server_close_aio();
}
@@ -238,8 +308,12 @@ tapdisk_server_iterate(void)
DBG(TLOG_WARN, "server wait returned %d\n", ret);
tapdisk_server_check_vbds();
- tapdisk_server_submit_tiocbs();
- tapdisk_server_kick_responses();
+ do {
+ tapdisk_server_submit_tiocbs();
+ tapdisk_server_kick_responses();
+
+ ret = tapdisk_server_recheck_vbds();
+ } while (ret);
}
static void
@@ -272,6 +346,7 @@ tapdisk_server_signal_handler(int signal
break;
case SIGUSR1:
+ DBG(TLOG_INFO, "debugging on signal %d\n", signal);
tapdisk_server_debug();
break;
}
@@ -281,7 +356,7 @@ int
tapdisk_server_init(void)
{
memset(&server, 0, sizeof(server));
- INIT_LIST_HEAD(&server.vbds);
+ TAILQ_INIT(&server.vbds);
scheduler_initialize(&server.scheduler);
@@ -297,17 +372,23 @@ tapdisk_server_complete(void)
if (err)
goto fail;
+ err = tapdisk_server_open_tlog();
+ if (err)
+ goto fail;
+
server.run = 1;
return 0;
fail:
+ tapdisk_server_close_tlog();
tapdisk_server_close_aio();
return err;
}
int
-tapdisk_server_initialize(void)
+tapdisk_server_initialize(const char *read __attribute__((unused)),
+ const char *write __attribute__((unused)))
{
int err;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |