diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-12-22 20:49:24 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-12-22 20:49:24 +0100 |
commit | 4a634d21024ee8d24e60d5414ee879cf61ea3275 (patch) | |
tree | d58a337f7d06ad765df2111ace5b20560a05b0b9 | |
parent | 9fe137733670fbd5249f96ed62f0f2f92514d8b6 (diff) |
dossrv: use 64 bit vlong for sectors
-rw-r--r-- | sys/src/cmd/dossrv/dat.h | 24 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/devio.c | 8 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/dosfs.c | 3 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/dossubs.c | 71 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/fns.h | 14 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/iotrack.c | 16 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/iotrack.h | 14 | ||||
-rw-r--r-- | sys/src/cmd/dossrv/xfile.c | 8 |
8 files changed, 82 insertions, 76 deletions
diff --git a/sys/src/cmd/dossrv/dat.h b/sys/src/cmd/dossrv/dat.h index 5823e55bd..0347f0900 100644 --- a/sys/src/cmd/dossrv/dat.h +++ b/sys/src/cmd/dossrv/dat.h @@ -123,18 +123,18 @@ struct Dosbpb{ int nresrv; /* sectors */ int nfats; /* usually 2; modified to 1 if fat mirroring disabled */ int rootsize; /* number of entries, for fat12 and fat16 */ - long volsize; /* in sectors */ + vlong volsize; /* in sectors */ int mediadesc; - long fatsize; /* in sectors */ - int fatclusters; + vlong fatsize; /* in sectors */ + long fatclusters; int fatbits; /* 12, 16, or 32 */ - long fataddr; /* sector number of first valid fat entry */ - long rootaddr; /* for fat16 or fat12, sector of root dir */ + vlong fataddr; /* sector number of first valid fat entry */ + vlong rootaddr; /* for fat16 or fat12, sector of root dir */ + vlong dataaddr; /* initial sector of data clusters */ long rootstart; /* for fat32, cluster of root dir */ - long dataaddr; /* initial sector of data clusters */ long freeptr; /* next free cluster candidate */ long freeclusters; /* count of free clusters, for fat32 */ - int fatinfo; /* fat info sector location; 0 => none */ + vlong fatinfo; /* fat info sector location; 0 => none */ }; enum @@ -178,14 +178,14 @@ enum #define PLONG(p,v) ((p)[0]=(v),(p)[1]=(v)>>8,(p)[2]=(v)>>16,(p)[3]=(v)>>24) struct Dosptr{ - ulong addr; /* sector & entry within of file's directory entry */ + vlong addr; /* sector & entry within of file's directory entry */ + vlong paddr; /* of parent's directory entry */ ulong offset; - ulong paddr; /* of parent's directory entry */ ulong poffset; ulong iclust; /* ordinal within file */ ulong clust; - ulong naddr; /* next block in directory (for writing multi entry elements) */ - ulong prevaddr; + vlong naddr; /* next block in directory (for writing multi entry elements) */ + vlong prevaddr; Iosect *p; Dosdir *d; }; @@ -203,7 +203,7 @@ struct Xfs{ uchar isfat32; /* is a fat 32 file system? */ short dev; short fmt; - long offset; + vlong offset; void *ptr; }; diff --git a/sys/src/cmd/dossrv/devio.c b/sys/src/cmd/dossrv/devio.c index 0ec1681ef..5193bdafd 100644 --- a/sys/src/cmd/dossrv/devio.c +++ b/sys/src/cmd/dossrv/devio.c @@ -21,20 +21,20 @@ deverror(char *name, Xfs *xf, long addr, long n, long nret) } int -devread(Xfs *xf, long addr, void *buf, long n) +devread(Xfs *xf, vlong addr, void *buf, long n) { long nread; if(xf->dev < 0) return -1; - nread = pread(xf->dev, buf, n, xf->offset+(vlong)addr*Sectorsize); + nread = pread(xf->dev, buf, n, xf->offset+addr*Sectorsize); if (nread == n) return 0; return deverror("read", xf, addr, n, nread); } int -devwrite(Xfs *xf, long addr, void *buf, long n) +devwrite(Xfs *xf, vlong addr, void *buf, long n) { long nwrite; @@ -43,7 +43,7 @@ devwrite(Xfs *xf, long addr, void *buf, long n) if(xf->dev < 0) return -1; - nwrite = pwrite(xf->dev, buf, n, xf->offset+(vlong)addr*Sectorsize); + nwrite = pwrite(xf->dev, buf, n, xf->offset+addr*Sectorsize); if (nwrite == n) return 0; return deverror("write", xf, addr, n, nwrite); diff --git a/sys/src/cmd/dossrv/dosfs.c b/sys/src/cmd/dossrv/dosfs.c index 783e66d21..4dd344a9f 100644 --- a/sys/src/cmd/dossrv/dosfs.c +++ b/sys/src/cmd/dossrv/dosfs.c @@ -705,7 +705,8 @@ rwstat(void) Iosect *parp; Dosdir *pard, *d, od; char sname[13]; - ulong oaddr, ooffset, length; + ulong ooffset, length; + vlong oaddr; long start; int i, longtype, changes, attr; diff --git a/sys/src/cmd/dossrv/dossubs.c b/sys/src/cmd/dossrv/dossubs.c index a48f735fb..bd172a28b 100644 --- a/sys/src/cmd/dossrv/dossubs.c +++ b/sys/src/cmd/dossrv/dossubs.c @@ -168,11 +168,11 @@ dosfs(Xfs *xf) else bp->fatbits = 16; - chat("fatbits=%d (%d clusters)...", bp->fatbits, bp->fatclusters); + chat("fatbits=%d (%ld clusters)...", bp->fatbits, bp->fatclusters); for(i=0; i<b->nfats; i++) - chat("fat %d: %ld...", i, bp->fataddr+i*bp->fatsize); - chat("root: %ld...", bp->rootaddr); - chat("data: %ld...", bp->dataaddr); + chat("fat %d: %lld...", i, bp->fataddr+i*bp->fatsize); + chat("root: %lld...", bp->rootaddr); + chat("data: %lld...", bp->dataaddr); putsect(p); return 0; } @@ -193,7 +193,7 @@ rootfile(Xfile *f) } int -isroot(ulong addr) +isroot(vlong addr) { return addr == 0; } @@ -217,7 +217,7 @@ getfile(Xfile *f) dp->d = nil; if(!isroot(dp->addr)){ if(f->qid.path != QIDPATH(dp)){ - chat("qid mismatch f=%#llux d=%#lux...", f->qid.path, QIDPATH(dp)); + chat("qid mismatch f=%#llux d=%#llux...", f->qid.path, QIDPATH(dp)); putsect(p); errno = Enonexist; return -1; @@ -351,7 +351,7 @@ fileclust(Xfile *f, long iclust, int cflag) /* * return the disk sector for the isect disk sector in f */ -long +vlong fileaddr(Xfile *f, long isect, int cflag) { Dosbpb *bp; @@ -516,7 +516,8 @@ searchdir(Xfile *f, char *name, Dosptr *dp, int cflag, int longtype) Dosbpb *bp; Dosdir *d; char buf[261], *bname; - int isect, addr, o, addr1, addr2, prevaddr, prevaddr1, o1, islong, have, need, sum; + int isect, o, o1, islong, have, need, sum; + vlong addr, addr1, addr2, prevaddr, prevaddr1; xf = f->xf; bp = xf->ptr; @@ -642,7 +643,8 @@ emptydir(Xfile *f) { Xfs *xf = f->xf; Dosbpb *bp = xf->ptr; - int isect, addr, o; + int isect, o; + vlong addr; Iosect *p; Dosdir *d; @@ -679,7 +681,8 @@ readdir(Xfile *f, void *vbuf, vlong offset, long count) Xfs *xf; Dosbpb *bp; Dir dir; - int isect, addr, o, islong, sum; + int isect, o, islong, sum; + vlong addr; Iosect *p; Dosdir *d; long rcnt, n; @@ -765,7 +768,8 @@ walkup(Xfile *f, Dosptr *ndp) Dosptr *dp; Dosdir *xd; Iosect *p; - long k, o, so, start, pstart, ppstart, st, ppclust; + long o, so, start, pstart, ppstart, st, ppclust; + vlong k; bp = f->xf->ptr; dp = f->ptr; @@ -775,7 +779,7 @@ walkup(Xfile *f, Dosptr *ndp) ndp->addr = dp->paddr; ndp->offset = dp->poffset; - chat("walkup: paddr=%#lx...", dp->paddr); + chat("walkup: paddr=%#llx...", dp->paddr); /* * root's paddr is always itself @@ -861,7 +865,7 @@ walkup(Xfile *f, Dosptr *ndp) k = ppclust ? clust2sect(bp, ppclust) : bp->rootaddr; p = getsect(f->xf, k); if(p == nil){ - chat("getsect %ld failed\n", k); + chat("getsect %lld failed\n", k); goto error; } xd = (Dosdir *)p->iobuf; @@ -904,7 +908,7 @@ walkup(Xfile *f, Dosptr *ndp) putsect(p); p = getsect(f->xf, k); if(p == 0){ - chat("getsect %ld failed\n", k); + chat("getsect %lld failed\n", k); goto error; } } @@ -927,7 +931,8 @@ readfile(Xfile *f, void *vbuf, vlong offset, long count) Dosbpb *bp = xf->ptr; Dosptr *dp = f->ptr; Dosdir *d = dp->d; - int isect, addr, o, c; + int isect, o, c; + vlong addr; Iosect *p; uchar *buf; ulong length, rcnt; @@ -972,7 +977,8 @@ writefile(Xfile *f, void *vbuf, vlong offset, long count) Dosbpb *bp = xf->ptr; Dosptr *dp = f->ptr; Dosdir *d = dp->d; - int isect, addr, o, c; + int isect, o, c; + vlong addr; Iosect *p; uchar *buf; ulong length, rcnt, dlen; @@ -1018,7 +1024,7 @@ writefile(Xfile *f, void *vbuf, vlong offset, long count) else if(dp->addr && dp->clust){ c = bp->clustsize*bp->sectsize; if(dp->iclust > (dlen+c-1)/c) - length = c*dp->iclust; + length = (ulong)c*dp->iclust; } if(length > dlen) PLONG(d->length, length); @@ -1085,7 +1091,7 @@ putdir(Dosdir *d, Dir *dp) * creation and access dates */ void -getdir(Xfs *xfs, Dir *dp, Dosdir *d, int addr, int offset) +getdir(Xfs *xfs, Dir *dp, Dosdir *d, vlong addr, int offset) { if(d == nil || addr == 0) panic("getdir on root"); @@ -1352,12 +1358,13 @@ putlongname(Xfs *xf, Dosptr *ndp, char *name, char sname[13]) } long -getfat(Xfs *xf, int n) +getfat(Xfs *xf, long n) { Dosbpb *bp = xf->ptr; Iosect *p; - ulong k, sect; - int o, fb; + ulong k, o; + vlong sect; + int fb; if(n < FATRESRV || n >= bp->fatclusters) return -1; @@ -1393,7 +1400,7 @@ getfat(Xfs *xf, int n) k &= 0xfff; } if(chatty > 1) - chat("fat(%#x)=%#lx...", n, k); + chat("fat(%#lx)=%#lux...", n, k); /* * This is a very strange check for out of range. @@ -1401,7 +1408,7 @@ getfat(Xfs *xf, int n) * FFF8 through FFFF all signify ``end of cluster chain.'' * This generalizes to other-sized FATs. */ - if(k >= (1 << fb) - 8) + if(k >= (1UL << fb) - 8) return -1; return k; @@ -1413,7 +1420,8 @@ putfat(Xfs *xf, int n, ulong val) Fatinfo *fi; Dosbpb *bp; Iosect *p; - ulong k, sect, esect; + ulong k; + vlong sect, esect; int o; bp = xf->ptr; @@ -1543,7 +1551,8 @@ makecontig(Xfile *f, int nextra) Xfs *xf; Iosect *wp, *rp; long clust, next, last, start, rclust, wclust, eclust, ostart; - int isok, i, n, nclust, nrun, rs, ws; + int isok, i, n, nclust, nrun; + vlong rs, ws; xf = f->xf; bp = xf->ptr; @@ -1707,20 +1716,16 @@ ffree(Xfs *xf, long start) putfat(xf, start, 0); } -long +vlong clust2sect(Dosbpb *bp, long clust) { - return bp->dataaddr + (clust - FATRESRV) * bp->clustsize; + return bp->dataaddr + ((vlong)(clust - FATRESRV) * bp->clustsize); } long -sect2clust(Dosbpb *bp, long sect) +sect2clust(Dosbpb *bp, vlong sect) { - long c; - - c = (sect - bp->dataaddr) / bp->clustsize + FATRESRV; - assert(sect == clust2sect(bp, c)); - return c; + return ((sect - bp->dataaddr) / bp->clustsize) + FATRESRV; } void diff --git a/sys/src/cmd/dossrv/fns.h b/sys/src/cmd/dossrv/fns.h index 277899e17..42a76f06f 100644 --- a/sys/src/cmd/dossrv/fns.h +++ b/sys/src/cmd/dossrv/fns.h @@ -8,18 +8,18 @@ void chat(char*, ...); int cistrcmp(char*, char*); int classifyname(char*); Xfile *clean(Xfile*); -long clust2sect(Dosbpb*, long); +vlong clust2sect(Dosbpb*, long); void dirdump(void*); int dosfs(Xfs*); -void dosptrreloc(Xfile *f, Dosptr *dp, ulong addr, ulong offset); +void dosptrreloc(Xfile *f, Dosptr *dp, vlong addr, ulong offset); int emptydir(Xfile*); int eqqid(Qid, Qid); int falloc(Xfs*); void ffree(Xfs *xf, long start); -long fileaddr(Xfile*, long, int); +vlong fileaddr(Xfile*, long, int); void fixname(char*); -void getdir(Xfs*, Dir*, Dosdir*, int, int); -long getfat(Xfs*, int); +void getdir(Xfs*, Dir*, Dosdir*, vlong, int); +long getfat(Xfs*, long); int getfile(Xfile*); void getname(char*, Dosdir*); char *getnamesect(char*, char*, uchar*, int*, int*, int); @@ -28,7 +28,7 @@ Xfs *getxfs(char*, char*); long gtime(Dosdir *d); void io(int srvfd); int iscontig(Xfs *xf, Dosdir *d); -int isroot(ulong addr); +int isroot(vlong addr); int makecontig(Xfile*, int); void mkalias(char*, char*, int); int nameok(char*); @@ -60,7 +60,7 @@ void rwrite(void); void rwstat(void); void rversion(void); int searchdir(Xfile*, char*, Dosptr*, int, int); -long sect2clust(Dosbpb*, long); +long sect2clust(Dosbpb*, vlong); int truncfile(Xfile*, vlong length); int utftorunes(Rune*, char*, int); int walkup(Xfile*, Dosptr*); diff --git a/sys/src/cmd/dossrv/iotrack.c b/sys/src/cmd/dossrv/iotrack.c index 2815fa8c7..a6d522e3c 100644 --- a/sys/src/cmd/dossrv/iotrack.c +++ b/sys/src/cmd/dossrv/iotrack.c @@ -20,22 +20,22 @@ static Iotrack iobuf[NIOBUF]; /* the real ones */ #define TOFRONT(h, p) ((h)->next != (p) && (UNLINK(p, next, prev), LINK(h,p, next, prev))) Iosect * -getsect(Xfs *xf, long addr) +getsect(Xfs *xf, vlong addr) { return getiosect(xf, addr, 1); } Iosect * -getosect(Xfs *xf, long addr) +getosect(Xfs *xf, vlong addr) { return getiosect(xf, addr, 0); } Iosect * -getiosect(Xfs *xf, long addr, int rflag) +getiosect(Xfs *xf, vlong addr, int rflag) { Iotrack *t; - long taddr; + vlong taddr; int toff; Iosect *p; @@ -86,7 +86,7 @@ putsect(Iosect *p) } Iotrack * -getiotrack(Xfs *xf, long addr) +getiotrack(Xfs *xf, vlong addr) { Iotrack *hp, *p; Iotrack *mp = &hiob[HIOB]; @@ -94,7 +94,7 @@ getiotrack(Xfs *xf, long addr) /* * chat("iotrack %d,%d...", dev, addr); */ - h = (xf->dev<<24) ^ addr; + h = (xf->dev<<24) ^ (long)addr; if(h < 0) h = ~h; h %= HIOB; @@ -180,7 +180,7 @@ twrite(Iotrack *t) { int i, ref; - chat("[twrite %ld...", t->addr); + chat("[twrite %lld...", t->addr); if(t->flags & BSTALE){ for(ref=0,i=0; i<Sect2trk; i++) if(t->tp->p[i]) @@ -210,7 +210,7 @@ tread(Iotrack *t) for(i=0; i<Sect2trk; i++) if(t->tp->p[i]) ++ref; - chat("[tread %ld+%ld...", t->addr, t->xf->offset); + chat("[tread %lld+%lld...", t->addr, t->xf->offset); if(ref == 0){ if(devread(t->xf, t->addr, t->tp->buf, Trksize) < 0){ chat("error]"); diff --git a/sys/src/cmd/dossrv/iotrack.h b/sys/src/cmd/dossrv/iotrack.h index 39b39c306..921a75c3f 100644 --- a/sys/src/cmd/dossrv/iotrack.h +++ b/sys/src/cmd/dossrv/iotrack.h @@ -22,7 +22,7 @@ struct Iotrack { short flags; Xfs * xf; - long addr; + vlong addr; Iotrack *next; /* in lru list */ Iotrack *prev; Iotrack *hnext; /* in hash list */ @@ -48,15 +48,15 @@ struct Track #define BIMM (1<<1) #define BSTALE (1<<2) -Iosect* getiosect(Xfs*, long, int); -Iosect* getosect(Xfs*, long); -Iosect* getsect(Xfs*, long); +Iosect* getiosect(Xfs*, vlong, int); +Iosect* getosect(Xfs*, vlong); +Iosect* getsect(Xfs*, vlong); Iosect* newsect(void); -Iotrack* getiotrack(Xfs*, long); +Iotrack* getiotrack(Xfs*, vlong); int canmlock(MLock*); int devcheck(Xfs*); -int devread(Xfs*, long, void*, long); -int devwrite(Xfs*, long, void*, long); +int devread(Xfs*, vlong, void*, long); +int devwrite(Xfs*, vlong, void*, long); int tread(Iotrack*); int twrite(Iotrack*); void freesect(Iosect*); diff --git a/sys/src/cmd/dossrv/xfile.c b/sys/src/cmd/dossrv/xfile.c index 87954ebba..f734a7857 100644 --- a/sys/src/cmd/dossrv/xfile.c +++ b/sys/src/cmd/dossrv/xfile.c @@ -17,7 +17,7 @@ getxfs(char *user, char *name) Dir *dir; Qid dqid; char *p, *q; - long offset; + vlong offset; int fd, omode; USED(user); @@ -38,8 +38,8 @@ getxfs(char *user, char *name) offset = 0; if(p = strrchr(name, ':')){ *p++ = 0; - offset = strtol(p, &q, 0); - chat("name %s, offset %ld\n", p, offset); + offset = strtoll(p, &q, 0); + chat("name %s, offset %lld\n", p, offset); if(offset < 0 || p == q){ errno = Enofilsys; return 0; @@ -225,7 +225,7 @@ clean(Xfile *f) * relocate the dos entries of all fids in the same file */ void -dosptrreloc(Xfile *f, Dosptr *dp, ulong addr, ulong offset) +dosptrreloc(Xfile *f, Dosptr *dp, vlong addr, ulong offset) { int i; Xfile *p; |