URI: 
       tadd very big file support (David Swasey) - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit b109049fbdd219b9fe366644d0979a8cbf4e6607
   DIR parent 8f57d0d0d9117936fb86d1ec182879c3b5a4f713
  HTML 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(-)
       ---
   DIR 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, u32int count,
                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, u32int count,
                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, u32int count,
                }
                count = tot - skip1;
        
       -        *peof = (offset+count == ino.size);
       +        *peof = (offset+count == size);
                *pcount = count;
                *pdata = data;
                return Nfs3Ok;
   DIR 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];
        };