Commit Diff


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];
 };