[openfirmware] [commit] r2675 - ofw/fs/ext2fs

repository service svn at openfirmware.info
Tue Nov 8 20:19:10 CET 2011


Author: wmb
Date: Tue Nov  8 20:19:10 2011
New Revision: 2675
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2675

Log:
EXT2FS - added an option for "local replay" of a dirty ext3 journal, without writing to the disk.

Modified:
   ofw/fs/ext2fs/methods.fth
   ofw/fs/ext2fs/recovery.fth

Modified: ofw/fs/ext2fs/methods.fth
==============================================================================
--- ofw/fs/ext2fs/methods.fth	Tue Nov  8 20:19:06 2011	(r2674)
+++ ofw/fs/ext2fs/methods.fth	Tue Nov  8 20:19:10 2011	(r2675)
@@ -161,7 +161,7 @@
    dup bsize > abort" Bad size for ext2fsfread"
    dfile-size  lblk# bsize um*  d- drop		( addr count rem )
    umin swap			( actual addr )
-   lblk# read-file-block	( actual )
+   lblk# j-read-file-block	( actual )
    dup  0>  if  lblk#++  then	( actual )
 ;
 
@@ -250,6 +250,7 @@
    update-gds
    flush
    release-buffers
+   free-overlay-list
 ;
 : read  ( adr len -- actual )
    ext2fs-fd  ['] fgets catch  if  3drop 0  then

Modified: ofw/fs/ext2fs/recovery.fth
==============================================================================
--- ofw/fs/ext2fs/recovery.fth	Tue Nov  8 20:19:06 2011	(r2674)
+++ ofw/fs/ext2fs/recovery.fth	Tue Nov  8 20:19:10 2011	(r2675)
@@ -133,16 +133,15 @@
 
 : write-jblock  ( d.block# adr -- )
    -rot drop write-fs-block     ( error? )
-\   j-blocksize 2swap     ( adr len d.block# )
-\   j-blocksize du*       ( adr len d.byte# )
-\   write-bytes
    if  ." Journal recovery write error" cr  abort  then
 ;
 
 0 value next-log-block
+: log-block++  ( -- block# )
+   next-log-block dup 1 +wrap to next-log-block  ( block# )
+;
 : next-jblock  ( buf -- )
-   next-log-block read-file-block            ( )
-   next-log-block 1 +wrap to next-log-block  ( )
+   log-block++ read-file-block            ( )
 ;
 
 0 value crc32-sum
@@ -208,9 +207,66 @@
    then                                              ( )
 ;
 
-: replay-tag  ( -- )
-   obh next-jblock                     ( )
+listnode
+   /n 2* field >o_block#
+   /n    field >o_pblock#
+   /n    field >o_escaped?
+nodetype: overlay-node
+
+list: overlay-list
+
+: free-overlay-list  ( -- )
+   begin  overlay-list >next-node  while  ( )
+      overlay-list delete-after           ( node )
+      overlay-node free-node              ( )
+   repeat                                 ( )
+; 
+
+\ node is either the found one or the insertion point
+: find-overlay?  ( d.block# -- d.block# node found? )
+   revoke-list ['] block#> find-node drop    ( d.block# node )
+   3dup >r_block# 2@ d=                      ( d.block# node )
+;
 
+: j-read-file-block  ( adr lblk# -- )
+   >pblk#  ?dup  if               ( adr pblk# )
+      u>d find-overlay?  if       ( adr d.pblk# node )
+         nip nip                  ( adr node )
+         tuck >o_pblock# l@       ( node adr pblk# )
+         block over bsize move    ( node adr )
+         swap >o_escaped? l@  if  ( adr )
+            jbd_magic swap be-l!  ( )
+         else                     ( adr )
+	    drop                  ( )
+	 then                     ( )
+      else                        ( adr d.pblk# node )
+         2drop                    ( adr pblk# )
+         block swap bsize move    ( )
+      then                        ( )
+   else                           ( adr )
+      bsize erase                 ( )
+   then                           ( )
+;
+
+0 value j-read-only?
+: set-overlay-node  ( escaped? log-blk# d.block# node -- )
+   >r                               ( escaped? log-blk# d.block# r: node )
+   r@ >o_block# 2!                  ( escaped? log-blk# r: node )
+   >pblk# r@ >o_pblock# l!          ( escaped? r: node )
+   r> >o_escaped? l!                ( )
+;
+: note-jblock  ( d.block# escaped? log-blk# -- )
+   2swap find-overlay?  if          ( escaped? log-blk# d.block# node )
+      set-overlay-node              ( )
+   else                             ( escaped? log-blk# d.block# node )
+      >r                            ( escaped? log-blk# d.block# r: prev-node )
+      >r overlay-node allocate-node ( d.block# escaped? log-blk# newnode r: prevnode )
+      dup >r set-overlay-node       ( r: prevnode newnode )
+      r> r> insert-after            ( )
+   then
+;
+
+: replay-tag  ( -- )
    tagp >t_blocknr be-l@               ( block# )
    j-incompat 2 and  if                ( block# )     \ 2:FEATURE_INCOMPAT_64BIT
       tagp >t_blocknr_high be-l@       ( d.block# )
@@ -220,10 +276,16 @@
    2dup revoked?  if                   ( d.block# )
       2drop                            ( )
    else                                ( d.block# )
-      tagp >t_flags be-l@ 1 and  if    ( d.block# )  \ 1:FLAG_ESCAPE
-         jbd_magic obh >data be-l!     ( d.block# )
-      then                             ( d.block# )
-      obh write-jblock                 ( )
+      tagp >t_flags be-l@ 1 and        ( d.block# escaped? )
+      j-read-only?  if                 ( d.block# escaped? )
+         log-block++ note-jblock       ( )
+      else                             ( d.block# escaped? )
+         obh next-jblock               ( d.block# escaped? )
+         if                            ( d.block# )  \ 1:FLAG_ESCAPE
+            jbd_magic obh >data be-l!  ( d.block# )
+         then                          ( d.block# )
+         obh write-jblock              ( )
+      then                             ( )
    then                                ( )
 ;
 
@@ -360,7 +422,7 @@
 
    2 ['] one-pass catch  if
       ." Journal replay failed" cr
-      free-revoke-list  free-journal  exit
+      free-overlay-list free-revoke-list  free-journal  exit
    then
 
    free-revoke-list
@@ -369,3 +431,4 @@
    free-journal
 cr
 ;
+\ XXX need to do free-overlay-list in close



More information about the openfirmware mailing list