add very big file support (David Swasey)
diff --git a/src/libdiskfs/ext2.c b/src/libdiskfs/ext2.c
index 6a55e20..5485d73 100644
--- a/src/libdiskfs/ext2.c
+++ b/src/libdiskfs/ext2.c
@@ -167,7 +167,7 @@
 	int ppb;
 	Block *b;
 	u32int *a;
-	u32int obno;
+	u32int obno, pbno;
 
 	obno = bno;
 	if(bno < NDIRBLOCKS){
@@ -185,7 +185,7 @@
 		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 @@
 		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 @@
 		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);
 	}
@@ -351,6 +354,17 @@
 	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)
 {
@@ -388,8 +402,8 @@
 	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 @@
 	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 @@
 	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 @@
 	}
 	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
index d0503b4..159a243 100644
--- a/src/libdiskfs/ext2.h
+++ b/src/libdiskfs/ext2.h
@@ -84,7 +84,7 @@
 };
 
 /*
- * Blcok group on-disk format.
+ * Block group on-disk format.
  */
 struct Group
 {
@@ -122,7 +122,7 @@
 	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];
 };