View | Details | Raw Unified | Return to bug 194663 | Differences between
and this patch

Collapse All | Expand All

(-)aoedev.c (-38 / +51 lines)
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

Return to bug 194663