[openfirmware] r854 - ofw/fs/jffs2

svn at openfirmware.info svn at openfirmware.info
Wed Jul 23 10:44:59 CEST 2008


Author: wmb
Date: 2008-07-23 10:44:58 +0200 (Wed, 23 Jul 2008)
New Revision: 854

Modified:
   ofw/fs/jffs2/jffs2.fth
Log:
JFFS2 - allocate temporary dirent buffer on a per-instance basis
to enable recursive directory listing.


Modified: ofw/fs/jffs2/jffs2.fth
===================================================================
--- ofw/fs/jffs2/jffs2.fth	2008-07-20 00:33:56 UTC (rev 853)
+++ ofw/fs/jffs2/jffs2.fth	2008-07-23 08:44:58 UTC (rev 854)
@@ -40,6 +40,11 @@
 : next-minode  ( -- adr ) 'next-minode @  ;
 : minodes ( -- adr )  next-inode  ;  \ Start the inode pointer list after the inodes
 
+d# 20,000 constant /tdirents   \ Arbitrary maximum size of temporary dirent buffer
+instance variable 'next-tdirent
+: next-tdirent  ( -- adr )  'next-tdirent @  ;
+0 instance value tdirents
+
 0 instance value file-buf       \ Buffer for constructing file
 0 instance value file-size      \ Actual size of file
 
@@ -118,6 +123,8 @@
 
    block-buf /eblock     dma-free
 
+   tdirents  if  tdirents  /tdirents dma-free  then
+
    \ Don't free the CRC, in case somebody wants to reuse it.
    \ The memory savings is insignificant.
    \ crc32-free
@@ -1330,32 +1337,32 @@
 : tdlen       ( tdirent -- len )  dup tdname$ + swap -  ;
 
 \ Move down all the following tdirents to overwrite the current one.
-
 : remove-tdirent  ( tdirent -- )
    dup  tdlen              ( tdirent len )
    2dup +                  ( tdirent len  next-tdirent )
    rot                     ( len  next-tdirent tdirent )
-   next-minode 2 pick -    ( len  next-tdirent tdirent move-len )
+   next-tdirent 2 pick -   ( len  next-tdirent tdirent move-len )
    move                    ( len )
-   negate 'next-minode +!  ( )
+   negate 'next-tdirent +! ( )
 ; 
+
 : replace-tdirent  ( rdirent tdirent -- )
    over rdinode@    over      l!    ( rdirent tdirent' )  \ Inum
    swap rdversion@  swap la1+ l!    ( )                   \ Version
 ;
 
 : place-tdirent  ( rdirent -- )
-   next-minode               ( rdirent tdirent )
+   next-tdirent              ( rdirent tdirent )
    over rdinode@   l+!       ( rdirent tdirent' )
    over rdversion@ l+!       ( rdirent tdirent' )
    swap rdname$              ( tdirent name$ )
    rot pack                  ( tdirent )
-   count + 'next-minode !    ( )
+   count + 'next-tdirent !   ( )
 ;
 
 : insert-dirent  ( offset -- )
    get-node                                     ( rdirent )
-   next-minode  minodes  ?do                    ( rdirent )
+   next-tdirent  tdirents  ?do                  ( rdirent )
       dup rdname$  i tdname$  $=  if            ( rdirent )  \ Same name
          dup rdversion@  i tdversion@  >  if    ( rdirent )  \ New version
             dup i replace-tdirent               ( rdirent )
@@ -1367,12 +1374,15 @@
    place-tdirent
 ;
 
-: prep-dirents  ( -- )
-   minodes 'next-minode !   \ Empty the list
+: prep-dirents  ( -- tdirent )
+   /tdirents dma-alloc  to tdirents
+
+   tdirents 'next-tdirent !   \ Empty the list
    dirents                         ( adr )
    begin  next-pino-match  while   ( adr'  offset )
       insert-dirent                ( adr )
    repeat                          ( )
+   tdirents                        ( adr )
 ;
 
 \ End of "tdirent" section
@@ -1582,11 +1592,11 @@
 ;
 
 : next-file-info  ( id -- false | id' s m h d m y len attributes name$ true )
-   dup 0=  if  drop prep-dirents  minodes  then   ( tdirent )
+   dup 0=  if  drop prep-dirents    then             ( tdirent )
 
    \ Skip deleted nodes
    begin
-      dup next-minode =  if  drop false exit  then   ( tdirent )
+      dup next-tdirent =  if  drop false exit  then  ( tdirent )
       dup tdinum@  0=                                ( tdirent deleted? )
    while                                             ( tdirent )
       dup tdlen +                                    ( tdirent' )




More information about the openfirmware mailing list