commit b109049fbdd219b9fe366644d0979a8cbf4e6607 from: rsc date: Sun Mar 25 17:35:08 2007 UTC add very big file support (David Swasey) commit - 8f57d0d0d9117936fb86d1ec182879c3b5a4f713 commit + b109049fbdd219b9fe366644d0979a8cbf4e6607 blob - 6a55e20ba7db977519b2450675d89e31d9d3a63c blob + 5485d7398cc693a135652e371df489d9a071e167 --- src/libdiskfs/ext2.c +++ src/libdiskfs/ext2.c @@ -167,7 +167,7 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int si int ppb; Block *b; u32int *a; - u32int obno; + u32int obno, pbno; obno = bno; if(bno < NDIRBLOCKS){ @@ -185,7 +185,7 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int si if(b == nil) return nil; a = (u32int*)b->data; - bno = a[bno%ppb]; + bno = a[bno]; blockput(b); return ext2datablock(fs, bno, size); } @@ -197,13 +197,14 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int si 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); } @@ -215,19 +216,21 @@ ext2fileblock(Ext2 *fs, Inode *ino, u32int bno, int si 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); } @@ -349,6 +352,17 @@ ext2root(Fsys *fsys, Nfs3Handle *h) USED(fsys); mkhandle(h, ROOTINODE); 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 @@ -388,8 +402,8 @@ ino2attr(Ext2 *fs, Inode *ino, u32int inum, Nfs3Attr * 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; @@ -659,6 +673,7 @@ ext2readfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle * int skip1, tot, want, fragcount; Inode ino; Nfs3Status ok; + u64int size; fs = fsys->priv; if((ok = handle2ino(fs, h, nil, &ino)) != Nfs3Ok) @@ -667,14 +682,15 @@ ext2readfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle * 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) @@ -705,7 +721,7 @@ ext2readfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle * } count = tot - skip1; - *peof = (offset+count == ino.size); + *peof = (offset+count == size); *pcount = count; *pdata = data; return Nfs3Ok; blob - d0503b4036f78877e8d88379f14378962e9563b2 blob + 159a243b829079a7875466f7a42a1cbce8e80976 --- src/libdiskfs/ext2.h +++ src/libdiskfs/ext2.h @@ -84,7 +84,7 @@ struct Super }; /* - * Blcok group on-disk format. + * Block group on-disk format. */ struct Group { @@ -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]; };