commit - 8f57d0d0d9117936fb86d1ec182879c3b5a4f713
commit + b109049fbdd219b9fe366644d0979a8cbf4e6607
blob - 6a55e20ba7db977519b2450675d89e31d9d3a63c
blob + 5485d7398cc693a135652e371df489d9a071e167
--- src/libdiskfs/ext2.c
+++ src/libdiskfs/ext2.c
int ppb;
Block *b;
u32int *a;
- u32int obno;
+ u32int obno, pbno;
obno = bno;
if(bno < NDIRBLOCKS){
if(b == nil)
return nil;
a = (u32int*)b->data;
- bno = a[bno%ppb];
+ bno = a[bno];
blockput(b);
return ext2datablock(fs, bno, 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);
}
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);
}
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
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;
int skip1, tot, want, fragcount;
Inode ino;
Nfs3Status ok;
+ u64int size;
fs = fsys->priv;
if((ok = handle2ino(fs, h, nil, &ino)) != Nfs3Ok)
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)
}
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
};
/*
- * Blcok group on-disk format.
+ * Block group on-disk format.
*/
struct Group
{
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];
};