[openfirmware] [commit] r2939 - forth/lib ofw/fs/ext2fs
repository service
svn at openfirmware.info
Sat Apr 7 01:05:35 CEST 2012
Author: wmb
Date: Sat Apr 7 01:05:35 2012
New Revision: 2939
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2939
Log:
Ext2/3/4 file system journal recovery - OLPC trac 11762 - Fixed list management problem that could result in missing list nodes in the journal overlay and revocation lists.
Modified:
forth/lib/linklist.fth
ofw/fs/ext2fs/recovery.fth
Modified: forth/lib/linklist.fth
==============================================================================
--- forth/lib/linklist.fth Fri Apr 6 11:32:55 2012 (r2938)
+++ forth/lib/linklist.fth Sat Apr 7 01:05:35 2012 (r2939)
@@ -45,6 +45,11 @@
\ for each node in the list. Returns the node for which "acf"
\ returned "true", and also the preceding node. See the comments
\ in the code for more information.
+\
+\ find-node? ( ??? list acf -- ??? false | ??? node true )
+\ Searches the linked list "list", executing the procedure "acf"
+\ for each node in the list. Returns the node and true if found,
+\ or false if not found.
alias list: variable
@@ -58,6 +63,8 @@
alias >next-node @ ( node-adr -- next-node-adr )
+: list-end? ( node-adr -- flag ) >next-node @ 0= ;
+
\ Inserts "new-node" into a linked list after "prev-node" (and before
\ the node which was the successor of "prev-node").
@@ -112,6 +119,14 @@
r> r> r> drop ( ??? prev-node this-node )
;
+: find-node? ( ??? list acf -- ??? false | ??? node true )
+ find-node ?dup if ( ??? prev-node this-node )
+ nip true ( ??? node true )
+ else ( ??? prev-node )
+ drop false ( ??? false )
+ then ( ??? false | ??? node true )
+;
+
\ Here's how "find-node" could be used to locate the insertion point
\ for a list sorted in ascending order of the second field.
Modified: ofw/fs/ext2fs/recovery.fth
==============================================================================
--- ofw/fs/ext2fs/recovery.fth Fri Apr 6 11:32:55 2012 (r2938)
+++ ofw/fs/ext2fs/recovery.fth Sat Apr 7 01:05:35 2012 (r2939)
@@ -160,7 +160,8 @@
/n field >r_sequence
nodetype: revoke-node
-list: revoke-list
+instance variable revoke-list
+revoke-list off
: free-revoke-list ( -- )
begin revoke-list >next-node while ( )
@@ -169,44 +170,40 @@
repeat ( )
;
-: block#> ( d.block# 'node -- d.block# flag )
- >r_block# 2@ 2over d<
+\ Worker function for find-node?
+: block#= ( d.block# 'node -- d.block# flag )
+ >r_block# 2@ 2over d=
;
\ node is either the found one or the insertion point
-: find-revoked ( d.block# -- d.block# node found? )
- revoke-list ['] block#> find-node if ( d.block# node )
- 3dup >r_block# 2@ d= ( d.block# node found? )
- else ( d.block# node )
- false ( d.block# node found? )
- then ( d.block# node found? )
+: find-revoked? ( d.block# -- d.block# false | d.block# node found? )
+ revoke-list ['] block#= find-node?
;
0 value next-commit-id
: revoked? ( d.block# -- revoked? )
- find-revoked if ( d.block# node )
- nip nip ( node )
- >r_sequence @ ( sequence# )
- next-commit-id = ( revoked? )
- else ( d.block# node )
- 3drop false ( revoked? )
- then ( revoked? )
+ find-revoked? if ( d.block# node )
+ nip nip ( node )
+ >r_sequence @ ( sequence# )
+ next-commit-id = ( revoked? )
+ else ( d.block# )
+ 2drop false ( revoked? )
+ then ( revoked? )
;
: set-revoke ( d.block# -- )
- find-revoked if ( d.block# node )
+ find-revoked? if ( d.block# node )
nip nip ( node )
next-commit-id over >r_sequence @ - 0>= if ( node )
next-commit-id over >r_sequence ! ( node )
then ( node )
drop ( )
- else ( d.block# node )
- -rot ( node d.block# )
- revoke-node allocate-node >r ( node d.block# r: newnode )
- r@ >r_block# 2! ( node r: newnode )
- next-commit-id r@ >r_sequence ! ( node r: newnode )
- r> swap insert-after ( )
+ else ( d.block# )
+ revoke-node allocate-node >r ( d.block# r: newnode )
+ r@ >r_block# 2! ( r: newnode )
+ next-commit-id r@ >r_sequence ! ( r: newnode )
+ r> revoke-list insert-after ( )
then ( )
;
@@ -216,7 +213,8 @@
/n field >o_escaped?
nodetype: overlay-node
-list: overlay-list
+instance variable overlay-list
+overlay-list off
: free-overlay-list ( -- )
begin overlay-list >next-node while ( )
@@ -225,13 +223,8 @@
repeat ( )
;
-\ node is either the found one or the insertion point
-: find-overlay? ( d.block# -- d.block# node found? )
- overlay-list ['] block#> find-node if ( d.block# node )
- 3dup >r_block# 2@ d= ( d.block# node found? )
- else ( d.block# node )
- false ( d.block# node found? )
- then ( d.block# node found? )
+: find-overlay? ( d.block# -- d.block# false | d.block# node true )
+ overlay-list ['] block#= find-node?
;
: j-read-file-block ( adr lblk# -- )
@@ -245,8 +238,7 @@
else ( adr )
drop ( )
then ( )
- else ( adr d.pblk# node )
- drop ( adr d.pblk# )
+ else ( adr d.pblk# )
d.block swap bsize move ( )
then ( )
else ( adr )
@@ -266,11 +258,10 @@
: 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 ( )
+ else ( escaped? log-blk# d.block# )
+ overlay-node allocate-node >r ( d.block# escaped? log-blk# r: newnode )
+ r@ set-overlay-node ( r: newnode )
+ r> overlay-list insert-after ( )
then
;
@@ -408,6 +399,7 @@
then
;
: commit-journal ( -- )
+ j-read-only? if exit then
jsb >s_sequence dup be-l@ 1+ swap be-l!
0 jsb >s_start be-l!
jsb 0 write-file-block
@@ -416,7 +408,10 @@
: process-journal ( -- )
read-journal if exit then
-." Recovering from journal ... "
+ ." Recovering from journal "
+ j-read-only? if ." (read-only)" then
+ ." ... "
+
0 to end-transaction
0 ['] one-pass catch ?dup if
@@ -443,4 +438,3 @@
free-journal
cr
;
-\ XXX need to do free-overlay-list in close
More information about the openfirmware
mailing list