Lines 42-47
Link Here
|
42 |
#include <sys/mutex.h> |
42 |
#include <sys/mutex.h> |
43 |
#include <sys/socket.h> |
43 |
#include <sys/socket.h> |
44 |
#include <sys/sysctl.h> |
44 |
#include <sys/sysctl.h> |
|
|
45 |
#include <sys/sbuf.h> |
45 |
|
46 |
|
46 |
#include <sys/conf.h> |
47 |
#include <sys/conf.h> |
47 |
#include <geom/geom_disk.h> |
48 |
#include <geom/geom_disk.h> |
Lines 62-67
Link Here
|
62 |
SYSCTL_OID(_net_aoe, OID_AUTO, devices, CTLTYPE_STRING|CTLFLAG_RD, NULL, 0, |
63 |
SYSCTL_OID(_net_aoe, OID_AUTO, devices, CTLTYPE_STRING|CTLFLAG_RD, NULL, 0, |
63 |
sysctl_aoe_devices, "A", "AoE Device Info"); |
64 |
sysctl_aoe_devices, "A", "AoE Device Info"); |
64 |
|
65 |
|
|
|
66 |
|
67 |
// this method should be called with locked devlist_mtx! |
65 |
static struct aoedev * |
68 |
static struct aoedev * |
66 |
aoedev_newdev(u_long nframes, u_long unit) |
69 |
aoedev_newdev(u_long nframes, u_long unit) |
67 |
{ |
70 |
{ |
Lines 69-77
Link Here
|
69 |
struct frame *f, *e; |
72 |
struct frame *f, *e; |
70 |
char buf[16]; |
73 |
char buf[16]; |
71 |
|
74 |
|
|
|
75 |
// check first if we already know this device unit |
76 |
for (d=devlist; d; d=d->ad_next) { |
77 |
if (d->ad_unit == unit |
78 |
/* || memcmp(d->ad_addr, addr, sizeof d->ad_addr) == 0 */ ) { |
79 |
return (d); |
80 |
} |
81 |
} |
82 |
|
83 |
// not found, then create a new d |
84 |
|
85 |
|
72 |
d = (struct aoedev *) malloc(sizeof *d, M_AOEDEV, M_NOWAIT | M_ZERO); |
86 |
d = (struct aoedev *) malloc(sizeof *d, M_AOEDEV, M_NOWAIT | M_ZERO); |
73 |
if (d == NULL) |
87 |
if (d == NULL) { |
74 |
return (NULL); |
88 |
return (NULL); |
|
|
89 |
} |
75 |
f = (struct frame *) malloc(nframes * sizeof *f, M_AOEFRAME, M_NOWAIT | M_ZERO); |
90 |
f = (struct frame *) malloc(nframes * sizeof *f, M_AOEFRAME, M_NOWAIT | M_ZERO); |
76 |
if (f == NULL) { |
91 |
if (f == NULL) { |
77 |
free(d, M_AOEDEV); |
92 |
free(d, M_AOEDEV); |
Lines 89-99
Link Here
|
89 |
snprintf(buf, sizeof buf, "aoed%ld", unit); |
104 |
snprintf(buf, sizeof buf, "aoed%ld", unit); |
90 |
mtx_init(&d->ad_mtx, buf, NULL, MTX_DEF); |
105 |
mtx_init(&d->ad_mtx, buf, NULL, MTX_DEF); |
91 |
|
106 |
|
92 |
mtx_lock(&devlist_mtx); |
107 |
|
93 |
d->ad_next = devlist; |
108 |
d->ad_next = devlist; |
94 |
devlist = d; |
109 |
devlist = d; |
95 |
mtx_unlock(&devlist_mtx); |
110 |
|
96 |
|
|
|
97 |
return (d); |
111 |
return (d); |
98 |
} |
112 |
} |
99 |
|
113 |
|
Lines 153-173
Link Here
|
153 |
{ |
167 |
{ |
154 |
struct aoedev *d; |
168 |
struct aoedev *d; |
155 |
|
169 |
|
156 |
mtx_lock(&devlist_mtx); |
|
|
157 |
for (d=devlist; d; d=d->ad_next) |
158 |
if (d->ad_unit == unit |
159 |
/* || memcmp(d->ad_addr, addr, sizeof d->ad_addr) == 0 */ ) |
160 |
break; |
161 |
mtx_unlock(&devlist_mtx); |
162 |
|
170 |
|
|
|
171 |
// make new device, if not already known by unit |
172 |
mtx_lock(&devlist_mtx); |
173 |
d = aoedev_newdev(bufcnt, unit); |
163 |
if (d == NULL) { |
174 |
if (d == NULL) { |
164 |
d = aoedev_newdev(bufcnt, unit); |
175 |
mtx_unlock(&devlist_mtx); |
165 |
if (d == NULL) { |
176 |
IPRINTK("aoedev_newdev failure.\n"); |
166 |
IPRINTK("aoedev_newdev failure.\n"); |
177 |
return (NULL); |
167 |
return (NULL); |
|
|
168 |
} |
169 |
} |
178 |
} |
170 |
|
179 |
|
|
|
180 |
|
171 |
mtx_lock(&d->ad_mtx); |
181 |
mtx_lock(&d->ad_mtx); |
172 |
|
182 |
|
173 |
d->ad_ifp = ifp; |
183 |
d->ad_ifp = ifp; |
Lines 182-188
Link Here
|
182 |
d->ad_minor = AOEMINOR(unit); |
192 |
d->ad_minor = AOEMINOR(unit); |
183 |
} |
193 |
} |
184 |
|
194 |
|
|
|
195 |
|
185 |
mtx_unlock(&d->ad_mtx); |
196 |
mtx_unlock(&d->ad_mtx); |
|
|
197 |
mtx_unlock(&devlist_mtx); |
186 |
return (d); |
198 |
return (d); |
187 |
} |
199 |
} |
188 |
|
200 |
|
Lines 239-247
Link Here
|
239 |
static int |
251 |
static int |
240 |
sysctl_aoe_devices(SYSCTL_HANDLER_ARGS) |
252 |
sysctl_aoe_devices(SYSCTL_HANDLER_ARGS) |
241 |
{ |
253 |
{ |
242 |
char *buf; |
254 |
struct sbuf buf; |
243 |
struct aoedev *d; |
255 |
struct aoedev *d; |
244 |
register int n; |
256 |
int n, error; |
|
|
257 |
|
245 |
enum { LINESZ = 64 }; |
258 |
enum { LINESZ = 64 }; |
246 |
|
259 |
|
247 |
mtx_lock(&devlist_mtx); |
260 |
mtx_lock(&devlist_mtx); |
Lines 249-281
Link Here
|
249 |
mtx_unlock(&devlist_mtx); |
262 |
mtx_unlock(&devlist_mtx); |
250 |
return (SYSCTL_OUT(req, "\0", 1)); |
263 |
return (SYSCTL_OUT(req, "\0", 1)); |
251 |
} |
264 |
} |
252 |
|
265 |
|
|
|
266 |
// determine the size of the output |
253 |
n = 0; |
267 |
n = 0; |
254 |
for (d=devlist; d; d=d->ad_next) |
268 |
for (d=devlist; d; d=d->ad_next) |
255 |
n += LINESZ; |
269 |
n += LINESZ; |
256 |
buf = (char *) malloc(n+1, M_TEMP, M_NOWAIT | M_ZERO); |
270 |
error = sysctl_wire_old_buffer(req, 0); |
257 |
if (buf == NULL) { |
271 |
if (error != 0) |
258 |
IPRINTK("could not malloc " |
272 |
return (error); |
259 |
"buffer size %d to print device list\n", n); |
273 |
sbuf_new_for_sysctl(&buf, NULL, n, req); |
260 |
mtx_unlock(&devlist_mtx); |
274 |
|
261 |
return (ENOMEM); |
|
|
262 |
} |
263 |
|
264 |
n = 0; |
265 |
for (d=devlist; d; d=d->ad_next) { |
275 |
for (d=devlist; d; d=d->ad_next) { |
266 |
n += snprintf(buf+n, LINESZ, "\naoed%-6ld\t%s\t%s%s%s\t(%d)", |
276 |
sbuf_printf(&buf, "\naoed%-6ld\t%s\t%s%s%s\t(%d)\t(%ld)", |
267 |
d->ad_unit, |
277 |
d->ad_unit, |
268 |
d->ad_ifp->if_xname, |
278 |
d->ad_ifp->if_xname, |
269 |
(d->ad_flags & DEVFL_UP) ? "UP" : "DOWN", |
279 |
(d->ad_flags & DEVFL_UP) ? "UP" : "DOWN", |
270 |
(d->ad_flags & DEVFL_OPEN) ? ",OPEN" : "", |
280 |
(d->ad_flags & DEVFL_OPEN) ? ",OPEN" : "", |
271 |
(d->ad_flags & DEVFL_CLOSEWAIT) ? ",CLOSEWAIT" : "", |
281 |
(d->ad_flags & DEVFL_CLOSEWAIT) ? ",CLOSEWAIT" : "", |
272 |
d->ad_disk->d_maxsize); |
282 |
(d->ad_flags & DEVFL_UP) ? d->ad_disk->d_maxsize : -1, |
|
|
283 |
(d->ad_flags & DEVFL_UP) ? d->ad_disk->d_mediasize : -1 |
284 |
); |
273 |
} |
285 |
} |
274 |
mtx_unlock(&devlist_mtx); |
286 |
mtx_unlock(&devlist_mtx); |
275 |
|
287 |
|
276 |
n = SYSCTL_OUT(req, buf, n+1); |
288 |
error = sbuf_finish(&buf); |
277 |
free(buf, M_TEMP); |
289 |
sbuf_delete(&buf); |
278 |
return (n); |
290 |
return (error); |
279 |
} |
291 |
} |
280 |
|
292 |
|
281 |
/* |
293 |
/* |
Lines 315-320
Link Here
|
315 |
tsleep(d, 0, "aoeunl", hz>>1); |
327 |
tsleep(d, 0, "aoeunl", hz>>1); |
316 |
aoedev_freedev(d); |
328 |
aoedev_freedev(d); |
317 |
} |
329 |
} |
|
|
330 |
devlist = NULL; |
318 |
mtx_destroy(&devlist_mtx); |
331 |
mtx_destroy(&devlist_mtx); |
319 |
} |
332 |
} |
320 |
|
333 |
|