xref: /plan9/sys/src/cmd/disk/kfs/console.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include	"all.h"
2*9a747e4fSDavid du Colombier #include	"9p1.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier void
fcall9p1(Chan * cp,Oldfcall * in,Oldfcall * ou)5*9a747e4fSDavid du Colombier fcall9p1(Chan *cp, Oldfcall *in, Oldfcall *ou)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 	int t;
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier 	rlock(&mainlock);
103e12c5d1SDavid du Colombier 	t = in->type;
11*9a747e4fSDavid du Colombier 	if(t < 0 || t >= MAXSYSCALL || (t&1) || !call9p1[t]) {
123e12c5d1SDavid du Colombier 		print("bad message type %d\n", t);
133e12c5d1SDavid du Colombier 		panic("");
143e12c5d1SDavid du Colombier 	}
153e12c5d1SDavid du Colombier 	ou->type = t+1;
163e12c5d1SDavid du Colombier 	ou->err = 0;
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier 	rlock(&cp->reflock);
19*9a747e4fSDavid du Colombier 	(*call9p1[t])(cp, in, ou);
203e12c5d1SDavid du Colombier 	runlock(&cp->reflock);
213e12c5d1SDavid du Colombier 
22*9a747e4fSDavid du Colombier 	if(ou->err)
23*9a747e4fSDavid du Colombier 		if(CHAT(cp))
24*9a747e4fSDavid du Colombier 			print("	error: %s\n", errstring[ou->err]);
253e12c5d1SDavid du Colombier 	cons.work.count++;
263e12c5d1SDavid du Colombier 	runlock(&mainlock);
273e12c5d1SDavid du Colombier }
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier int
con_session(void)303e12c5d1SDavid du Colombier con_session(void)
313e12c5d1SDavid du Colombier {
32*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
333e12c5d1SDavid du Colombier 
34*9a747e4fSDavid du Colombier 	in.type = Tsession9p1;
35*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
363e12c5d1SDavid du Colombier 	return ou.err;
373e12c5d1SDavid du Colombier }
383e12c5d1SDavid du Colombier 
393e12c5d1SDavid du Colombier int
con_attach(int fid,char * uid,char * arg)403e12c5d1SDavid du Colombier con_attach(int fid, char *uid, char *arg)
413e12c5d1SDavid du Colombier {
42*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
433e12c5d1SDavid du Colombier 
44*9a747e4fSDavid du Colombier 	in.type = Tattach9p1;
453e12c5d1SDavid du Colombier 	in.fid = fid;
463e12c5d1SDavid du Colombier 	strncpy(in.uname, uid, NAMELEN);
473e12c5d1SDavid du Colombier 	strncpy(in.aname, arg, NAMELEN);
48*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
493e12c5d1SDavid du Colombier 	return ou.err;
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier int
con_clone(int fid1,int fid2)533e12c5d1SDavid du Colombier con_clone(int fid1, int fid2)
543e12c5d1SDavid du Colombier {
55*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
563e12c5d1SDavid du Colombier 
57*9a747e4fSDavid du Colombier 	in.type = Tclone9p1;
583e12c5d1SDavid du Colombier 	in.fid = fid1;
593e12c5d1SDavid du Colombier 	in.newfid = fid2;
60*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
613e12c5d1SDavid du Colombier 	return ou.err;
623e12c5d1SDavid du Colombier }
633e12c5d1SDavid du Colombier 
643e12c5d1SDavid du Colombier int
con_path(int fid,char * path)653e12c5d1SDavid du Colombier con_path(int fid, char *path)
663e12c5d1SDavid du Colombier {
67*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
683e12c5d1SDavid du Colombier 	char *p;
693e12c5d1SDavid du Colombier 
70*9a747e4fSDavid du Colombier 	in.type = Twalk9p1;
713e12c5d1SDavid du Colombier 	in.fid = fid;
723e12c5d1SDavid du Colombier 
733e12c5d1SDavid du Colombier loop:
743e12c5d1SDavid du Colombier 	if(*path == 0)
753e12c5d1SDavid du Colombier 		return 0;
763e12c5d1SDavid du Colombier 	strncpy(in.name, path, NAMELEN);
773e12c5d1SDavid du Colombier 	if(p = strchr(path, '/')) {
783e12c5d1SDavid du Colombier 		path = p+1;
793e12c5d1SDavid du Colombier 		if(p = strchr(in.name, '/'))
803e12c5d1SDavid du Colombier 			*p = 0;
813e12c5d1SDavid du Colombier 	} else
823e12c5d1SDavid du Colombier 		path = strchr(path, 0);
833e12c5d1SDavid du Colombier 	if(in.name[0]) {
84*9a747e4fSDavid du Colombier 		fcall9p1(cons.chan, &in, &ou);
853e12c5d1SDavid du Colombier 		if(ou.err)
863e12c5d1SDavid du Colombier 			return ou.err;
873e12c5d1SDavid du Colombier 	}
883e12c5d1SDavid du Colombier 	goto loop;
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier 
913e12c5d1SDavid du Colombier int
con_walk(int fid,char * name)923e12c5d1SDavid du Colombier con_walk(int fid, char *name)
933e12c5d1SDavid du Colombier {
94*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
953e12c5d1SDavid du Colombier 
96*9a747e4fSDavid du Colombier 	in.type = Twalk9p1;
973e12c5d1SDavid du Colombier 	in.fid = fid;
983e12c5d1SDavid du Colombier 	strncpy(in.name, name, NAMELEN);
99*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1003e12c5d1SDavid du Colombier 	return ou.err;
1013e12c5d1SDavid du Colombier }
1023e12c5d1SDavid du Colombier 
1033e12c5d1SDavid du Colombier int
con_stat(int fid,char * data)1043e12c5d1SDavid du Colombier con_stat(int fid, char *data)
1053e12c5d1SDavid du Colombier {
106*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1073e12c5d1SDavid du Colombier 
108*9a747e4fSDavid du Colombier 	in.type = Tstat9p1;
1093e12c5d1SDavid du Colombier 	in.fid = fid;
110*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1113e12c5d1SDavid du Colombier 	if(ou.err == 0)
112bd389b36SDavid du Colombier 		memmove(data, ou.stat, sizeof ou.stat);
1133e12c5d1SDavid du Colombier 	return ou.err;
1143e12c5d1SDavid du Colombier }
1153e12c5d1SDavid du Colombier 
1163e12c5d1SDavid du Colombier int
con_wstat(int fid,char * data)1173e12c5d1SDavid du Colombier con_wstat(int fid, char *data)
1183e12c5d1SDavid du Colombier {
119*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1203e12c5d1SDavid du Colombier 
121*9a747e4fSDavid du Colombier 	in.type = Twstat9p1;
1223e12c5d1SDavid du Colombier 	in.fid = fid;
123bd389b36SDavid du Colombier 	memmove(in.stat, data, sizeof in.stat);
124*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1253e12c5d1SDavid du Colombier 	return ou.err;
1263e12c5d1SDavid du Colombier }
1273e12c5d1SDavid du Colombier 
1283e12c5d1SDavid du Colombier int
con_open(int fid,int mode)1293e12c5d1SDavid du Colombier con_open(int fid, int mode)
1303e12c5d1SDavid du Colombier {
131*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1323e12c5d1SDavid du Colombier 
133*9a747e4fSDavid du Colombier 	in.type = Topen9p1;
1343e12c5d1SDavid du Colombier 	in.fid = fid;
1353e12c5d1SDavid du Colombier 	in.mode = mode;
136*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1373e12c5d1SDavid du Colombier 	return ou.err;
1383e12c5d1SDavid du Colombier }
1393e12c5d1SDavid du Colombier 
1403e12c5d1SDavid du Colombier int
con_read(int fid,char * data,long offset,int count)1413e12c5d1SDavid du Colombier con_read(int fid, char *data, long offset, int count)
1423e12c5d1SDavid du Colombier {
143*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1443e12c5d1SDavid du Colombier 
145*9a747e4fSDavid du Colombier 	in.type = Tread9p1;
1463e12c5d1SDavid du Colombier 	in.fid = fid;
1473e12c5d1SDavid du Colombier 	in.offset = offset;
1483e12c5d1SDavid du Colombier 	in.count = count;
1493e12c5d1SDavid du Colombier 	ou.data = data;
150*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1513e12c5d1SDavid du Colombier 	if(ou.err)
1523e12c5d1SDavid du Colombier 		return 0;
1533e12c5d1SDavid du Colombier 	return ou.count;
1543e12c5d1SDavid du Colombier }
1553e12c5d1SDavid du Colombier 
1563e12c5d1SDavid du Colombier int
con_write(int fid,char * data,long offset,int count)1573e12c5d1SDavid du Colombier con_write(int fid, char *data, long offset, int count)
1583e12c5d1SDavid du Colombier {
159*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1603e12c5d1SDavid du Colombier 
161*9a747e4fSDavid du Colombier 	in.type = Twrite9p1;
1623e12c5d1SDavid du Colombier 	in.fid = fid;
1633e12c5d1SDavid du Colombier 	in.data = data;
1643e12c5d1SDavid du Colombier 	in.offset = offset;
1653e12c5d1SDavid du Colombier 	in.count = count;
166*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1673e12c5d1SDavid du Colombier 	if(ou.err)
1683e12c5d1SDavid du Colombier 		return 0;
1693e12c5d1SDavid du Colombier 	return ou.count;
1703e12c5d1SDavid du Colombier }
1713e12c5d1SDavid du Colombier 
1723e12c5d1SDavid du Colombier int
con_remove(int fid)1733e12c5d1SDavid du Colombier con_remove(int fid)
1743e12c5d1SDavid du Colombier {
175*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1763e12c5d1SDavid du Colombier 
177*9a747e4fSDavid du Colombier 	in.type = Tremove9p1;
1783e12c5d1SDavid du Colombier 	in.fid = fid;
179*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1803e12c5d1SDavid du Colombier 	return ou.err;
1813e12c5d1SDavid du Colombier }
1823e12c5d1SDavid du Colombier 
1833e12c5d1SDavid du Colombier int
con_create(int fid,char * name,int uid,int gid,long perm,int mode)1843e12c5d1SDavid du Colombier con_create(int fid, char *name, int uid, int gid, long perm, int mode)
1853e12c5d1SDavid du Colombier {
186*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
1873e12c5d1SDavid du Colombier 
188*9a747e4fSDavid du Colombier 	in.type = Tcreate9p1;
1893e12c5d1SDavid du Colombier 	in.fid = fid;
1903e12c5d1SDavid du Colombier 	strncpy(in.name, name, NAMELEN);
1913e12c5d1SDavid du Colombier 	in.perm = perm;
1923e12c5d1SDavid du Colombier 	in.mode = mode;
1933e12c5d1SDavid du Colombier 	cons.uid = uid;			/* beyond ugly */
1943e12c5d1SDavid du Colombier 	cons.gid = gid;
195*9a747e4fSDavid du Colombier 	fcall9p1(cons.chan, &in, &ou);
1963e12c5d1SDavid du Colombier 	return ou.err;
1973e12c5d1SDavid du Colombier }
1983e12c5d1SDavid du Colombier 
1993e12c5d1SDavid du Colombier int
doclri(File * f)2003e12c5d1SDavid du Colombier doclri(File *f)
2013e12c5d1SDavid du Colombier {
2023e12c5d1SDavid du Colombier 	Iobuf *p, *p1;
2033e12c5d1SDavid du Colombier 	Dentry *d, *d1;
2043e12c5d1SDavid du Colombier 	int err;
2053e12c5d1SDavid du Colombier 
2063e12c5d1SDavid du Colombier 	err = 0;
2073e12c5d1SDavid du Colombier 	p = 0;
2083e12c5d1SDavid du Colombier 	p1 = 0;
2093e12c5d1SDavid du Colombier 	if(isro(f->fs->dev)) {
2103e12c5d1SDavid du Colombier 		err = Eronly;
2113e12c5d1SDavid du Colombier 		goto out;
2123e12c5d1SDavid du Colombier 	}
2133e12c5d1SDavid du Colombier 	/*
2143e12c5d1SDavid du Colombier 	 * check on parent directory of file to be deleted
2153e12c5d1SDavid du Colombier 	 */
2163e12c5d1SDavid du Colombier 	if(f->wpath == 0 || f->wpath->addr == f->addr) {
2173e12c5d1SDavid du Colombier 		err = Ephase;
2183e12c5d1SDavid du Colombier 		goto out;
2193e12c5d1SDavid du Colombier 	}
2203e12c5d1SDavid du Colombier 	p1 = getbuf(f->fs->dev, f->wpath->addr, Bread);
2213e12c5d1SDavid du Colombier 	d1 = getdir(p1, f->wpath->slot);
2223e12c5d1SDavid du Colombier 	if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) {
2233e12c5d1SDavid du Colombier 		err = Ephase;
2243e12c5d1SDavid du Colombier 		goto out;
2253e12c5d1SDavid du Colombier 	}
2263e12c5d1SDavid du Colombier 
2273e12c5d1SDavid du Colombier 	accessdir(p1, d1, FWRITE);
2283e12c5d1SDavid du Colombier 	putbuf(p1);
2293e12c5d1SDavid du Colombier 	p1 = 0;
2303e12c5d1SDavid du Colombier 
2313e12c5d1SDavid du Colombier 	/*
2323e12c5d1SDavid du Colombier 	 * check on file to be deleted
2333e12c5d1SDavid du Colombier 	 */
2343e12c5d1SDavid du Colombier 	p = getbuf(f->fs->dev, f->addr, Bread);
2353e12c5d1SDavid du Colombier 	d = getdir(p, f->slot);
2363e12c5d1SDavid du Colombier 
2373e12c5d1SDavid du Colombier 
2383e12c5d1SDavid du Colombier 	/*
2393e12c5d1SDavid du Colombier 	 * do it
2403e12c5d1SDavid du Colombier 	 */
2413e12c5d1SDavid du Colombier 	memset(d, 0, sizeof(Dentry));
2423e12c5d1SDavid du Colombier 	settag(p, Tdir, QPNONE);
2433e12c5d1SDavid du Colombier 	freewp(f->wpath);
2443e12c5d1SDavid du Colombier 	freefp(f);
2453e12c5d1SDavid du Colombier 
2463e12c5d1SDavid du Colombier out:
2473e12c5d1SDavid du Colombier 	if(p1)
2483e12c5d1SDavid du Colombier 		putbuf(p1);
2493e12c5d1SDavid du Colombier 	if(p)
2503e12c5d1SDavid du Colombier 		putbuf(p);
2513e12c5d1SDavid du Colombier 	return err;
2523e12c5d1SDavid du Colombier }
2533e12c5d1SDavid du Colombier 
2543e12c5d1SDavid du Colombier void
f_clri(Chan * cp,Oldfcall * in,Oldfcall * ou)255*9a747e4fSDavid du Colombier f_clri(Chan *cp, Oldfcall *in, Oldfcall *ou)
2563e12c5d1SDavid du Colombier {
2573e12c5d1SDavid du Colombier 	File *f;
2583e12c5d1SDavid du Colombier 
2593e12c5d1SDavid du Colombier 	if(CHAT(cp)) {
2603e12c5d1SDavid du Colombier 		print("c_clri %d\n", cp->chan);
2613e12c5d1SDavid du Colombier 		print("	fid = %d\n", in->fid);
2623e12c5d1SDavid du Colombier 	}
2633e12c5d1SDavid du Colombier 
2643e12c5d1SDavid du Colombier 	f = filep(cp, in->fid, 0);
2653e12c5d1SDavid du Colombier 	if(!f) {
2663e12c5d1SDavid du Colombier 		ou->err = Efid;
2673e12c5d1SDavid du Colombier 		goto out;
2683e12c5d1SDavid du Colombier 	}
2693e12c5d1SDavid du Colombier 	ou->err = doclri(f);
2703e12c5d1SDavid du Colombier 
2713e12c5d1SDavid du Colombier out:
2723e12c5d1SDavid du Colombier 	ou->fid = in->fid;
2733e12c5d1SDavid du Colombier 	if(f)
2743e12c5d1SDavid du Colombier 		qunlock(f);
2753e12c5d1SDavid du Colombier }
2763e12c5d1SDavid du Colombier 
2773e12c5d1SDavid du Colombier int
con_clri(int fid)2783e12c5d1SDavid du Colombier con_clri(int fid)
2793e12c5d1SDavid du Colombier {
280*9a747e4fSDavid du Colombier 	Oldfcall in, ou;
2813e12c5d1SDavid du Colombier 	Chan *cp;
2823e12c5d1SDavid du Colombier 
283*9a747e4fSDavid du Colombier 	in.type = Tremove9p1;
2843e12c5d1SDavid du Colombier 	in.fid = fid;
2853e12c5d1SDavid du Colombier 	cp = cons.chan;
2863e12c5d1SDavid du Colombier 
2873e12c5d1SDavid du Colombier 	rlock(&mainlock);
288*9a747e4fSDavid du Colombier 	ou.type = Tremove9p1+1;
2893e12c5d1SDavid du Colombier 	ou.err = 0;
2903e12c5d1SDavid du Colombier 
2913e12c5d1SDavid du Colombier 	rlock(&cp->reflock);
2923e12c5d1SDavid du Colombier 
2933e12c5d1SDavid du Colombier 	f_clri(cp, &in, &ou);
2943e12c5d1SDavid du Colombier 
2953e12c5d1SDavid du Colombier 	runlock(&cp->reflock);
2963e12c5d1SDavid du Colombier 
2973e12c5d1SDavid du Colombier 	cons.work.count++;
2983e12c5d1SDavid du Colombier 	runlock(&mainlock);
2993e12c5d1SDavid du Colombier 	return ou.err;
3003e12c5d1SDavid du Colombier }
301*9a747e4fSDavid du Colombier 
302*9a747e4fSDavid du Colombier int
con_swap(int fid1,int fid2)303*9a747e4fSDavid du Colombier con_swap(int fid1, int fid2)
304*9a747e4fSDavid du Colombier {
305*9a747e4fSDavid du Colombier 	int err;
306*9a747e4fSDavid du Colombier 	Iobuf *p1, *p2;
307*9a747e4fSDavid du Colombier 	File *f1, *f2;
308*9a747e4fSDavid du Colombier 	Dentry *d1, *d2;
309*9a747e4fSDavid du Colombier 	Dentry dt1, dt2;
310*9a747e4fSDavid du Colombier 	Chan *cp;
311*9a747e4fSDavid du Colombier 
312*9a747e4fSDavid du Colombier 	cp = cons.chan;
313*9a747e4fSDavid du Colombier 	err = 0;
314*9a747e4fSDavid du Colombier 	rlock(&mainlock);
315*9a747e4fSDavid du Colombier 	rlock(&cp->reflock);
316*9a747e4fSDavid du Colombier 
317*9a747e4fSDavid du Colombier 	f2 = nil;
318*9a747e4fSDavid du Colombier 	p1 = p2 = nil;
319*9a747e4fSDavid du Colombier 	f1 = filep(cp, fid1, 0);
320*9a747e4fSDavid du Colombier 	if(!f1){
321*9a747e4fSDavid du Colombier 		err = Efid;
322*9a747e4fSDavid du Colombier 		goto out;
323*9a747e4fSDavid du Colombier 	}
324*9a747e4fSDavid du Colombier 	p1 = getbuf(f1->fs->dev, f1->addr, Bread|Bmod);
325*9a747e4fSDavid du Colombier 	d1 = getdir(p1, f1->slot);
326*9a747e4fSDavid du Colombier 	if(!d1 || !(d1->mode&DALLOC)){
327*9a747e4fSDavid du Colombier 		err = Ealloc;
328*9a747e4fSDavid du Colombier 		goto out;
329*9a747e4fSDavid du Colombier 	}
330*9a747e4fSDavid du Colombier 
331*9a747e4fSDavid du Colombier 	f2 = filep(cp, fid2, 0);
332*9a747e4fSDavid du Colombier 	if(!f2){
333*9a747e4fSDavid du Colombier 		err = Efid;
334*9a747e4fSDavid du Colombier 		goto out;
335*9a747e4fSDavid du Colombier 	}
336*9a747e4fSDavid du Colombier 	if(memcmp(&f1->fs->dev, &f2->fs->dev, 4)==0
337*9a747e4fSDavid du Colombier 	&& f2->addr == f1->addr)
338*9a747e4fSDavid du Colombier 		p2 = p1;
339*9a747e4fSDavid du Colombier 	else
340*9a747e4fSDavid du Colombier 		p2 = getbuf(f2->fs->dev, f2->addr, Bread|Bmod);
341*9a747e4fSDavid du Colombier 	d2 = getdir(p2, f2->slot);
342*9a747e4fSDavid du Colombier 	if(!d2 || !(d2->mode&DALLOC)){
343*9a747e4fSDavid du Colombier 		err = Ealloc;
344*9a747e4fSDavid du Colombier 		goto out;
345*9a747e4fSDavid du Colombier 	}
346*9a747e4fSDavid du Colombier 
347*9a747e4fSDavid du Colombier 	dt1 = *d1;
348*9a747e4fSDavid du Colombier 	dt2 = *d2;
349*9a747e4fSDavid du Colombier 	*d1 = dt2;
350*9a747e4fSDavid du Colombier 	*d2 = dt1;
351*9a747e4fSDavid du Colombier 	memmove(d1->name, dt1.name, NAMELEN);
352*9a747e4fSDavid du Colombier 	memmove(d2->name, dt2.name, NAMELEN);
353*9a747e4fSDavid du Colombier 
354*9a747e4fSDavid du Colombier 	mkqid(&f1->qid, d1, 1);
355*9a747e4fSDavid du Colombier 	mkqid(&f2->qid, d2, 1);
356*9a747e4fSDavid du Colombier out:
357*9a747e4fSDavid du Colombier 	if(f1)
358*9a747e4fSDavid du Colombier 		qunlock(f1);
359*9a747e4fSDavid du Colombier 	if(f2)
360*9a747e4fSDavid du Colombier 		qunlock(f2);
361*9a747e4fSDavid du Colombier 	if(p1)
362*9a747e4fSDavid du Colombier 		putbuf(p1);
363*9a747e4fSDavid du Colombier 	if(p2 && p2!=p1)
364*9a747e4fSDavid du Colombier 		putbuf(p2);
365*9a747e4fSDavid du Colombier 
366*9a747e4fSDavid du Colombier 	runlock(&cp->reflock);
367*9a747e4fSDavid du Colombier 	cons.work.count++;
368*9a747e4fSDavid du Colombier 	runlock(&mainlock);
369*9a747e4fSDavid du Colombier 
370*9a747e4fSDavid du Colombier 	return err;
371*9a747e4fSDavid du Colombier }
372