| tadd very big file support (David Swasey) - plan9port - [fork] Plan 9 from user… | |
| git clone git://src.adamsgaard.dk/plan9port | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit b109049fbdd219b9fe366644d0979a8cbf4e6607 | |
| parent 8f57d0d0d9117936fb86d1ec182879c3b5a4f713 | |
| Author: rsc <devnull@localhost> | |
| Date: Sun, 25 Mar 2007 17:35:08 +0000 | |
| add very big file support (David Swasey) | |
| Diffstat: | |
| M src/libdiskfs/ext2.c | 48 +++++++++++++++++++++--------… | |
| M src/libdiskfs/ext2.h | 4 ++-- | |
| 2 files changed, 34 insertions(+), 18 deletions(-) | |
| --- | |
| diff --git a/src/libdiskfs/ext2.c b/src/libdiskfs/ext2.c | |
| t@@ -167,7 +167,7 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int size) | |
| int ppb; | |
| Block *b; | |
| u32int *a; | |
| - u32int obno; | |
| + u32int obno, pbno; | |
| obno = bno; | |
| if(bno < NDIRBLOCKS){ | |
| t@@ -185,7 +185,7 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int size) | |
| if(b == nil) | |
| return nil; | |
| a = (u32int*)b->data; | |
| - bno = a[bno%ppb]; | |
| + bno = a[bno]; | |
| blockput(b); | |
| return ext2datablock(fs, bno, size); | |
| } | |
| t@@ -197,13 +197,14 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int size) | |
| if(b == nil) | |
| return nil; | |
| a = (u32int*)b->data; | |
| - bno = a[(bno/ppb)%ppb]; | |
| + pbno = a[bno/ppb]; | |
| + bno = bno%ppb; | |
| blockput(b); | |
| - b = ext2datablock(fs, bno, fs->blocksize); | |
| + b = ext2datablock(fs, pbno, fs->blocksize); | |
| if(b == nil) | |
| return nil; | |
| a = (u32int*)b->data; | |
| - bno = a[bno%ppb]; | |
| + bno = a[bno]; | |
| blockput(b); | |
| return ext2datablock(fs, bno, size); | |
| } | |
| t@@ -215,19 +216,21 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int size) | |
| if(b == nil) | |
| return nil; | |
| a = (u32int*)b->data; | |
| - bno = a[(bno/(ppb*ppb))%ppb]; | |
| + pbno = a[bno/(ppb*ppb)]; | |
| + bno = bno%(ppb*ppb); | |
| blockput(b); | |
| - b = ext2datablock(fs, bno, fs->blocksize); | |
| + b = ext2datablock(fs, pbno, fs->blocksize); | |
| if(b == nil) | |
| return nil; | |
| a = (u32int*)b->data; | |
| - bno = a[(bno/ppb)%ppb]; | |
| + pbno = a[bno/ppb]; | |
| + bno = bno%ppb; | |
| blockput(b); | |
| - b = ext2datablock(fs, bno, fs->blocksize); | |
| + b = ext2datablock(fs, pbno, fs->blocksize); | |
| if(b == nil) | |
| return nil; | |
| a = (u32int*)b->data; | |
| - bno = a[bno%ppb]; | |
| + bno = a[bno]; | |
| blockput(b); | |
| return ext2datablock(fs, bno, size); | |
| } | |
| t@@ -351,6 +354,17 @@ ext2root(Fsys *fsys, Nfs3Handle *h) | |
| return Nfs3Ok; | |
| } | |
| +static u64int | |
| +inosize(Inode* ino) | |
| +{ | |
| + u64int size; | |
| + | |
| + size = ino->size; | |
| + if((ino->mode&IFMT)==IFREG) | |
| + size |= (u64int)ino->diracl << 32; | |
| + return size; | |
| +} | |
| + | |
| static Nfs3Status | |
| ino2attr(Ext2 *fs, Inode *ino, u32int inum, Nfs3Attr *attr) | |
| { | |
| t@@ -388,8 +402,8 @@ ino2attr(Ext2 *fs, Inode *ino, u32int inum, Nfs3Attr *attr) | |
| attr->nlink = ino->nlink; | |
| attr->uid = ino->uid; | |
| attr->gid = ino->gid; | |
| - attr->size = ino->size; | |
| - attr->used = ino->nblock*fs->blocksize; | |
| + attr->size = inosize(ino); | |
| + attr->used = (u64int)ino->nblock*fs->blocksize; | |
| if(attr->type==Nfs3FileBlock || attr->type==Nfs3FileChar){ | |
| rdev = ino->block[0]; | |
| attr->major = (rdev>>8)&0xFF; | |
| t@@ -659,6 +673,7 @@ ext2readfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u… | |
| int skip1, tot, want, fragcount; | |
| Inode ino; | |
| Nfs3Status ok; | |
| + u64int size; | |
| fs = fsys->priv; | |
| if((ok = handle2ino(fs, h, nil, &ino)) != Nfs3Ok) | |
| t@@ -667,14 +682,15 @@ ext2readfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h,… | |
| if((ok = inoperm(&ino, au, AREAD)) != Nfs3Ok) | |
| return ok; | |
| - if(offset >= ino.size){ | |
| + size = inosize(&ino); | |
| + if(offset >= size){ | |
| *pdata = 0; | |
| *pcount = 0; | |
| *peof = 1; | |
| return Nfs3Ok; | |
| } | |
| - if(offset+count > ino.size) | |
| - count = ino.size-offset; | |
| + if(offset+count > size) | |
| + count = size-offset; | |
| data = malloc(count); | |
| if(data == nil) | |
| t@@ -705,7 +721,7 @@ ext2readfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u… | |
| } | |
| count = tot - skip1; | |
| - *peof = (offset+count == ino.size); | |
| + *peof = (offset+count == size); | |
| *pcount = count; | |
| *pdata = data; | |
| return Nfs3Ok; | |
| diff --git a/src/libdiskfs/ext2.h b/src/libdiskfs/ext2.h | |
| t@@ -84,7 +84,7 @@ struct Super | |
| }; | |
| /* | |
| - * Blcok group on-disk format. | |
| + * Block group on-disk format. | |
| */ | |
| struct Group | |
| { | |
| t@@ -122,7 +122,7 @@ struct Inode | |
| u32int block[NBLOCKS];/* Pointers to blocks */ | |
| u32int version; /* File version (for NFS) */ | |
| u32int fileacl; /* File ACL */ | |
| - u32int diracl; /* Directory ACL */ | |
| + u32int diracl; /* Directory ACL or high size bits */ | |
| u32int faddr; /* Fragment address */ | |
| uchar osd2[12]; | |
| }; |