Changeset 2798


Ignore:
Timestamp:
Jan 4, 2012, 9:51:42 AM (3 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.