plan 9 kernel history: overview | file list | diff list

2002/0404/port/devwpsd.c (diff list | history)

2002/0330/sys/src/9/port/devwpsd.c:1,32002/0404/sys/src/9/port/devwpsd.c:1,6 (short | long | prev | next)
2002/0404    
/* 
 * Storage Device. 
 */ 
2002/0330    
#include "u.h" 
#include "../port/lib.h" 
#include "mem.h" 
2002/0330/sys/src/9/port/devwpsd.c:9,192002/0404/sys/src/9/port/devwpsd.c:12,18
2002/0330    
 
#include "../port/sd.h" 
 
/* 
 * Storage Device. 
 */ 
                 
extern Dev sddevtab; 
2002/0404    
extern Dev wpsddevtab; 
2002/0330    
extern SDifc* sdifc[]; 
 
typedef struct { 
2002/0330/sys/src/9/port/devwpsd.c:31,362002/0404/sys/src/9/port/devwpsd.c:30,49
2002/0330    
	Rawstatus, 
}; 
 
2002/0404    
enum 
{ 
	CMpart, 
	CMdelpart, 
	CMwildcard, 
}; 
 
Cmdtab ctlmsg[] = 
{ 
	CMpart,		"part",		3, 
	CMdelpart,	"delpart",	1, 
	CMwildcard,	"*",		0, 
}; 
 
2002/0330    
enum { 
	Qtopdir		= 1,		/* top level directory */ 
	Qtopbase, 
2002/0330/sys/src/9/port/devwpsd.c:461,4672002/0404/sys/src/9/port/devwpsd.c:474,480
2002/0330    
	case Qtopdir: 
		if(s == DEVDOTDOT){ 
			mkqid(&q, QID(0, s, 0, Qtopdir), 0, QTDIR); 
			sprint(up->genbuf, "#%C", sddevtab.dc); 
2002/0404    
			sprint(up->genbuf, "#%C", wpsddevtab.dc); 
2002/0330    
			devdir(c, q, up->genbuf, 0, eve, 0555, dp); 
			return 1; 
		} 
2002/0330/sys/src/9/port/devwpsd.c:507,5132002/0404/sys/src/9/port/devwpsd.c:520,526
2002/0330    
	case Qunitdir: 
		if(s == DEVDOTDOT){ 
			mkqid(&q, QID(0, s, 0, Qtopdir), 0, QTDIR); 
			sprint(up->genbuf, "#%C", sddevtab.dc); 
2002/0404    
			sprint(up->genbuf, "#%C", wpsddevtab.dc); 
2002/0330    
			devdir(c, q, up->genbuf, 0, eve, 0555, dp); 
			return 1; 
		} 
2002/0330/sys/src/9/port/devwpsd.c:591,5972002/0404/sys/src/9/port/devwpsd.c:604,610
2002/0330    
	int idno, subno, i; 
 
	if(ndevs == 0 || *spec == '\0'){ 
		c = devattach(sddevtab.dc, spec); 
2002/0404    
		c = devattach(wpsddevtab.dc, spec); 
2002/0330    
		mkqid(&c->qid, QID(0, 0, 0, Qtopdir), 0, QTDIR); 
		return c; 
	} 
2002/0330/sys/src/9/port/devwpsd.c:615,6212002/0404/sys/src/9/port/devwpsd.c:628,634
2002/0330    
	incref(&sdev->r); 
	qunlock(&devslock); 
 
	c = devattach(sddevtab.dc, spec); 
2002/0404    
	c = devattach(wpsddevtab.dc, spec); 
2002/0330    
	mkqid(&c->qid, QID(sdev->idno, subno, 0, Qunitdir), 0, QTDIR); 
	c->dev = (sdev->idno << UnitLOG) + subno; 
	decref(&sdev->r); 
2002/0330/sys/src/9/port/devwpsd.c:657,6632002/0404/sys/src/9/port/devwpsd.c:670,676
2002/0330    
		break; 
	case Qraw: 
		c->qid.vers = unit->vers; 
		if(!canlock(&unit->rawinuse)){ 
2002/0404    
		if(tas(&unit->rawinuse) != 0){ 
2002/0330    
			c->flag &= ~COPEN; 
			error(Einuse); 
		} 
2002/0330/sys/src/9/port/devwpsd.c:698,7042002/0404/sys/src/9/port/devwpsd.c:711,717
2002/0330    
		sdev = sdgetdev(DEV(c->qid)); 
		if (sdev) { 
			unit = sdev->unit[UNIT(c->qid)]; 
			unlock(&unit->rawinuse); 
2002/0404    
			unit->rawinuse = 0; 
2002/0330    
			decref(&sdev->r); 
		} 
		break; 
2002/0330/sys/src/9/port/devwpsd.c:783,7882002/0404/sys/src/9/port/devwpsd.c:796,803
2002/0330    
	} 
 
