there is some extra noise in this diff due to the fact that i've got a different dst scheme than you do at this point and i changed the tracing in devsd. the imporant changes are in otherinit() and add9loadparts(). it looks to be 20 lines of code for add9loadparts. the cavet is that i have not tried this when using the disk nvr is on for a fs. also, this points out that we should be able to specify partitions in config strings. cPm0cache.fPm0fworm. Reference: /n/sources/patch/sorry/fs-nvrpart Date: Wed Mar 28 16:07:02 CES 2007 Signed-off-by: quanstro@quanstro.net --- /sys/src/fs/port/devsd.c Wed Mar 28 16:00:48 2007 +++ /sys/src/fs/port/devsd.c Wed Mar 28 16:00:43 2007 @@ -10,7 +10,8 @@ #include "compat.h" #undef error -#define parttrace 0 +#define parttrace(...) //print(__VA_ARGS__) +#define partaddtrace(...) print(__VA_ARGS__) extern SDifc sdataifc, sdmv50xxifc; @@ -34,14 +35,16 @@ Rawstatus, }; +// didn't want to confuse the diff. +static int _sdinit(void); + void sdaddpart(SDunit* unit, char* name, Devsize start, Devsize end) { SDpart *pp; int i, partno; - if(parttrace) - print("add %d %s %s %lld %lld\n", unit->npart, unit->name, + partaddtrace("add %d %s %s %lld %lld\n", unit->npart, unit->name, name, start, end); /* * Check name not already used @@ -58,16 +61,14 @@ } if(strcmp(name, pp->name) == 0){ if(pp->start == start && pp->end == end){ - if(parttrace) - print("already present\n"); + parttrace("already present\n"); return; } } } }else{ if((unit->part = malloc(sizeof(SDpart)*SDnpart)) == nil){ - if(parttrace) - print("malloc failed\n"); + parttrace("malloc failed\n"); return; } partno = 0; @@ -97,8 +98,7 @@ int i; SDpart *pp; - if(parttrace) - print("del %d %s %s\n", unit->npart, unit->name, name); + parttrace("del %d %s %s\n", unit->npart, unit->name, name); /* * Look for the partition to delete. * Can't delete if someone still has it open. @@ -122,6 +122,26 @@ } } +static void +add9loadparts(SDunit *unit) +{ + char *s, *v[16], *w[3], buf[80]; + int i, n; + + snprint(buf, sizeof buf, "%spart", unit->name); + if((s = getconf(buf)) == 0) + return; + + strncpy(buf, s, sizeof buf-2); + buf[sizeof buf-1] = 0; + n = getfields(buf, v, nelem(v), 0, "/"); + for(i = 0; ipart = nil; } + parttrace("sdinitpart\n"); if(unit->inquiry[0] & 0xC0) return 0; switch(unit->inquiry[0] & 0x1F){ @@ -141,12 +162,17 @@ case 0x07: /* MO */ break; default: + parttrace("unknown device type: %x\n", unit->inquiry[0] & 0x1F); return 0; } - if(unit->dev->ifc->online == nil || unit->dev->ifc->online(unit) == 0) + if(unit->dev->ifc->online == nil || unit->dev->ifc->online(unit) == 0){ + parttrace("offline\n"); return 0; + } + parttrace("calling sdaddpart\n"); sdaddpart(unit, "data", 0, unit->sectors); + add9loadparts(unit); return 1; } @@ -156,6 +182,13 @@ int index; SDunit *unit; + parttrace("sdgetunit(%s, %d)\n", sdev->ifc->name, subno); + if(sdlist == nil) + _sdinit(); + if(subno >= sdnunit){ + parttrace("sdgetunit: partition out-of-range %d >= %d\n", subno, sdnunit); + return nil; + } /* * Associate a unit with a given device and sub-unit * number on that device. @@ -187,11 +220,13 @@ if(unit->dev->ifc->verify(unit) == 0){ qunlock(&sdqlock); free(unit); + parttrace("sdgetunit() -> nil\n"); return nil; } sdunit[index] = unit; } qunlock(&sdqlock); + parttrace("sdgetunit() -> %s\n", unit->name); return unit; } @@ -240,8 +275,10 @@ * of units attached and marking each device with an index * into the linear top-level directory array of units. */ + parttrace("_sdinit()\n"); tail = nil; for(i = 0; sdifc[i] != nil; i++){ + parttrace("probe %s\n", sdifc[i]->name); if((sdev = sdifc[i]->pnp()) == nil) continue; if(sdlist != nil) @@ -249,9 +286,11 @@ else sdlist = sdev; for(tail = sdev; tail->next != nil; tail = tail->next){ + parttrace("\t" "[%2d.%2d]", sdnunit, sdnunit+tail->nunit-1); tail->index = sdnunit; sdnunit += tail->nunit; } + parttrace("\t" "[%2d.%2d]\n", sdnunit, sdnunit+tail->nunit-1); tail->index = sdnunit; sdnunit += tail->nunit; } @@ -345,19 +384,15 @@ { int i; - if(parttrace) - print("findpart %d %s %s\t\n", unit->npart, unit->name, name); + parttrace("findpart %d %s %s\t\n", unit->npart, unit->name, name); for(i=0; inpart; i++) { - if(parttrace) - print("%s...", unit->part[i].name); + parttrace("%s...", unit->part[i].name); if(strcmp(unit->part[i].name, name) == 0){ - if(parttrace) - print("\n"); + parttrace("\n"); return &unit->part[i]; } } - if(parttrace) - print("not found\n"); + parttrace("not found\n"); return nil; } --- /sys/src/fs/fs64/9fsfs64.c Wed Mar 28 16:00:58 2007 +++ /sys/src/fs/fs64/9fsfs64.c Wed Mar 28 16:00:56 2007 @@ -41,14 +41,15 @@ { "hd", ataread, ataseek, atawrite, setatapart, }, { "md", mvsataread, mvsataseek, mvsatawrite, setmv50part, }, /* { "sd", scsiread, scsiseek, scsiwrite, setscsipart, }, */ - { 0, }, }; +char *bootpart; + void otherinit(void) { int dev, i, nfd, nhd, s; - char *p, *q, buf[sizeof(nvrfile)+8]; + char *p, *q, *part, *v[4], buf[sizeof(nvrfile)+16]; kbdinit(); printcpufreq(); @@ -62,18 +63,26 @@ mvsatainit(); /* harmless to call again */ nfd = floppyinit(); dev = 0; + part = "disk"; if(p = getconf("nvr")){ - strncpy(buf, p, sizeof(buf)-2); - buf[sizeof(buf)-1] = 0; - p = strchr(buf, '!'); - q = strrchr(buf, '!'); - if(p == 0 || q == 0 || strchr(p+1, '!') != q) + strncpy(buf, p, sizeof buf-2); + buf[sizeof buf-1] = 0; + switch(getfields(buf, v, nelem(v), 0, "!")){ + default: panic("malformed nvrfile: %s\n", buf); - *p++ = 0; - *q++ = 0; - dev = strtoul(p, 0, 0); - strcpy(nvrfile, q); - p = buf; + case 4: + p = v[0]; + dev = strtoul(v[1], 0, 0); + part = v[2]; + strcpy(nvrfile, v[3]); + break; + case 3: + p = v[0]; + dev = strtoul(v[1], 0, 0); + part = "disk"; + strcpy(nvrfile, v[2]); + break; + } } else if(p = getconf("bootfile")){ strncpy(buf, p, sizeof(buf)-2); @@ -95,17 +104,18 @@ else p = "sd"; - for(i = 0; nvrdevs[i].name; i++){ - if(strcmp(p, nvrdevs[i].name) == 0){ - dos.dev = dev; - if (nvrdevs[i].part && - (*nvrdevs[i].part)(dos.dev, "disk") == 0) - break; - dos.read = nvrdevs[i].read; - dos.seek = nvrdevs[i].seek; - dos.write = nvrdevs[i].write; - break; - } + print("p = [%s]; dev=%d; part=[%s]; nvrfile=[%s]\n", p, dev, part, nvrfile); + for(i = 0; i < nelem(nvrdevs); i++){ + if(strcmp(p, nvrdevs[i].name) != 0) + continue; + dos.dev = dev; + if(nvrdevs[i].part && nvrdevs[i].part(dos.dev, part) == 0) + continue; + dos.read = nvrdevs[i].read; + dos.seek = nvrdevs[i].seek; + dos.write = nvrdevs[i].write; + bootpart = p; + break; } if(dos.read == 0) panic("no device (%s) for nvram\n", p); @@ -125,6 +135,15 @@ { int i; +#ifdef dowereallyneedthis + /* forget about partiton set for plan9.nvr */ + for(i = 0; nvrdevs[i].name; i++) + if(strcmp(bootpart, nvrdevs[i].name) == 0){ + if(nvrdevs[i].part) + nvrdevs[i].part(dos.dev, "disk"); + break; + } + #endif settime(rtctime()); boottime = time(); @@ -180,9 +199,6 @@ conf.ripoff = 1; conf.nlgmsg = 1100; /* @8576 bytes, for packets */ conf.nsmmsg = 500; /* @128 bytes */ - - conf.minuteswest = 8*60; - conf.dsttime = 1; } int (*fsprotocol[])(Msgbuf*) = {