[openfirmware] [commit] r2815 - cpu/arm/olpc forth/lib ofw/fs/ext2fs

repository service svn at openfirmware.info
Wed Jan 11 01:42:44 CET 2012


Author: wmb
Date: Wed Jan 11 01:42:44 2012
New Revision: 2815
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2815

Log:
EXT2/3/4 filesystem - OLPC trac #11184 - fixed problem with group descriptor checksums, which caused fsck errors when deleting files on ext4.

Added:
   forth/lib/crc16.fth
Modified:
   cpu/arm/olpc/prefw.fth
   ofw/fs/ext2fs/bitmap.fth
   ofw/fs/ext2fs/sb.fth

Modified: cpu/arm/olpc/prefw.fth
==============================================================================
--- cpu/arm/olpc/prefw.fth	Tue Jan 10 06:19:38 2012	(r2814)
+++ cpu/arm/olpc/prefw.fth	Wed Jan 11 01:42:44 2012	(r2815)
@@ -89,6 +89,7 @@
 [ifdef] resident-packages
 
 \needs unix-seconds>  fload ${BP}/ofw/fs/unixtime.fth	\ Unix time calculation
+\needs ($crc16)       fload ${BP}/forth/lib/crc16.fth
 support-package: ext2-file-system
    fload ${BP}/ofw/fs/ext2fs/ext2fs.fth	\ Linux file system
 end-support-package

