Changeset 2798


Ignore:
Timestamp:
Jan 4, 2012, 9:51:42 AM (4 years ago)
Author:
wmb
Message:

EXT4 extents support. OFW can now read, but not write, EXT4 filesystems.

Location:
ofw/fs/ext2fs
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • ofw/fs/ext2fs/dir.fth

    r2796 r2798  
    55
    662 constant root-dir#
    7 0 instance value dir-block#
     70. instance 2value d.dir-block#
    880 instance value lblk#
    99
     
    18180 instance value wf-type  \ Type - 4 for directory, d# 10 for symlink, etc
    1919
     20: find-dirblk  ( -- )
     21   lblk# >d.pblk# 0= abort" EXT2 - missing directory block"  to d.dir-block#
     22;
    2023: get-dirblk  ( -- end? )
    2124   lblk# bsize um* dfile-size d< 0=  if  true exit  then
    22    lblk# >pblk# to dir-block#
     25   find-dirblk
    2326   false
    2427;
    2528
    2629\ **** Return the address of the current directory entry
    27 : dirent  ( -- adr )  dir-block# block diroff @ +  ;
     30: dirent  ( -- adr )  d.dir-block# d.block diroff @ +  ;
    2831\ Dirent fields:
    2932\ 00.l inode
     
    8891\ On entry:
    8992\   inode# refers to the directory block's inode
    90 \   dir-block# is the physical block number of the first directory block
     93\   d.dir-block# is the physical block number of the first directory block
    9194\   diroff @ is 0
    9295\ On successful exit:
    93 \   dir-block# is the physical block number of the current directory block
     96\   d.dir-block# is the physical block number of the current directory block
    9497\   diroff @ is the within-block offset of the new dirent
    9598: no-dir-space?  ( #needed -- true | offset-to-next false )
     
    132135: last-dirent   ( -- free-bytes )
    133136   dfile-size bsize um/mod nip  swap 0= if  1-  then to lblk#   ( )
    134    lblk# >pblk# to dir-block#
     137   find-dirblk
    135138   (last-dirent) drop
    136139   dirent-len@  dirent-reclen  -
     
    294297\ On entry:
    295298\   inode# is the inode of the directory file
    296 \   dir-block# is the physical block number of the first directory block
     299\   d.dir-block# is the physical block number of the first directory block
    297300\   diroff @ and totoff @ are 0
    298301\ On successful exit:
    299 \   dir-block# is the physical block number of the current directory block
     302\   d.dir-block# is the physical block number of the current directory block
    300303\   diroff @ is the within-block offset of the directory entry that matches name$
    301304\   totoff @ is the overall offset of the directory entry that matches name$
  • ofw/fs/ext2fs/ext2fs.fth

    r2645 r2798  
    99fload ${BP}/ofw/fs/ext2fs/inode.fth
    1010fload ${BP}/ofw/fs/ext2fs/bitmap.fth
     11fload ${BP}/ofw/fs/ext2fs/extent.fth
    1112fload ${BP}/ofw/fs/ext2fs/layout.fth
    1213fload ${BP}/ofw/fs/ext2fs/dir.fth
  • ofw/fs/ext2fs/layout.fth

    r2796 r2798  
    4343   >ind2                                ( adr )
    4444;
    45 : >pblk  ( logical-block# -- 0 | physical-block-adr )
     45: >pblk-adr  ( logical-block# -- 0 | physical-block-adr )
    4646   dup #direct-blocks <  if     ( lblk# )
    47       >direct exit
     47      >direct exit              ( -- adr )
    4848   then                         ( lblk# )
    4949   #direct-blocks -             ( lblk#' )
    5050
    5151   dup #ind-blocks1 <  if       ( lblk# )
    52       #direct-blocks    get-direct >ind1  exit
     52      #direct-blocks    get-direct >ind1  exit  ( -- adr )
    5353   then
    5454   #ind-blocks1 -               ( lblk#' )
    5555
    56    dup #ind-blocks2  <  if
    57       #direct-blocks 1+ get-direct >ind2 exit
    58    then
     56   dup #ind-blocks2  <  if      ( lblk# )
     57      #direct-blocks 1+ get-direct >ind2 exit   ( -- adr )
     58   then                         ( lblk# )
    5959   #ind-blocks2  -              ( lblk#' )
    6060
    61    dup #ind-blocks3  <  if
    62       #direct-blocks 2+ get-direct >ind3 exit
    63    then
    64 
    65    drop 0
    66 ;
    67 : >pblk#  ( logical-block# -- physical-block# )
    68    >pblk dup 0=  if  exit  then   int@
     61   dup #ind-blocks3  <  if      ( lblk# )
     62      #direct-blocks 2+ get-direct >ind3 exit   ( -- adr )
     63   then                         ( lblk# )
     64
     65   drop 0                       ( 0 )
     66;
     67: >d.pblk#  ( logical-block# -- false | d.physical-block# true )
     68   extent?  if                ( logical-block# )
     69      extent->pblk# true exit ( -- d.physical-block# true )
     70   then                       ( logical-block# )
     71   >pblk-adr dup 0=  if       ( 0 )
     72      exit                    ( -- false )
     73   then                       ( adr )
     74   int@ u>d  true             ( d.physical-block# true )
    6975;
    7076
     
    7278\ writes: if any indir block is 0, allocate and return it.
    7379
    74 : get-ind1  ( index block# -- adr )
     80: get-ind1  ( index ind1-block# -- block# )
    7581   >r                                   ( index ) ( r: ind3-block# )
    7682   r@ block over la+ int@               ( index block# )
     
    8187      dup rot r@ block swap la+ int! update     ( new-block# )
    8288   then                                 ( block# )
    83    r> drop
     89   r> drop                              ( block# )
    8490;
    8591: get-ind2  ( index ind2-block# -- block# )
     
    9399      dup rot r@ block swap la+ int! update     ( index-low new-block# )
    94100   then                                 ( index-low block# )
    95    get-ind1                             ( adr )
    96    r> drop
     101   get-ind1                             ( block# )
     102   r> drop                              ( block# )
    97103;
    98104: get-ind3  ( index ind3-block# -- block# )
     
    106112      dup rot r@ block swap la+ int! update     ( index-low new-block# )
    107113   then                                 ( index-low block# )
    108    get-ind2                             ( adr )
    109    r> drop
     114   get-ind2                             ( block# )
     115   r> drop                              ( block# )
    110116;
    111117
     
    113119: get-pblk#  ( logical-block# -- 0 | physical-block# )
    114120   dup #direct-blocks <  if                     ( lblk# )
    115       dup get-direct ?dup  if  nip exit  then   ( lblk# )
     121      dup get-direct ?dup  if                   ( lblk# pblk# )
     122         nip exit                               ( -- pblk# )
     123      then                                      ( lblk# )
    116124     
    117       u.add-block dup rot >direct int! update  exit
     125      u.add-block                               ( lblk# pblk# )
     126      dup rot >direct int! update               ( pblk# )
     127      exit                                      ( -- pblk# )
    118128   then                                         ( lblk# )
    119129   #direct-blocks -                             ( lblk#' )
     
    121131   dup #ind-blocks1 <  if                       ( lblk# )
    122132      #direct-blocks    get-direct ?dup 0=  if  ( lblk# )
    123          u.add-block  dup #direct-blocks put-direct
    124       then                                      ( lblk# block )
    125       get-ind1  exit
    126    then
     133         u.add-block                            ( lblk# ind1-pblk# )
     134         dup #direct-blocks put-direct          ( lblk# ind1-pblk# )
     135      then                                      ( lblk# ind1-pblk# )
     136      get-ind1 exit                             ( -- pblk# )
     137   then                                         ( lblk# )
    127138   #ind-blocks1 -                               ( lblk#' )
    128139
    129140   dup #ind-blocks2  <  if
    130       #direct-blocks 1+ get-direct ?dup 0=  if
    131          u.add-block  dup #direct-blocks 1+ put-direct
    132       then                                      ( lblk# block )
    133       get-ind2 exit
    134    then
    135    #ind-blocks2  -              ( lblk#' )
    136 
    137    dup #ind-blocks3  <  if
    138       #direct-blocks 2+ get-direct ?dup 0=  if
    139          u.add-block  dup #direct-blocks 2+ put-direct
    140       then                                      ( lblk# block )
    141       get-ind3 exit
    142    then
    143 
    144    drop 0
     141      #direct-blocks 1+ get-direct ?dup 0=  if  ( lblk# )
     142         u.add-block                            ( lblk# ind2-pblk# )
     143         dup #direct-blocks 1+ put-direct       ( lblk# ind2-pblk# )
     144      then                                      ( lblk# ind2-pblk# )
     145      get-ind2 exit                             ( -- pblk# )
     146   then                                         ( lblk# )
     147   #ind-blocks2  -                              ( lblk#' )
     148
     149   dup #ind-blocks3  <  if                      ( lblk#' )
     150      #direct-blocks 2+ get-direct ?dup 0=  if  ( lblk# )
     151         u.add-block                            ( lblk# ind3-pblk# )
     152         dup #direct-blocks 2+ put-direct       ( lblk# ind3-pblk# )
     153      then                                      ( lblk# ind3-pblk# )
     154      get-ind3 exit                             ( -- pblk# )
     155   then                                         ( lblk# )
     156
     157   drop 0                                       ( 0 )
    145158;
    146159
     
    190203
    191204: append-block   ( -- )
    192    u.add-block                                          ( block )
    193    dfile-size bsize um/mod nip  dup bsize um* dfile-size!       ( block #blocks )
    194    1+ >pblk int! update
     205   u.add-block                                                  ( pblk# )
     206   dfile-size bsize um/mod nip  dup bsize um* dfile-size!       ( pblk# #blocks )
     207   1+ >pblk-adr int! update
    195208;
    196209
    197210: read-file-block  ( adr lblk# -- )
    198    >pblk#  ?dup  if      ( adr pblk# )
    199       block swap bsize move
     211   >d.pblk#  if          ( adr d.pblk# )
     212      d.block swap bsize move
    200213   else                  ( adr )
    201214      bsize erase        ( )
     
    207220;
    208221: write-file-block  ( adr lblk# -- )
    209    over zeroed? if      \ see if it is already allocated (XXX later: deallocate it)
    210       >pblk#   dup 0= if   2drop  exit  then
    211    else                 \ find or allocate physical block
    212       get-pblk#                 ( adr pblk# )
     222   \ see if it is already allocated (XXX later: deallocate it)
     223   over zeroed? if              ( adr lblk# )
     224      >d.pblk# 0=  if           ( adr )
     225         drop  exit             ( -- )
     226      then                      ( d.pblk# )
     227   else                         ( adr lblk# )  \ find or allocate physical block
     228      get-pblk# u>d             ( adr d.pblk# )
    213229   then
    214230\ This interferes with journal recovery
  • ofw/fs/ext2fs/recovery.fth

    r2796 r2798  
    210210listnode
    211211   /n 2* field >o_block#
    212    /n   field >o_pblock#
     212   /n 2* field >o_pblock#
    213213   /n    field >o_escaped?
    214214nodetype: overlay-node
     
    230230
    231231: j-read-file-block  ( adr lblk# -- )
    232    >pblk#  ?dup  if               ( adr pblk# )
    233       u>d find-overlay?  if       ( adr d.pblk# node )
     232   >d.pblk#  if                   ( adr d.pblk# )
     233      find-overlay?  if           ( adr d.pblk# node )
    234234         nip nip                  ( adr node )
    235          tuck >o_pblock# l@       ( node adr pblk# )
    236          block over bsize move    ( node adr )
     235         tuck >o_pblock# 2@       ( node adr d.pblk# )
     236         d.block over bsize move  ( node adr )
    237237         swap >o_escaped? l@  if  ( adr )
    238238            jbd_magic swap be-l!  ( )
     
    241241         then                     ( )
    242242      else                        ( adr d.pblk# node )
    243          2drop                    ( adr pblk# )
    244          block swap bsize move    ( )
     243         drop                     ( adr d.pblk# )
     244         d.block swap bsize move  ( )
    245245      then                        ( )
    246246   else                           ( adr )
     
    253253   >r                               ( escaped? log-blk# d.block# r: node )
    254254   r@ >o_block# 2!                  ( escaped? log-blk# r: node )
    255    >pblk# r@ >o_pblock# l!          ( escaped? r: node )
     255   >d.pblk#  0= abort" EXT3/4 bad block number in journal"
     256                                    ( escaped? d.pblk# r: node )
     257   r@ >o_pblock# 2!                 ( escaped? r: node )
    256258   r> >o_escaped? l!                ( )
    257259;
Note: See TracChangeset for help on using the changeset viewer.