dossrv: use 64 bit vlong for sectors
This commit is contained in:
parent
9fe1377336
commit
4a634d2102
8 changed files with 82 additions and 76 deletions
|
@ -123,18 +123,18 @@ struct Dosbpb{
|
||||||
int nresrv; /* sectors */
|
int nresrv; /* sectors */
|
||||||
int nfats; /* usually 2; modified to 1 if fat mirroring disabled */
|
int nfats; /* usually 2; modified to 1 if fat mirroring disabled */
|
||||||
int rootsize; /* number of entries, for fat12 and fat16 */
|
int rootsize; /* number of entries, for fat12 and fat16 */
|
||||||
long volsize; /* in sectors */
|
vlong volsize; /* in sectors */
|
||||||
int mediadesc;
|
int mediadesc;
|
||||||
long fatsize; /* in sectors */
|
vlong fatsize; /* in sectors */
|
||||||
int fatclusters;
|
long fatclusters;
|
||||||
int fatbits; /* 12, 16, or 32 */
|
int fatbits; /* 12, 16, or 32 */
|
||||||
long fataddr; /* sector number of first valid fat entry */
|
vlong fataddr; /* sector number of first valid fat entry */
|
||||||
long rootaddr; /* for fat16 or fat12, sector of root dir */
|
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 rootstart; /* for fat32, cluster of root dir */
|
||||||
long dataaddr; /* initial sector of data clusters */
|
|
||||||
long freeptr; /* next free cluster candidate */
|
long freeptr; /* next free cluster candidate */
|
||||||
long freeclusters; /* count of free clusters, for fat32 */
|
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
|
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)
|
#define PLONG(p,v) ((p)[0]=(v),(p)[1]=(v)>>8,(p)[2]=(v)>>16,(p)[3]=(v)>>24)
|
||||||
|
|
||||||
struct Dosptr{
|
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 offset;
|
||||||
ulong paddr; /* of parent's directory entry */
|
|
||||||
ulong poffset;
|
ulong poffset;
|
||||||
ulong iclust; /* ordinal within file */
|
ulong iclust; /* ordinal within file */
|
||||||
ulong clust;
|
ulong clust;
|
||||||
ulong naddr; /* next block in directory (for writing multi entry elements) */
|
vlong naddr; /* next block in directory (for writing multi entry elements) */
|
||||||
ulong prevaddr;
|
vlong prevaddr;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
Dosdir *d;
|
Dosdir *d;
|
||||||
};
|
};
|
||||||
|
@ -203,7 +203,7 @@ struct Xfs{
|
||||||
uchar isfat32; /* is a fat 32 file system? */
|
uchar isfat32; /* is a fat 32 file system? */
|
||||||
short dev;
|
short dev;
|
||||||
short fmt;
|
short fmt;
|
||||||
long offset;
|
vlong offset;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,20 +21,20 @@ deverror(char *name, Xfs *xf, long addr, long n, long nret)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
devread(Xfs *xf, long addr, void *buf, long n)
|
devread(Xfs *xf, vlong addr, void *buf, long n)
|
||||||
{
|
{
|
||||||
long nread;
|
long nread;
|
||||||
|
|
||||||
if(xf->dev < 0)
|
if(xf->dev < 0)
|
||||||
return -1;
|
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)
|
if (nread == n)
|
||||||
return 0;
|
return 0;
|
||||||
return deverror("read", xf, addr, n, nread);
|
return deverror("read", xf, addr, n, nread);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
devwrite(Xfs *xf, long addr, void *buf, long n)
|
devwrite(Xfs *xf, vlong addr, void *buf, long n)
|
||||||
{
|
{
|
||||||
long nwrite;
|
long nwrite;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ devwrite(Xfs *xf, long addr, void *buf, long n)
|
||||||
|
|
||||||
if(xf->dev < 0)
|
if(xf->dev < 0)
|
||||||
return -1;
|
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)
|
if (nwrite == n)
|
||||||
return 0;
|
return 0;
|
||||||
return deverror("write", xf, addr, n, nwrite);
|
return deverror("write", xf, addr, n, nwrite);
|
||||||
|
|
|
@ -705,7 +705,8 @@ rwstat(void)
|
||||||
Iosect *parp;
|
Iosect *parp;
|
||||||
Dosdir *pard, *d, od;
|
Dosdir *pard, *d, od;
|
||||||
char sname[13];
|
char sname[13];
|
||||||
ulong oaddr, ooffset, length;
|
ulong ooffset, length;
|
||||||
|
vlong oaddr;
|
||||||
long start;
|
long start;
|
||||||
int i, longtype, changes, attr;
|
int i, longtype, changes, attr;
|
||||||
|
|
||||||
|
|
|
@ -168,11 +168,11 @@ dosfs(Xfs *xf)
|
||||||
else
|
else
|
||||||
bp->fatbits = 16;
|
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++)
|
for(i=0; i<b->nfats; i++)
|
||||||
chat("fat %d: %ld...", i, bp->fataddr+i*bp->fatsize);
|
chat("fat %d: %lld...", i, bp->fataddr+i*bp->fatsize);
|
||||||
chat("root: %ld...", bp->rootaddr);
|
chat("root: %lld...", bp->rootaddr);
|
||||||
chat("data: %ld...", bp->dataaddr);
|
chat("data: %lld...", bp->dataaddr);
|
||||||
putsect(p);
|
putsect(p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ rootfile(Xfile *f)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
isroot(ulong addr)
|
isroot(vlong addr)
|
||||||
{
|
{
|
||||||
return addr == 0;
|
return addr == 0;
|
||||||
}
|
}
|
||||||
|
@ -217,7 +217,7 @@ getfile(Xfile *f)
|
||||||
dp->d = nil;
|
dp->d = nil;
|
||||||
if(!isroot(dp->addr)){
|
if(!isroot(dp->addr)){
|
||||||
if(f->qid.path != QIDPATH(dp)){
|
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);
|
putsect(p);
|
||||||
errno = Enonexist;
|
errno = Enonexist;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -351,7 +351,7 @@ fileclust(Xfile *f, long iclust, int cflag)
|
||||||
/*
|
/*
|
||||||
* return the disk sector for the isect disk sector in f
|
* return the disk sector for the isect disk sector in f
|
||||||
*/
|
*/
|
||||||
long
|
vlong
|
||||||
fileaddr(Xfile *f, long isect, int cflag)
|
fileaddr(Xfile *f, long isect, int cflag)
|
||||||
{
|
{
|
||||||
Dosbpb *bp;
|
Dosbpb *bp;
|
||||||
|
@ -516,7 +516,8 @@ searchdir(Xfile *f, char *name, Dosptr *dp, int cflag, int longtype)
|
||||||
Dosbpb *bp;
|
Dosbpb *bp;
|
||||||
Dosdir *d;
|
Dosdir *d;
|
||||||
char buf[261], *bname;
|
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;
|
xf = f->xf;
|
||||||
bp = xf->ptr;
|
bp = xf->ptr;
|
||||||
|
@ -642,7 +643,8 @@ emptydir(Xfile *f)
|
||||||
{
|
{
|
||||||
Xfs *xf = f->xf;
|
Xfs *xf = f->xf;
|
||||||
Dosbpb *bp = xf->ptr;
|
Dosbpb *bp = xf->ptr;
|
||||||
int isect, addr, o;
|
int isect, o;
|
||||||
|
vlong addr;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
Dosdir *d;
|
Dosdir *d;
|
||||||
|
|
||||||
|
@ -679,7 +681,8 @@ readdir(Xfile *f, void *vbuf, vlong offset, long count)
|
||||||
Xfs *xf;
|
Xfs *xf;
|
||||||
Dosbpb *bp;
|
Dosbpb *bp;
|
||||||
Dir dir;
|
Dir dir;
|
||||||
int isect, addr, o, islong, sum;
|
int isect, o, islong, sum;
|
||||||
|
vlong addr;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
Dosdir *d;
|
Dosdir *d;
|
||||||
long rcnt, n;
|
long rcnt, n;
|
||||||
|
@ -765,7 +768,8 @@ walkup(Xfile *f, Dosptr *ndp)
|
||||||
Dosptr *dp;
|
Dosptr *dp;
|
||||||
Dosdir *xd;
|
Dosdir *xd;
|
||||||
Iosect *p;
|
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;
|
bp = f->xf->ptr;
|
||||||
dp = f->ptr;
|
dp = f->ptr;
|
||||||
|
@ -775,7 +779,7 @@ walkup(Xfile *f, Dosptr *ndp)
|
||||||
ndp->addr = dp->paddr;
|
ndp->addr = dp->paddr;
|
||||||
ndp->offset = dp->poffset;
|
ndp->offset = dp->poffset;
|
||||||
|
|
||||||
chat("walkup: paddr=%#lx...", dp->paddr);
|
chat("walkup: paddr=%#llx...", dp->paddr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* root's paddr is always itself
|
* root's paddr is always itself
|
||||||
|
@ -861,7 +865,7 @@ walkup(Xfile *f, Dosptr *ndp)
|
||||||
k = ppclust ? clust2sect(bp, ppclust) : bp->rootaddr;
|
k = ppclust ? clust2sect(bp, ppclust) : bp->rootaddr;
|
||||||
p = getsect(f->xf, k);
|
p = getsect(f->xf, k);
|
||||||
if(p == nil){
|
if(p == nil){
|
||||||
chat("getsect %ld failed\n", k);
|
chat("getsect %lld failed\n", k);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
xd = (Dosdir *)p->iobuf;
|
xd = (Dosdir *)p->iobuf;
|
||||||
|
@ -904,7 +908,7 @@ walkup(Xfile *f, Dosptr *ndp)
|
||||||
putsect(p);
|
putsect(p);
|
||||||
p = getsect(f->xf, k);
|
p = getsect(f->xf, k);
|
||||||
if(p == 0){
|
if(p == 0){
|
||||||
chat("getsect %ld failed\n", k);
|
chat("getsect %lld failed\n", k);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -927,7 +931,8 @@ readfile(Xfile *f, void *vbuf, vlong offset, long count)
|
||||||
Dosbpb *bp = xf->ptr;
|
Dosbpb *bp = xf->ptr;
|
||||||
Dosptr *dp = f->ptr;
|
Dosptr *dp = f->ptr;
|
||||||
Dosdir *d = dp->d;
|
Dosdir *d = dp->d;
|
||||||
int isect, addr, o, c;
|
int isect, o, c;
|
||||||
|
vlong addr;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
uchar *buf;
|
uchar *buf;
|
||||||
ulong length, rcnt;
|
ulong length, rcnt;
|
||||||
|
@ -972,7 +977,8 @@ writefile(Xfile *f, void *vbuf, vlong offset, long count)
|
||||||
Dosbpb *bp = xf->ptr;
|
Dosbpb *bp = xf->ptr;
|
||||||
Dosptr *dp = f->ptr;
|
Dosptr *dp = f->ptr;
|
||||||
Dosdir *d = dp->d;
|
Dosdir *d = dp->d;
|
||||||
int isect, addr, o, c;
|
int isect, o, c;
|
||||||
|
vlong addr;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
uchar *buf;
|
uchar *buf;
|
||||||
ulong length, rcnt, dlen;
|
ulong length, rcnt, dlen;
|
||||||
|
@ -1018,7 +1024,7 @@ writefile(Xfile *f, void *vbuf, vlong offset, long count)
|
||||||
else if(dp->addr && dp->clust){
|
else if(dp->addr && dp->clust){
|
||||||
c = bp->clustsize*bp->sectsize;
|
c = bp->clustsize*bp->sectsize;
|
||||||
if(dp->iclust > (dlen+c-1)/c)
|
if(dp->iclust > (dlen+c-1)/c)
|
||||||
length = c*dp->iclust;
|
length = (ulong)c*dp->iclust;
|
||||||
}
|
}
|
||||||
if(length > dlen)
|
if(length > dlen)
|
||||||
PLONG(d->length, length);
|
PLONG(d->length, length);
|
||||||
|
@ -1085,7 +1091,7 @@ putdir(Dosdir *d, Dir *dp)
|
||||||
* creation and access dates
|
* creation and access dates
|
||||||
*/
|
*/
|
||||||
void
|
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)
|
if(d == nil || addr == 0)
|
||||||
panic("getdir on root");
|
panic("getdir on root");
|
||||||
|
@ -1352,12 +1358,13 @@ putlongname(Xfs *xf, Dosptr *ndp, char *name, char sname[13])
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
getfat(Xfs *xf, int n)
|
getfat(Xfs *xf, long n)
|
||||||
{
|
{
|
||||||
Dosbpb *bp = xf->ptr;
|
Dosbpb *bp = xf->ptr;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
ulong k, sect;
|
ulong k, o;
|
||||||
int o, fb;
|
vlong sect;
|
||||||
|
int fb;
|
||||||
|
|
||||||
if(n < FATRESRV || n >= bp->fatclusters)
|
if(n < FATRESRV || n >= bp->fatclusters)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1393,7 +1400,7 @@ getfat(Xfs *xf, int n)
|
||||||
k &= 0xfff;
|
k &= 0xfff;
|
||||||
}
|
}
|
||||||
if(chatty > 1)
|
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.
|
* 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.''
|
* FFF8 through FFFF all signify ``end of cluster chain.''
|
||||||
* This generalizes to other-sized FATs.
|
* This generalizes to other-sized FATs.
|
||||||
*/
|
*/
|
||||||
if(k >= (1 << fb) - 8)
|
if(k >= (1UL << fb) - 8)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return k;
|
return k;
|
||||||
|
@ -1413,7 +1420,8 @@ putfat(Xfs *xf, int n, ulong val)
|
||||||
Fatinfo *fi;
|
Fatinfo *fi;
|
||||||
Dosbpb *bp;
|
Dosbpb *bp;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
ulong k, sect, esect;
|
ulong k;
|
||||||
|
vlong sect, esect;
|
||||||
int o;
|
int o;
|
||||||
|
|
||||||
bp = xf->ptr;
|
bp = xf->ptr;
|
||||||
|
@ -1543,7 +1551,8 @@ makecontig(Xfile *f, int nextra)
|
||||||
Xfs *xf;
|
Xfs *xf;
|
||||||
Iosect *wp, *rp;
|
Iosect *wp, *rp;
|
||||||
long clust, next, last, start, rclust, wclust, eclust, ostart;
|
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;
|
xf = f->xf;
|
||||||
bp = xf->ptr;
|
bp = xf->ptr;
|
||||||
|
@ -1707,20 +1716,16 @@ ffree(Xfs *xf, long start)
|
||||||
putfat(xf, start, 0);
|
putfat(xf, start, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
vlong
|
||||||
clust2sect(Dosbpb *bp, long clust)
|
clust2sect(Dosbpb *bp, long clust)
|
||||||
{
|
{
|
||||||
return bp->dataaddr + (clust - FATRESRV) * bp->clustsize;
|
return bp->dataaddr + ((vlong)(clust - FATRESRV) * bp->clustsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
sect2clust(Dosbpb *bp, long sect)
|
sect2clust(Dosbpb *bp, vlong sect)
|
||||||
{
|
{
|
||||||
long c;
|
return ((sect - bp->dataaddr) / bp->clustsize) + FATRESRV;
|
||||||
|
|
||||||
c = (sect - bp->dataaddr) / bp->clustsize + FATRESRV;
|
|
||||||
assert(sect == clust2sect(bp, c));
|
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -8,18 +8,18 @@ void chat(char*, ...);
|
||||||
int cistrcmp(char*, char*);
|
int cistrcmp(char*, char*);
|
||||||
int classifyname(char*);
|
int classifyname(char*);
|
||||||
Xfile *clean(Xfile*);
|
Xfile *clean(Xfile*);
|
||||||
long clust2sect(Dosbpb*, long);
|
vlong clust2sect(Dosbpb*, long);
|
||||||
void dirdump(void*);
|
void dirdump(void*);
|
||||||
int dosfs(Xfs*);
|
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 emptydir(Xfile*);
|
||||||
int eqqid(Qid, Qid);
|
int eqqid(Qid, Qid);
|
||||||
int falloc(Xfs*);
|
int falloc(Xfs*);
|
||||||
void ffree(Xfs *xf, long start);
|
void ffree(Xfs *xf, long start);
|
||||||
long fileaddr(Xfile*, long, int);
|
vlong fileaddr(Xfile*, long, int);
|
||||||
void fixname(char*);
|
void fixname(char*);
|
||||||
void getdir(Xfs*, Dir*, Dosdir*, int, int);
|
void getdir(Xfs*, Dir*, Dosdir*, vlong, int);
|
||||||
long getfat(Xfs*, int);
|
long getfat(Xfs*, long);
|
||||||
int getfile(Xfile*);
|
int getfile(Xfile*);
|
||||||
void getname(char*, Dosdir*);
|
void getname(char*, Dosdir*);
|
||||||
char *getnamesect(char*, char*, uchar*, int*, int*, int);
|
char *getnamesect(char*, char*, uchar*, int*, int*, int);
|
||||||
|
@ -28,7 +28,7 @@ Xfs *getxfs(char*, char*);
|
||||||
long gtime(Dosdir *d);
|
long gtime(Dosdir *d);
|
||||||
void io(int srvfd);
|
void io(int srvfd);
|
||||||
int iscontig(Xfs *xf, Dosdir *d);
|
int iscontig(Xfs *xf, Dosdir *d);
|
||||||
int isroot(ulong addr);
|
int isroot(vlong addr);
|
||||||
int makecontig(Xfile*, int);
|
int makecontig(Xfile*, int);
|
||||||
void mkalias(char*, char*, int);
|
void mkalias(char*, char*, int);
|
||||||
int nameok(char*);
|
int nameok(char*);
|
||||||
|
@ -60,7 +60,7 @@ void rwrite(void);
|
||||||
void rwstat(void);
|
void rwstat(void);
|
||||||
void rversion(void);
|
void rversion(void);
|
||||||
int searchdir(Xfile*, char*, Dosptr*, int, int);
|
int searchdir(Xfile*, char*, Dosptr*, int, int);
|
||||||
long sect2clust(Dosbpb*, long);
|
long sect2clust(Dosbpb*, vlong);
|
||||||
int truncfile(Xfile*, vlong length);
|
int truncfile(Xfile*, vlong length);
|
||||||
int utftorunes(Rune*, char*, int);
|
int utftorunes(Rune*, char*, int);
|
||||||
int walkup(Xfile*, Dosptr*);
|
int walkup(Xfile*, Dosptr*);
|
||||||
|
|
|
@ -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)))
|
#define TOFRONT(h, p) ((h)->next != (p) && (UNLINK(p, next, prev), LINK(h,p, next, prev)))
|
||||||
|
|
||||||
Iosect *
|
Iosect *
|
||||||
getsect(Xfs *xf, long addr)
|
getsect(Xfs *xf, vlong addr)
|
||||||
{
|
{
|
||||||
return getiosect(xf, addr, 1);
|
return getiosect(xf, addr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Iosect *
|
Iosect *
|
||||||
getosect(Xfs *xf, long addr)
|
getosect(Xfs *xf, vlong addr)
|
||||||
{
|
{
|
||||||
return getiosect(xf, addr, 0);
|
return getiosect(xf, addr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Iosect *
|
Iosect *
|
||||||
getiosect(Xfs *xf, long addr, int rflag)
|
getiosect(Xfs *xf, vlong addr, int rflag)
|
||||||
{
|
{
|
||||||
Iotrack *t;
|
Iotrack *t;
|
||||||
long taddr;
|
vlong taddr;
|
||||||
int toff;
|
int toff;
|
||||||
Iosect *p;
|
Iosect *p;
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ putsect(Iosect *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
Iotrack *
|
Iotrack *
|
||||||
getiotrack(Xfs *xf, long addr)
|
getiotrack(Xfs *xf, vlong addr)
|
||||||
{
|
{
|
||||||
Iotrack *hp, *p;
|
Iotrack *hp, *p;
|
||||||
Iotrack *mp = &hiob[HIOB];
|
Iotrack *mp = &hiob[HIOB];
|
||||||
|
@ -94,7 +94,7 @@ getiotrack(Xfs *xf, long addr)
|
||||||
/*
|
/*
|
||||||
* chat("iotrack %d,%d...", dev, addr);
|
* chat("iotrack %d,%d...", dev, addr);
|
||||||
*/
|
*/
|
||||||
h = (xf->dev<<24) ^ addr;
|
h = (xf->dev<<24) ^ (long)addr;
|
||||||
if(h < 0)
|
if(h < 0)
|
||||||
h = ~h;
|
h = ~h;
|
||||||
h %= HIOB;
|
h %= HIOB;
|
||||||
|
@ -180,7 +180,7 @@ twrite(Iotrack *t)
|
||||||
{
|
{
|
||||||
int i, ref;
|
int i, ref;
|
||||||
|
|
||||||
chat("[twrite %ld...", t->addr);
|
chat("[twrite %lld...", t->addr);
|
||||||
if(t->flags & BSTALE){
|
if(t->flags & BSTALE){
|
||||||
for(ref=0,i=0; i<Sect2trk; i++)
|
for(ref=0,i=0; i<Sect2trk; i++)
|
||||||
if(t->tp->p[i])
|
if(t->tp->p[i])
|
||||||
|
@ -210,7 +210,7 @@ tread(Iotrack *t)
|
||||||
for(i=0; i<Sect2trk; i++)
|
for(i=0; i<Sect2trk; i++)
|
||||||
if(t->tp->p[i])
|
if(t->tp->p[i])
|
||||||
++ref;
|
++ref;
|
||||||
chat("[tread %ld+%ld...", t->addr, t->xf->offset);
|
chat("[tread %lld+%lld...", t->addr, t->xf->offset);
|
||||||
if(ref == 0){
|
if(ref == 0){
|
||||||
if(devread(t->xf, t->addr, t->tp->buf, Trksize) < 0){
|
if(devread(t->xf, t->addr, t->tp->buf, Trksize) < 0){
|
||||||
chat("error]");
|
chat("error]");
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct Iotrack
|
||||||
{
|
{
|
||||||
short flags;
|
short flags;
|
||||||
Xfs * xf;
|
Xfs * xf;
|
||||||
long addr;
|
vlong addr;
|
||||||
Iotrack *next; /* in lru list */
|
Iotrack *next; /* in lru list */
|
||||||
Iotrack *prev;
|
Iotrack *prev;
|
||||||
Iotrack *hnext; /* in hash list */
|
Iotrack *hnext; /* in hash list */
|
||||||
|
@ -48,15 +48,15 @@ struct Track
|
||||||
#define BIMM (1<<1)
|
#define BIMM (1<<1)
|
||||||
#define BSTALE (1<<2)
|
#define BSTALE (1<<2)
|
||||||
|
|
||||||
Iosect* getiosect(Xfs*, long, int);
|
Iosect* getiosect(Xfs*, vlong, int);
|
||||||
Iosect* getosect(Xfs*, long);
|
Iosect* getosect(Xfs*, vlong);
|
||||||
Iosect* getsect(Xfs*, long);
|
Iosect* getsect(Xfs*, vlong);
|
||||||
Iosect* newsect(void);
|
Iosect* newsect(void);
|
||||||
Iotrack* getiotrack(Xfs*, long);
|
Iotrack* getiotrack(Xfs*, vlong);
|
||||||
int canmlock(MLock*);
|
int canmlock(MLock*);
|
||||||
int devcheck(Xfs*);
|
int devcheck(Xfs*);
|
||||||
int devread(Xfs*, long, void*, long);
|
int devread(Xfs*, vlong, void*, long);
|
||||||
int devwrite(Xfs*, long, void*, long);
|
int devwrite(Xfs*, vlong, void*, long);
|
||||||
int tread(Iotrack*);
|
int tread(Iotrack*);
|
||||||
int twrite(Iotrack*);
|
int twrite(Iotrack*);
|
||||||
void freesect(Iosect*);
|
void freesect(Iosect*);
|
||||||
|
|
|
@ -17,7 +17,7 @@ getxfs(char *user, char *name)
|
||||||
Dir *dir;
|
Dir *dir;
|
||||||
Qid dqid;
|
Qid dqid;
|
||||||
char *p, *q;
|
char *p, *q;
|
||||||
long offset;
|
vlong offset;
|
||||||
int fd, omode;
|
int fd, omode;
|
||||||
|
|
||||||
USED(user);
|
USED(user);
|
||||||
|
@ -38,8 +38,8 @@ getxfs(char *user, char *name)
|
||||||
offset = 0;
|
offset = 0;
|
||||||
if(p = strrchr(name, ':')){
|
if(p = strrchr(name, ':')){
|
||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
offset = strtol(p, &q, 0);
|
offset = strtoll(p, &q, 0);
|
||||||
chat("name %s, offset %ld\n", p, offset);
|
chat("name %s, offset %lld\n", p, offset);
|
||||||
if(offset < 0 || p == q){
|
if(offset < 0 || p == q){
|
||||||
errno = Enofilsys;
|
errno = Enofilsys;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -225,7 +225,7 @@ clean(Xfile *f)
|
||||||
* relocate the dos entries of all fids in the same file
|
* relocate the dos entries of all fids in the same file
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
dosptrreloc(Xfile *f, Dosptr *dp, ulong addr, ulong offset)
|
dosptrreloc(Xfile *f, Dosptr *dp, vlong addr, ulong offset)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Xfile *p;
|
Xfile *p;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue