Author: wmb Date: Wed Jan 11 09:36:50 2012 New Revision: 2817 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2817
Log: EXT2/3/4 filesystem - OLPC trac #11184 - fixed another problem with journal recovery (corruption when blocks revoked) and enabled writing by accepting more flag values.
Modified: ofw/fs/ext2fs/dir.fth ofw/fs/ext2fs/recovery.fth ofw/fs/ext2fs/sb.fth
Modified: ofw/fs/ext2fs/dir.fth ============================================================================== --- ofw/fs/ext2fs/dir.fth Wed Jan 11 02:45:49 2012 (r2816) +++ ofw/fs/ext2fs/dir.fth Wed Jan 11 09:36:50 2012 (r2817) @@ -75,7 +75,18 @@ swap c@ ( adr len ) ;
-: +link-count ( increment -- ) link-count + link-count! ; +: +link-count ( increment -- ) + \ link-count = 1 means that the directory has more links than can + \ be represented in a 16-bit number + link-count 1 = if drop exit then \ Don't increment if already 1 + + \ If the incremented value exceeds the limit, store 1 + \ We should also set the RO_COMPAT_DIR_NLINK bit in the superblock, + \ but we assume that OFW won't really be used to create enormous directories + link-count + dup d# 65000 >= if drop 1 then ( link-count ) + + link-count! +;
: new-inode ( mode -- inode# ) alloc-inode set-inode ( mode ) \ alloc-inode erases the inode
Modified: ofw/fs/ext2fs/recovery.fth ============================================================================== --- ofw/fs/ext2fs/recovery.fth Wed Jan 11 02:45:49 2012 (r2816) +++ ofw/fs/ext2fs/recovery.fth Wed Jan 11 09:36:50 2012 (r2817) @@ -277,6 +277,7 @@ then ( d.block# ) 2dup revoked? if ( d.block# ) 2drop ( ) + log-block++ drop ( ) else ( d.block# ) tagp >t_flags be-l@ 1 and ( d.block# escaped? ) j-read-only? if ( d.block# escaped? ) @@ -411,18 +412,22 @@ read-journal if exit then
." Recovering from journal ... " + 0 to end-transaction
- 0 ['] one-pass catch if + 0 ['] one-pass catch ?dup if + .error ." Journal scan failed" cr free-journal exit then
- 1 ['] one-pass catch if + 1 ['] one-pass catch ?dup if + .error ." Journal revoke failed" cr free-revoke-list free-journal exit then
- 2 ['] one-pass catch if + 2 ['] one-pass catch ?dup if + .error ." Journal replay failed" cr free-overlay-list free-revoke-list free-journal exit then
Modified: ofw/fs/ext2fs/sb.fth ============================================================================== --- ofw/fs/ext2fs/sb.fth Wed Jan 11 02:45:49 2012 (r2816) +++ ofw/fs/ext2fs/sb.fth Wed Jan 11 09:36:50 2012 (r2817) @@ -61,8 +61,8 @@ \ Don't write to a disk that uses extensions we don't understand : unknown-extensions? ( -- unsafe? ) compat-flags h# ffffffff invert and \ Accept all compat extensions - incompat-flags h# 00000002 invert and or \ Incompatible - accept FILETYPE - ro-flags h# 00000003 invert and or \ RO - accept SPARSE_SUPER and LARGE_FILE + incompat-flags h# 00000002 invert and or \ Incompatible - accept FILETYPE, EXTENTS, FLEX_BG + ro-flags h# 00000073 invert and or \ RO - accept SPARSE_SUPER, LARGE_FILE, GDT_CSUM, DIR_NLINK, EXTRA_ISIZE ; : 'sb-uuid ( -- adr ) super-block h# 68 + ; variable le-group