From e28345d703c7fb80b9c440c147f60886efd3a135 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 9 Aug 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-08-09 --- alphapc/sd.h | 3 ++- pc/vgas3.c | 4 ++-- port/devsd.c | 31 ++++++++++++++++++++++--------- port/sd.h | 3 ++- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/alphapc/sd.h b/alphapc/sd.h index e0eb1675b358b3204ef6c860031d560b9ef1c96c..469c9a4e99c657acafa3d9791cc8c54b923c95b1 100644 --- a/alphapc/sd.h +++ b/alphapc/sd.h @@ -32,7 +32,8 @@ typedef struct SDunit { QLock ctl; ulong sectors; ulong secsize; - SDpart* part; /* nil or array of size SDnpart */ + SDpart* part; /* nil or array of size npart */ + int npart; ulong vers; SDperm ctlperm; diff --git a/pc/vgas3.c b/pc/vgas3.c index bc214dd069dd007a64bcf3d2943538549f28facd..624a42d18b55e506559169e10905f048dfe7973a 100644 --- a/pc/vgas3.c +++ b/pc/vgas3.c @@ -193,7 +193,7 @@ s3load(VGAscr* scr, Cursor* curs) opage = 0; p = KADDR(scr->aperture); - id = (vgaxi(Crtx, 0x30)<<8)|vgaxi(Crtx, 0x2E); + id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E); switch(id){ case 0x5631: /* ViRGE */ @@ -531,7 +531,7 @@ s3drawinit(VGAscr *scr) { ulong id; - id = (vgaxi(Crtx, 0x30)<<8)|vgaxi(Crtx, 0x2E); + id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E); scr->id = id; /* diff --git a/port/devsd.c b/port/devsd.c index 66e3b544206cee309bf2102d8761a1f7b49da7d4..d7a92a386cde0cb1bd25a12d115efb529e8f7ee1 100644 --- a/port/devsd.c +++ b/port/devsd.c @@ -55,7 +55,7 @@ sdaddpart(SDunit* unit, char* name, ulong start, ulong end) */ if(unit->part != nil){ partno = -1; - for(i = 0; i < SDnpart; i++){ + for(i = 0; i < unit->npart; i++){ pp = &unit->part[i]; if(!pp->valid){ if(partno == -1) @@ -72,14 +72,27 @@ sdaddpart(SDunit* unit, char* name, ulong start, ulong end) else{ if((unit->part = malloc(sizeof(SDpart)*SDnpart)) == nil) error(Enomem); + unit->npart = SDnpart; partno = 0; } /* - * Check there is a free slot and size and extent are valid. + * If no free slot found then increase the + * array size (can't get here with unit->part == nil). + */ + if(partno == -1){ + if((pp = malloc(sizeof(SDpart)*(unit->npart+SDnpart))) == nil) + error(Enomem); + memmove(pp, unit->part, sizeof(SDpart)*unit->npart); + free(unit->part); + unit->part = pp; + partno = unit->npart; + unit->npart += SDnpart; + } + + /* + * Check size and extent are valid. */ - if(partno == -1) - error(Ebadctl); if(start > end || end > unit->sectors) error(Eio); pp = &unit->part[partno]; @@ -102,12 +115,12 @@ sddelpart(SDunit* unit, char* name) * Can't delete if someone still has it open. */ pp = unit->part; - for(i = 0; i < SDnpart; i++){ + for(i = 0; i < unit->npart; i++){ if(strncmp(name, pp->name, NAMELEN) == 0) break; pp++; } - if(i >= SDnpart) + if(i >= unit->npart) error(Ebadctl); if(strncmp(up->user, pp->user, NAMELEN) && !iseve()) error(Eperm); @@ -125,7 +138,7 @@ sdinitpart(SDunit* unit) unit->vers++; unit->sectors = unit->secsize = 0; if(unit->part){ - for(i = 0; i < SDnpart; i++){ + for(i = 0; i < unit->npart; i++){ unit->part[i].valid = 0; unit->part[i].vers++; } @@ -420,7 +433,7 @@ sdgen(Chan* c, Dirtab*, int, int s, Dir* dp) return r; } i -= Qpart; - if(unit->part == nil || i >= SDnpart){ + if(unit->part == nil || i >= unit->npart){ qunlock(&unit->ctl); break; } @@ -749,7 +762,7 @@ sdread(Chan *c, void *a, long n, vlong off) "geometry %ld %ld\n", unit->sectors, unit->secsize); pp = unit->part; - for(i = 0; i < SDnpart; i++){ + for(i = 0; i < unit->npart; i++){ if(pp->valid) l += snprint(p+l, READSTR-l, "part %.*s %lud %lud\n", diff --git a/port/sd.h b/port/sd.h index e0eb1675b358b3204ef6c860031d560b9ef1c96c..469c9a4e99c657acafa3d9791cc8c54b923c95b1 100644 --- a/port/sd.h +++ b/port/sd.h @@ -32,7 +32,8 @@ typedef struct SDunit { QLock ctl; ulong sectors; ulong secsize; - SDpart* part; /* nil or array of size SDnpart */ + SDpart* part; /* nil or array of size npart */ + int npart; ulong vers; SDperm ctlperm;