Added: forth/lib/crc16.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ forth/lib/crc16.fth	Wed Jan 11 01:42:44 2012	(r2815)
@@ -0,0 +1,48 @@
+purpose: CRC16 with polynomial x^16 + x^15 + x^2 + 1 (0x8005) as used by Linux kernel
+
+base @ hex
+create crc16tab
+   0000 w, C0C1 w, C181 w, 0140 w, C301 w, 03C0 w, 0280 w, C241 w,
+   C601 w, 06C0 w, 0780 w, C741 w, 0500 w, C5C1 w, C481 w, 0440 w,
+   CC01 w, 0CC0 w, 0D80 w, CD41 w, 0F00 w, CFC1 w, CE81 w, 0E40 w,
+   0A00 w, CAC1 w, CB81 w, 0B40 w, C901 w, 09C0 w, 0880 w, C841 w,
+   D801 w, 18C0 w, 1980 w, D941 w, 1B00 w, DBC1 w, DA81 w, 1A40 w,
+   1E00 w, DEC1 w, DF81 w, 1F40 w, DD01 w, 1DC0 w, 1C80 w, DC41 w,
+   1400 w, D4C1 w, D581 w, 1540 w, D701 w, 17C0 w, 1680 w, D641 w,
+   D201 w, 12C0 w, 1380 w, D341 w, 1100 w, D1C1 w, D081 w, 1040 w,
+   F001 w, 30C0 w, 3180 w, F141 w, 3300 w, F3C1 w, F281 w, 3240 w,
+   3600 w, F6C1 w, F781 w, 3740 w, F501 w, 35C0 w, 3480 w, F441 w,
+   3C00 w, FCC1 w, FD81 w, 3D40 w, FF01 w, 3FC0 w, 3E80 w, FE41 w,
+   FA01 w, 3AC0 w, 3B80 w, FB41 w, 3900 w, F9C1 w, F881 w, 3840 w,
+   2800 w, E8C1 w, E981 w, 2940 w, EB01 w, 2BC0 w, 2A80 w, EA41 w,
+   EE01 w, 2EC0 w, 2F80 w, EF41 w, 2D00 w, EDC1 w, EC81 w, 2C40 w,
+   E401 w, 24C0 w, 2580 w, E541 w, 2700 w, E7C1 w, E681 w, 2640 w,
+   2200 w, E2C1 w, E381 w, 2340 w, E101 w, 21C0 w, 2080 w, E041 w,
+   A001 w, 60C0 w, 6180 w, A141 w, 6300 w, A3C1 w, A281 w, 6240 w,
+   6600 w, A6C1 w, A781 w, 6740 w, A501 w, 65C0 w, 6480 w, A441 w,
+   6C00 w, ACC1 w, AD81 w, 6D40 w, AF01 w, 6FC0 w, 6E80 w, AE41 w,
+   AA01 w, 6AC0 w, 6B80 w, AB41 w, 6900 w, A9C1 w, A881 w, 6840 w,
+   7800 w, B8C1 w, B981 w, 7940 w, BB01 w, 7BC0 w, 7A80 w, BA41 w,
+   BE01 w, 7EC0 w, 7F80 w, BF41 w, 7D00 w, BDC1 w, BC81 w, 7C40 w,
+   B401 w, 74C0 w, 7580 w, B541 w, 7700 w, B7C1 w, B681 w, 7640 w,
+   7200 w, B2C1 w, B381 w, 7340 w, B101 w, 71C0 w, 7080 w, B041 w,
+   5000 w, 90C1 w, 9181 w, 5140 w, 9301 w, 53C0 w, 5280 w, 9241 w,
+   9601 w, 56C0 w, 5780 w, 9741 w, 5500 w, 95C1 w, 9481 w, 5440 w,
+   9C01 w, 5CC0 w, 5D80 w, 9D41 w, 5F00 w, 9FC1 w, 9E81 w, 5E40 w,
+   5A00 w, 9AC1 w, 9B81 w, 5B40 w, 9901 w, 59C0 w, 5880 w, 9841 w,
+   8801 w, 48C0 w, 4980 w, 8941 w, 4B00 w, 8BC1 w, 8A81 w, 4A40 w,
+   4E00 w, 8EC1 w, 8F81 w, 4F40 w, 8D01 w, 4DC0 w, 4C80 w, 8C41 w,
+   4400 w, 84C1 w, 8581 w, 4540 w, 8701 w, 47C0 w, 4680 w, 8641 w,
+   8201 w, 42C0 w, 4380 w, 8341 w, 4100 w, 81C1 w, 8081 w, 4040 w,
+base !
+
+
+: ($crc16)  ( crc adr len -- crc' )
+   bounds  ?do              ( crc )
+      wbsplit  swap         ( b.high b.low )
+      i c@                  ( b.high b.low c )
+      xor                   ( b.high b.low^c )
+      crc16tab swap wa+ w@  ( b.high w.tabval )
+      xor                   ( crc' )
+   loop
+;

Modified: ofw/fs/ext2fs/bitmap.fth
==============================================================================
--- ofw/fs/ext2fs/bitmap.fth	Tue Jan 10 06:19:38 2012	(r2814)
+++ ofw/fs/ext2fs/bitmap.fth	Wed Jan 11 01:42:44 2012	(r2815)
@@ -7,7 +7,10 @@
 
 0 instance value gd-modified?
 
-: gd-update   ( -- )   true to gd-modified?  ;
+: gd-update   ( block# -- )
+   dup group-desc set-gd-csum  ( )
+   true to gd-modified?        ( )
+;
 : d.block-bitmap  ( group# -- d.block# )
    group-desc  dup le-l@       ( adr n )
    desc64?  if                 ( adr n )
@@ -53,7 +56,7 @@
 
 : free-blocks+!  ( n group# -- )
    tuck free-blocks@ +  0 max   ( group# n' )
-   swap free-blocks!            ( )
+   over free-blocks!            ( group# 'gd )
    gd-update                    ( )
 ;
 : free-inodes@   ( group# -- n )
@@ -74,7 +77,7 @@
 ;
 : free-inodes+!  ( n inode# -- )
    tuck free-inodes@  +   ( group# n' )
-   swap free-inodes!      ( )
+   over free-inodes!      ( group# )
    gd-update              ( )
 ;
 
@@ -256,7 +259,8 @@
          2dup  i d.block-bitmap d<  if		( d.possible-gn )
             d.block				( gdn-adr )
             0 group-desc			( gdn-adr gd0-adr )
-            swap bsize move update		( )
+            swap bsize move                     ( )
+	    update		                ( )
          else					( d.possible-gn )
             2drop				( )
          then					( )

Modified: ofw/fs/ext2fs/sb.fth
==============================================================================
--- ofw/fs/ext2fs/sb.fth	Tue Jan 10 06:19:38 2012	(r2814)
+++ ofw/fs/ext2fs/sb.fth	Wed Jan 11 01:42:44 2012	(r2815)
@@ -50,11 +50,51 @@
 
 : recover?  ( -- flag )  24 +sbl 4 and 0<>  ;
 
+: compat-flags    ( -- mask )  23 +sbl  ;
+: incompat-flags  ( -- mask )  24 +sbl  ;
+: ro-flags        ( -- mask )  25 +sbl  ;
+
+: sb-64bit?    ( -- flag )  incompat-flags h# 80 and  0<>  ;
+: sb-extents?  ( -- flag )  incompat-flags h# 40 and  0<>  ;
+: sb-gd-csum?  ( -- flag )  ro-flags       h# 10 and  0<>  ;
+
 \ Don't write to a disk that uses extensions we don't understand
 : unknown-extensions?   ( -- unsafe? )
-   23 +sbl h# ffffffff invert and        \ Accept all compat extensions
-   24 +sbl h# 00000002 invert and  or    \ Incompatible - accept FILETYPE
-   25 +sbl h# 00000003 invert and  or    \ RO - accept SPARSE_SUPER and LARGE_FILE
+   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
+;
+: 'sb-uuid  ( -- adr )  super-block h# 68 +  ;
+variable le-group
+: sb-desc-size  ( -- )  d# 127 +sbw  ;
+
+: sb-gd-csum  ( 'gd -- w )  h# 1e + le-w@  ;
+: sum-gd  ( group# 'gd -- sum )
+   h# ffff 'sb-uuid d# 16 ($crc16)           ( group# 'gd sum )
+   rot le-group le-l!  le-group /l ($crc16)  ( 'gd sum' )
+   over h# 1e ($crc16)                       ( 'gd sum' )
+   sb-64bit?  h# 20 sb-desc-size <  and  if  ( 'gd sum' )
+      swap sb-desc-size  h# 20 /string       ( sum adr len )
+      ($crc16)                               ( sum' )
+   else                                      ( 'gd sum' )
+      nip                                    ( sum' )
+   then                                      ( sum' )
+;
+: gd-csum-ok?  ( group# 'gd -- ok? )
+   sb-gd-csum?  if            ( group# 'gd )
+      tuck sum-gd             ( 'gd sum )
+      swap h# 1e + le-w@  <>  ( flag )
+   else                       ( group# 'gd )
+      2drop true              ( flag )
+   then                       ( flag )
+;
+: set-gd-csum  ( group# 'gd -- )
+   sb-gd-csum?  if            ( group# 'gd )
+      tuck sum-gd             ( 'gd sum )
+      swap h# 1e +  le-w!     ( )
+   else                       ( group# 'gd )
+      2drop                   ( )
+   then                       ( )
 ;
 
 : do-alloc  ( adr len -- )  " dma-alloc" $call-parent  ;
@@ -95,8 +135,8 @@
 : d.gds-block#  ( -- d.dev-block# )
    d.gds-fs-block#  bsize ublock / du*		( dev-block# )
 ;
-: desc64?  ( -- flag )  h# 7f +sbw  0<>  ;
-: /gd  ( -- n )  h# 7f +sbw  ?dup 0=  if  h# 20  then  ;
+: desc64?  ( -- flag )  sb-desc-size  0<>  ;
+: /gd  ( -- n )  sb-desc-size  ?dup 0=  if  h# 20  then  ;
 : /gds  ( -- size )  #groups /gd *  ublock round-up  ;
 : group-desc  ( group# -- adr )  /gd *  gds +  ;
 : d.gpimin    ( group -- d.block# )



More information about the openfirmware mailing list