Introduction
Introduction Statistics Contact Development Disclaimer Help
tadd very big file support (David Swasey) - plan9port - [fork] Plan 9 from user…
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit b109049fbdd219b9fe366644d0979a8cbf4e6607
parent 8f57d0d0d9117936fb86d1ec182879c3b5a4f713
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(-)
---
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, u…
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,…
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, u…
}
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
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];
};
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.