root / drivers / tapdisk-driver.c @ abdb293f
History | View | Annotate | Download (4.2 kB)
1 |
/*
|
---|---|
2 |
* Copyright (c) 2008, XenSource Inc.
|
3 |
* All rights reserved.
|
4 |
*
|
5 |
* Redistribution and use in source and binary forms, with or without
|
6 |
* modification, are permitted provided that the following conditions are met:
|
7 |
* * Redistributions of source code must retain the above copyright
|
8 |
* notice, this list of conditions and the following disclaimer.
|
9 |
* * Redistributions in binary form must reproduce the above copyright
|
10 |
* notice, this list of conditions and the following disclaimer in the
|
11 |
* documentation and/or other materials provided with the distribution.
|
12 |
* * Neither the name of XenSource Inc. nor the names of its contributors
|
13 |
* may be used to endorse or promote products derived from this software
|
14 |
* without specific prior written permission.
|
15 |
*
|
16 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17 |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18 |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19 |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
20 |
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
21 |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22 |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
23 |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
24 |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25 |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
26 |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27 |
*/
|
28 |
|
29 |
#ifdef HAVE_CONFIG_H
|
30 |
#include "config.h" |
31 |
#endif
|
32 |
|
33 |
#include <stdlib.h> |
34 |
#include <stdio.h> |
35 |
|
36 |
#include "tapdisk-driver.h" |
37 |
#include "tapdisk-server.h" |
38 |
#include "tapdisk-disktype.h" |
39 |
#include "tapdisk-stats.h" |
40 |
|
41 |
static void |
42 |
tapdisk_driver_log_flush(td_driver_t *driver, const char *__caller) |
43 |
{ |
44 |
td_loglimit_t *rl = &driver->loglimit; |
45 |
|
46 |
if (rl->dropped) {
|
47 |
tlog_syslog(LOG_WARNING, |
48 |
"%s: %s: %d messages suppressed",
|
49 |
driver->name, __caller, rl->dropped); |
50 |
rl->dropped = 0;
|
51 |
} |
52 |
} |
53 |
|
54 |
int
|
55 |
tapdisk_driver_log_pass(td_driver_t *driver, const char *__caller) |
56 |
{ |
57 |
td_loglimit_t *rl = &driver->loglimit; |
58 |
int dropping = rl->dropped;
|
59 |
|
60 |
if (tapdisk_loglimit_pass(rl)) {
|
61 |
tapdisk_driver_log_flush(driver, __caller); |
62 |
return 1; |
63 |
} |
64 |
|
65 |
if (!dropping)
|
66 |
tlog_syslog(LOG_WARNING, |
67 |
"%s: %s: too many errors, dropped.",
|
68 |
driver->name, __caller); |
69 |
|
70 |
return 0; |
71 |
} |
72 |
|
73 |
td_driver_t * |
74 |
tapdisk_driver_allocate(int type, const char *name, td_flag_t flags) |
75 |
{ |
76 |
int err;
|
77 |
td_driver_t *driver; |
78 |
const struct tap_disk *ops; |
79 |
|
80 |
ops = tapdisk_disk_drivers[type]; |
81 |
if (!ops)
|
82 |
return NULL; |
83 |
|
84 |
driver = calloc(1, sizeof(td_driver_t)); |
85 |
if (!driver)
|
86 |
return NULL; |
87 |
|
88 |
err = tapdisk_namedup(&driver->name, name); |
89 |
if (err)
|
90 |
goto fail;
|
91 |
|
92 |
driver->ops = ops; |
93 |
driver->type = type; |
94 |
driver->storage = -1;
|
95 |
driver->data = calloc(1, ops->private_data_size);
|
96 |
if (!driver->data)
|
97 |
goto fail;
|
98 |
|
99 |
if (td_flag_test(flags, TD_OPEN_RDONLY))
|
100 |
td_flag_set(driver->state, TD_DRIVER_RDONLY); |
101 |
|
102 |
tapdisk_loglimit_init(&driver->loglimit, |
103 |
16 /* msgs */, |
104 |
90 * 1000 /* ms */); |
105 |
|
106 |
return driver;
|
107 |
|
108 |
fail:
|
109 |
free(driver->name); |
110 |
free(driver->data); |
111 |
free(driver); |
112 |
return NULL; |
113 |
} |
114 |
|
115 |
void
|
116 |
tapdisk_driver_free(td_driver_t *driver) |
117 |
{ |
118 |
if (!driver)
|
119 |
return;
|
120 |
|
121 |
if (driver->refcnt)
|
122 |
return;
|
123 |
|
124 |
if (td_flag_test(driver->state, TD_DRIVER_OPEN))
|
125 |
EPRINTF("freeing open driver %s (state 0x%08x)\n",
|
126 |
driver->name, driver->state); |
127 |
|
128 |
tapdisk_driver_log_flush(driver, __func__); |
129 |
|
130 |
free(driver->name); |
131 |
free(driver->data); |
132 |
free(driver); |
133 |
} |
134 |
|
135 |
void
|
136 |
tapdisk_driver_queue_tiocb(td_driver_t *driver, struct tiocb *tiocb)
|
137 |
{ |
138 |
tapdisk_server_queue_tiocb(tiocb); |
139 |
} |
140 |
|
141 |
void
|
142 |
tapdisk_driver_debug(td_driver_t *driver) |
143 |
{ |
144 |
if (driver->ops->td_debug)
|
145 |
driver->ops->td_debug(driver); |
146 |
} |
147 |
|
148 |
void
|
149 |
tapdisk_driver_stats(td_driver_t *driver, td_stats_t *st) |
150 |
{ |
151 |
const disk_info_t *info;
|
152 |
|
153 |
tapdisk_stats_field(st, "type", "d", driver->type); |
154 |
|
155 |
info = tapdisk_disk_types[driver->type]; |
156 |
tapdisk_stats_field(st, "name", "s", info->name); |
157 |
|
158 |
if (driver->ops->td_stats) {
|
159 |
tapdisk_stats_field(st, "status", "{"); |
160 |
driver->ops->td_stats(driver, st); |
161 |
tapdisk_stats_leave(st, '}');
|
162 |
} else
|
163 |
tapdisk_stats_field(st, "status", NULL); |
164 |
|
165 |
} |