commit d29f5ece8b534180076e2859dcc014b3c36b00cf from: Russ Cox date: Sun Jun 01 12:47:06 2008 UTC libdiskfs: ext2 revision 1 tweaks (Fazlul Shahriar) commit - df1ee4e1af9340a8207535c5009ec289bf1ecda1 commit + d29f5ece8b534180076e2859dcc014b3c36b00cf blob - afd952222c6cba995ea02827ae16aa7015b70be7 blob + b55f1eb3dadc4d18291f14212b1d1b77af23ffac --- src/libdiskfs/ext2.c +++ src/libdiskfs/ext2.c @@ -275,7 +275,11 @@ ext2sync(Fsys *fsys) / super.blockspergroup; fs->inospergroup = super.inospergroup; fs->blockspergroup = super.blockspergroup; - fs->inosperblock = fs->blocksize / InodeSize; + if(super.revlevel >= 1) + fs->inosize = super.inosize; + else + fs->inosize = 128; + fs->inosperblock = fs->blocksize / fs->inosize; if(fs->blocksize == SBOFF) fs->groupaddr = 2; else @@ -336,7 +340,7 @@ handle2ino(Ext2 *fs, Nfs3Handle *h, u32int *pinum, Ino addr = g.inodeaddr + ioff/fs->inosperblock; if((b = diskread(fs->disk, fs->blocksize, (u64int)addr*fs->blocksize)) == nil) return Nfs3ErrIo; - parseinode(ino, b->data+InodeSize*(ioff%fs->inosperblock)); + parseinode(ino, b->data+fs->inosize*(ioff%fs->inosperblock)); blockput(b); return Nfs3Ok; } @@ -875,5 +879,8 @@ parsesuper(Super *s, uchar *p) s->revlevel = l32(p+76); s->defresuid = l16(p+80); s->defresgid = l16(p+82); - /* 940 byte reserved */ + s->firstino = l32(p+84); + s->inosize = l32(p+88); + s->blockgroupnr = l16(p+60); + /* 932 byte reserved */ } blob - 6109974d2b53a7571dd69fd8d19f561d44bcdaf9 blob + 7ddd400a94457930b7e37d45a6a32d297edb3bb6 --- src/libdiskfs/ext2.h +++ src/libdiskfs/ext2.h @@ -80,7 +80,12 @@ struct Super u32int revlevel; /* Revision level */ u16int defresuid; /* Default uid for reserved blocks */ u16int defresgid; /* Default gid for reserved blocks */ - u32int reserved[235]; /* Padding to the end of the block */ + + /* the following are only available with revlevel = 1 */ + u32int firstino; /* First non-reserved inode */ + u16int inosize; /* size of inode structure */ + u16int blockgroupnr; /* block group # of this super block */ + u32int reserved[233]; /* Padding to the end of the block */ }; /* @@ -122,10 +127,6 @@ struct Inode u32int diracl; /* Directory ACL or high size bits */ u32int faddr; /* Fragment address */ }; -enum -{ - InodeSize = 128 -}; /* * Directory entry @@ -153,6 +154,7 @@ struct Ext2 uint inospergroup; uint blockspergroup; uint inosperblock; + uint inosize; uint groupaddr; uint descperblock; uint firstblock;