	offset = off%unit->secsize; 
2002/0404    
	if(offset+len > nb*unit->secsize) 
		len = nb*unit->secsize - offset; 
2002/0330    
	if(write){ 
		if(offset || (len%unit->secsize)){ 
			l = unit->dev->ifc->bio(unit, 0, 0, b, nb, bno); 
2002/0330/sys/src/9/port/devwpsd.c:1081,10862002/0404/sys/src/9/port/devwpsd.c:1096,1102
2002/0330    
sdwrite(Chan* c, void* a, long n, vlong off) 
{ 
	Cmdbuf *cb; 
2002/0404    
	Cmdtab *ct; 
2002/0330    
	SDreq *req; 
	SDunit *unit; 
	SDev *sdev; 
2002/0330/sys/src/9/port/devwpsd.c:1130,11472002/0404/sys/src/9/port/devwpsd.c:1146,1163
2002/0330    
				error(Ebadarg); 
		} 
 
		if(sddevtab.config == nil) 
2002/0404    
		if(wpsddevtab.config == nil) 
2002/0330    
			error("No configuration function"); 
		sddevtab.config(cd.o_on, cd.o_spec, &cd.o_cf); 
2002/0404    
		wpsddevtab.config(cd.o_on, cd.o_spec, &cd.o_cf); 
2002/0330    
		break; 
	} 
	case Qctl: 
		cb = parsecmd(a, n); 
		sdev = sdgetdev(DEV(c->qid)); 
		if (sdev == nil) 
			error(Enonexist); 
		unit = sdev->unit[UNIT(c->qid)]; 
 
2002/0404    
		cb = parsecmd(a, n); 
2002/0330    
		qlock(&unit->ctl); 
		if(waserror()){ 
			qunlock(&unit->ctl); 
2002/0330/sys/src/9/port/devwpsd.c:1152,11802002/0404/sys/src/9/port/devwpsd.c:1168,1194
2002/0330    
		if(unit->vers != c->qid.vers) 
			error(Eio); 
 
		if(cb->nf < 1) 
			error(Ebadctl); 
		if(strcmp(cb->f[0], "part") == 0){ 
			if(cb->nf != 4) 
				error(Ebadctl); 
2002/0404    
		ct = lookupcmd(cb, ctlmsg, nelem(ctlmsg)); 
		switch(ct->index) { 
		case CMpart: 
2002/0330    
			if(unit->sectors == 0 && !sdinitpart(unit)) 
				error(Eio); 
			start = strtoul(cb->f[2], 0, 0); 
			end = strtoul(cb->f[3], 0, 0); 
			sdaddpart(unit, cb->f[1], start, end); 
		} 
		else if(strcmp(cb->f[0], "delpart") == 0){ 
			if(cb->nf != 2 || unit->part == nil) 
				error(Ebadctl); 
2002/0404    
			break; 
		case CMdelpart: 
2002/0330    
			sddelpart(unit, cb->f[1]); 
		} 
		else if(unit->dev->ifc->wctl) 
2002/0404    
			break; 
		case CMwildcard: 
			if(unit->dev->ifc->wctl == nil) 
				error(Ebadctl); 
2002/0330    
			unit->dev->ifc->wctl(unit, cb); 
		else 
			error(Ebadctl); 
2002/0404    
			break; 
		} 
		poperror(); 
2002/0330    
		qunlock(&unit->ctl); 
		decref(&sdev->r); 
		poperror(); 
		free(cb); 
		break; 
 
2002/0330/sys/src/9/port/devwpsd.c:1448,14542002/0404/sys/src/9/port/devwpsd.c:1462,1468
2002/0330    
	return unconfigure(spec); 
} 
 
Dev sddevtab = { 
2002/0404    
Dev wpwpsddevtab = { 
2002/0330    
	'S', 
	"sd", 
 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)