correctly recognize partitions on devices bigger than 2tb. reading above 2tb not yet addressed. Reference: /n/sources/patch/applied/9loadbigpart Date: Fri Jan 18 20:31:32 CET 2008 Signed-off-by: quanstro@quanstro.net --- /sys/src/boot/pc/part.c Fri Jan 18 20:28:44 2008 +++ /sys/src/boot/pc/part.c Fri Jan 18 20:28:42 2008 @@ -89,8 +89,8 @@ for(i = 1; i < n && unit->npart < SDnpart; i++){ if(getfields(line[i], field, 3, ' ') != 3) break; - start = strtoul(field[1], 0, 0); - end = strtoul(field[2], 0, 0); + start = strtoull(field[1], 0, 0); + end = strtoull(field[2], 0, 0); if(start >= end || end > unit->sectors) break; sdaddpart(unit, field[0], start, end); @@ -103,7 +103,7 @@ { SDpart *p; char *field[4], *line[Npart+1]; - ulong start, end; + uvlong start, end; int i, n; p = sdfindpart(unit, name); @@ -125,8 +125,8 @@ break; if(getfields(line[i], field, 4, ' ') != 4) break; - start = strtoul(field[2], 0, 0); - end = strtoul(field[3], 0, 0); + start = strtoull(field[2], 0, 0); + end = strtoull(field[3], 0, 0); if(start >= end || end > unit->sectors) break; sdaddpart(unit, field[1], p->start+start, p->start+end); --- /sys/src/boot/pc/devsd.c Fri Jan 18 20:28:52 2008 +++ /sys/src/boot/pc/devsd.c Fri Jan 18 20:28:50 2008 @@ -32,13 +32,13 @@ }; void -sdaddpart(SDunit* unit, char* name, ulong start, ulong end) +sdaddpart(SDunit* unit, char* name, uvlong start, uvlong end) { SDpart *pp; int i, partno; if(parttrace) - print("add %d %s %s %ld %ld\n", unit->npart, unit->name, name, start, end); + print("add %d %s %s %lld %lld\n", unit->npart, unit->name, name, start, end); /* * Check name not already used * and look for a free slot. @@ -73,7 +73,7 @@ * Check there is a free slot and size and extent are valid. */ if(partno == -1 || start > end || end > unit->sectors){ - print("cannot add %s!%s [%lud,%lud) to disk [0,%lud): %s\n", + print("cannot add %s!%s [%llud,%llud) to disk [0,%llud): %s\n", unit->name, name, start, end, unit->sectors, partno==-1 ? "no free partitions" : "partition boundaries out of range"); return; --- /sys/src/boot/pc/sd.h Fri Jan 18 20:29:01 2008 +++ /sys/src/boot/pc/sd.h Fri Jan 18 20:29:00 2008 @@ -8,8 +8,8 @@ typedef struct SDunit SDunit; typedef struct SDpart { - ulong start; - ulong end; + uvlong start; + uvlong end; char name[NAMELEN]; char user[NAMELEN]; ulong perm; @@ -25,7 +25,7 @@ // Rendez rendez; // QLock ctl; - ulong sectors; + uvlong sectors; ulong secsize; SDpart* part; int npart; /* of valid partitions */ @@ -122,5 +122,5 @@ extern long sdbio(SDunit *unit, SDpart *pp, void *a, long len, vlong off); void partition(SDunit*); SDpart* sdfindpart(SDunit*, char*); -void sdaddpart(SDunit*, char*, ulong, ulong); +void sdaddpart(SDunit*, char*, uvlong, uvlong); void* sdmalloc(void*, ulong); --- /sys/src/boot/pc/lib.h Fri Jan 18 20:29:11 2008 +++ /sys/src/boot/pc/lib.h Fri Jan 18 20:29:10 2008 @@ -1,5 +1,3 @@ -#define offsetof(s, m) (ulong)(&(((s*)0)->m)) - /* * functions (possibly) linked in, complete, from libc. */ @@ -7,17 +5,17 @@ /* * mem routines */ -extern void* memccpy(void*, void*, int, ulong); -extern void* memset(void*, int, ulong); -extern int memcmp(void*, void*, ulong); -extern void* memmove(void*, void*, ulong); -extern void* memchr(void*, int, ulong); +extern void* memccpy(void*, void*, int, long); +extern void* memset(void*, int, long); +extern int memcmp(void*, void*, long); +extern void* memmove(void*, void*, long); +extern void* memchr(void*, int, long); /* * string routines */ extern char* strcat(char*, char*); -extern char* strchr(char*, int); +extern char* strchr(char*, char); extern int strcmp(char*, char*); extern char* strcpy(char*, char*); extern char* strncat(char*, char*, long); @@ -99,6 +97,7 @@ extern uintptr getcallerpc(void*); extern long strtol(char*, char**, int); extern ulong strtoul(char*, char**, int); +extern uvlong strtoull(char*, char**, int); extern long end; #define NAMELEN 28