[openfirmware] [commit] r2796 - cpu/arm forth/kernel ofw/fs/ext2fs
repository service
svn at openfirmware.info
Tue Jan 3 01:54:24 CET 2012
Author: wmb
Date: Tue Jan 3 01:54:24 2012
New Revision: 2796
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2796
Log:
EXT2 file system - converted many internal routines to use 64-bit block numbers as a step toward ext4 support.
Modified:
cpu/arm/kerncode.fth
forth/kernel/double.fth
ofw/fs/ext2fs/bitmap.fth
ofw/fs/ext2fs/blocks.fth
ofw/fs/ext2fs/dir.fth
ofw/fs/ext2fs/inode.fth
ofw/fs/ext2fs/layout.fth
ofw/fs/ext2fs/methods.fth
ofw/fs/ext2fs/recovery.fth
ofw/fs/ext2fs/sb.fth
Modified: cpu/arm/kerncode.fth
==============================================================================
--- cpu/arm/kerncode.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ cpu/arm/kerncode.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -813,12 +813,24 @@
sbcs tos,r1,tos
mov tos,tos,asr #0
c;
+code d>= ( d1 d2 -- f )
+ ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2
+ subs r2,r2,r0
+ sbcs tos,r1,tos
+ mvn tos,tos,asr #0
+c;
code d> ( d1 d2 -- f )
ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2
subs r0,r0,r2
sbcs tos,tos,r1
mov tos,tos,asr #0
c;
+code d<= ( d1 d2 -- f )
+ ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2
+ subs r0,r0,r2
+ sbcs tos,tos,r1
+ mvn tos,tos,asr #0
+c;
code du< ( d1 d2 -- f )
ldmia sp!,{r0,r1,r2} \ tos r0 r1 r2
subs r2,r2,r0
@@ -863,6 +875,12 @@
mvneq tos,#0
movne tos,#0
c;
+code d0<> ( d -- f )
+ pop r0,sp
+ orrs r0,r0,tos
+ mvnne tos,#0
+ moveq tos,#0
+c;
code d0< ( d -- f )
inc sp,1cell
mov tos,tos,asr #0
Modified: forth/kernel/double.fth
==============================================================================
--- forth/kernel/double.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ forth/kernel/double.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -5,12 +5,15 @@
: 2literal ( d -- ) swap [compile] literal [compile] literal ; immediate
: d0= ( d -- flag ) or 0= ;
+: d0<> ( d -- flag ) or 0<> ;
: d0< ( d -- flag ) nip 0< ;
: d= ( d1 d2 -- flag ) d- d0= ;
: d<> ( d1 d2 -- flag ) d= 0= ;
: du< ( ud1 ud2 -- flag ) rot swap 2dup <> if 2swap then 2drop u< ;
: d< ( d1 d2 -- flag ) 2 pick over = if drop nip u< else nip < nip then ;
+: d>= ( d1 d2 -- flag ) d< 0= ;
: d> ( d1 d2 -- flag ) 2swap d< ;
+: d<= ( d1 d2 -- flag ) 2swap d< 0= ;
: dnegate ( d -- -d ) 0 0 2swap d- ;
: dabs ( d -- +d ) 2dup d0< if dnegate then ;
Modified: ofw/fs/ext2fs/bitmap.fth
==============================================================================
--- ofw/fs/ext2fs/bitmap.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/bitmap.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -8,18 +8,74 @@
0 instance value gd-modified?
: gd-update ( -- ) true to gd-modified? ;
-: block-bitmap ( group# -- block# ) group-desc le-l@ ;
-: inode-bitmap ( group# -- block# ) group-desc 4 + le-l@ ;
-: inode-table ( group# -- block# ) group-desc 8 + le-l@ ;
-: free-blocks ( group# -- n ) group-desc h# 0c + le-w@ ;
+: d.block-bitmap ( group# -- d.block# )
+ group-desc dup le-l@ ( adr n )
+ desc64? if ( adr n )
+ swap h# 20 + le-l@ ( d.block# )
+ else ( adr n )
+ nip u>d ( d.block# )
+ then ( d.block# )
+;
+: d.inode-bitmap ( group# -- d.block# )
+ group-desc dup 4 + le-l@ ( adr n )
+ desc64? if ( adr n )
+ swap h# 24 + le-l@ ( d.block# )
+ else ( adr n )
+ nip u>d ( d.block# )
+ then ( d.block# )
+;
+[ifdef] notdef
+: d.inode-table ( group# -- d.block# )
+ group-desc dup 8 + le-l@ ( adr n )
+ desc64? if ( adr n )
+ swap h# 28 + le-l@ ( d.block# )
+ else ( adr n )
+ nip u>d ( d.block# )
+ then ( d.block# )
+;
+[then]
+: free-blocks@ ( group# -- n )
+ group-desc dup h# 0c + le-w@ ( adr w )
+ desc64? if ( adr w )
+ swap h# 2c + le-w@ wljoin ( n )
+ else ( adr w )
+ nip ( n )
+ then ( n )
+;
+: free-blocks! ( n group# -- )
+ group-desc >r ( n r: adr )
+ desc64? if ( n r: adr )
+ lwsplit ( lo hi r: adr )
+ r@ h# 2c + le-w! ( lo r: adr )
+ then ( n r: adr )
+ r> h# 0c + le-w! ( )
+;
+
: free-blocks+! ( n group# -- )
- group-desc h# 0c +
- tuck le-w@ + 0 max swap le-w! gd-update
+ tuck free-blocks@ + 0 max ( group# n' )
+ swap free-blocks! ( )
+ gd-update ( )
+;
+: free-inodes@ ( group# -- n )
+ group-desc dup h# 0e + le-w@ ( adr lo )
+ desc64? if ( adr lo )
+ swap h# 2e + le-w@ wljoin ( n )
+ else ( adr lo )
+ nip ( n )
+ then ( n )
+;
+: free-inodes! ( n group# -- )
+ group-desc >r ( n r: adr )
+ desc64? if ( n r: adr )
+ lwsplit ( lo hi r: adr )
+ r@ h# 2e + le-w! ( lo r: adr )
+ then ( n r: adr )
+ r> h# 0e + le-w! ( )
;
-: free-inodes ( group# -- n ) group-desc h# 0e + le-w@ ;
: free-inodes+! ( n inode# -- )
- group-desc h# 0e +
- tuck le-w@ + swap le-w! gd-update
+ tuck free-inodes@ + ( group# n' )
+ swap free-inodes! ( )
+ gd-update ( )
;
[ifdef] 386-assembler
@@ -64,8 +120,8 @@
[then]
\ Find the first clear bit in a bitmap, set it if found
-: first-free ( len block# -- false | block#-in-group true )
- block swap ( map len )
+: d.first-free ( len d.block# -- false | block#-in-group true )
+ d.block swap ( map len )
2dup h# ff bskip dup 0= if ( map len 0 )
3drop false exit
@@ -88,42 +144,69 @@
swap
;
-: clear-bit? ( bit# block# -- cleared? )
- block bitup ( mask adr' )
+: d.clear-bit? ( bit# d.block# -- cleared? )
+ d.block bitup ( mask adr' )
tuck c@ ( adr mask byte )
2dup and 0= if \ Already free ( adr mask byte )
- 3drop false exit
+ 3drop false exit ( -- false )
then ( adr mask byte )
swap invert and ( adr byte' )
swap c! ( )
update ( )
- true
+ true ( true )
;
-: free-block ( block# -- )
- datablock0 - bpg /mod ( bit# group# )
- tuck block-bitmap ( group# bit# block# )
- clear-bit? if ( group# )
- 1 swap free-blocks+!
+: d.free-block ( d.block# -- )
+ datablock0 u>d d- bpg um/mod ( bit# group# )
+ tuck d.block-bitmap ( group# bit# d.block# )
+ d.clear-bit? if ( group# )
+ 1 swap free-blocks+! ( )
else ( group# )
- drop
- then
+ drop ( )
+ then ( )
;
+: n.free-block ( block# -- ) u>d d.free-block ;
-: alloc-block ( -- block# )
+: d.alloc-block ( -- d.block# )
+ #groups 0 ?do ( )
+ i free-blocks@ if ( )
+ bpg 3 rshift bsize min ( len ) \ XXX stay in this block
+ i d.block-bitmap ( len d.block# )
+ d.first-free if ( block#-in-group )
+ -1 i free-blocks+! ( block#-in-group )
+ u>d ( d.block#-in-group )
+ i bpg um* d+ ( d.block#-offset )
+ datablock0 u>d d+ ( d.block# )
+ 2dup d.buffer bsize erase update ( d.block# )
+ unloop exit ( -- d.block# )
+ else ( )
+ \ The allocation bitmap disagrees with the free block count,
+ \ so fix the free block count to prevent thrashing.
+ i free-blocks@ negate i free-blocks+!
+ then
+ then
+ loop
+ true abort" no free blocks found"
+;
+: u.alloc-block ( -- n.block# )
#groups 0 ?do ( )
- i free-blocks if ( )
+ i 1+ bpg um* datablock0 u>d d+ ( d.end-block# )
+ h# 1.0000.0000. d> abort" No free blocks found with 32-bit block number" ( )
+
+ i free-blocks@ if ( )
bpg 3 rshift bsize min ( len ) \ XXX stay in this block
- i block-bitmap ( len block# )
- first-free if ( block#-in-group )
+ i d.block-bitmap ( len d.block# )
+ d.first-free if ( block#-in-group )
-1 i free-blocks+! ( block#-in-group )
- i bpg * + datablock0 + ( block# )
- dup buffer bsize erase update ( block# )
- unloop exit
- else
+ u>d ( d.block#-in-group )
+ i bpg um* d+ ( d.block#-offset )
+ datablock0 u>d d+ ( d.block# )
+ 2dup d.buffer bsize erase update ( d.block# )
+ drop unloop exit ( -- n.block# )
+ else ( )
\ The allocation bitmap disagrees with the free block count,
\ so fix the free block count to prevent thrashing.
- i free-blocks negate i free-blocks+!
+ i free-blocks@ negate i free-blocks+!
then
then
loop
@@ -132,8 +215,8 @@
: free-inode ( inode# -- )
1- ipg /mod ( bit# group# )
- tuck inode-bitmap ( group# bit# block# )
- clear-bit? if ( group# )
+ tuck d.inode-bitmap ( group# bit# d.block# )
+ d.clear-bit? if ( group# )
1 swap free-inodes+!
else ( group# )
drop
@@ -143,8 +226,8 @@
: alloc-inode ( -- inode# )
#groups 0 ?do
ipg 3 rshift bsize min ( len ) \ XXX stay in this block
- i inode-bitmap ( len block# )
- first-free if ( inode#-in-group )
+ i d.inode-bitmap ( len d.block# )
+ d.first-free if ( inode#-in-group )
-1 i free-inodes+! ( inode#-in-group )
i ipg * + 1+ ( inode# )
dup inode /inode erase update ( inode# )
@@ -155,10 +238,10 @@
;
: update-sb ( -- )
- 0 #groups 0 ?do i free-inodes + loop total-free-inodes!
- 0 #groups 0 ?do i free-blocks + loop total-free-blocks!
+ 0 #groups 0 ?do i free-inodes@ + loop total-free-inodes!
+ 0. #groups 0 ?do i free-blocks@ u>d d+ loop d.total-free-blocks!
put-super-block abort" failed to update superblock "
- gds /gds gds-block# write-ublocks abort" failed to update group descriptors "
+ gds /gds d.gds-block# d.write-ublocks abort" failed to update group descriptors "
;
: update-gds ( -- )
@@ -169,23 +252,27 @@
\ the block bitmap number in the group descriptor. If it is larger than
\ the calculated block number, do the backup.
#groups 1 do
- i bpg * gds-fs-block# + ( possible-gn )
- dup i block-bitmap < if ( possible-gn )
- block ( gdn-adr )
- 0 group-desc ( gdn-adr gd0-adr )
- swap bsize move update ( )
- else ( possible-gn )
- drop ( )
- then ( )
+ i bpg * u>d d.gds-fs-block# d+ ( d.possible-gn )
+ 2dup i d.block-bitmap d< if ( d.possible-gn )
+ d.block ( gdn-adr )
+ 0 group-desc ( gdn-adr gd0-adr )
+ swap bsize move update ( )
+ else ( d.possible-gn )
+ 2drop ( )
+ then ( )
loop
false to gd-modified?
update-sb
then
;
-: add-block ( -- block# )
- #blks-held 2+ #blks-held!
- alloc-block
+: d.add-block ( -- d.block# )
+ d.#blks-held 2. d+ d.#blks-held!
+ d.alloc-block
+;
+: u.add-block ( -- block# )
+ d.#blks-held 2. d+ d.#blks-held!
+ u.alloc-block
;
\ LICENSE_BEGIN
Modified: ofw/fs/ext2fs/blocks.fth
==============================================================================
--- ofw/fs/ext2fs/blocks.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/blocks.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -13,7 +13,7 @@
struct \ buffer
/n field >dirty
- /n field >blk#
+ 2 /n * field >d.blk#
\ /n field >device
0 field >data
constant /buf-hdr
@@ -23,21 +23,21 @@
: >buffer ( n -- adr ) >bufadr >data ;
: dirty? ( n -- dirty? ) >bufadr >dirty @ ;
: dirty! ( dirty? n -- ) >bufadr >dirty ! ;
-: blk# ( n -- blk# ) >bufadr >blk# @ ;
-: blk#! ( blk# n -- ) >bufadr >blk# ! ;
+: d.blk# ( n -- d.blk# ) >bufadr >d.blk# 2@ ;
+: d.blk#! ( d.blk# n -- ) >bufadr >d.blk# 2! ;
create buf-table #bufs allot
-: read-fs-block ( adr fs-blk# -- error? )
- bsize swap logbsize lshift read-ublocks
+: d.read-fs-block ( adr d.fs-blk# -- error? )
+ bsize -rot logbsize dlshift d.read-ublocks
;
-: write-fs-block ( adr fs-blk# -- error? )
- bsize swap logbsize lshift write-ublocks
+: d.write-fs-block ( adr d.fs-blk# -- error? )
+ bsize -rot logbsize dlshift d.write-ublocks
;
: empty-buffers ( -- )
block-bufs /buffer #bufs * erase
- #bufs 0 do -1 i blk#! loop
+ #bufs 0 do -1. i d.blk#! loop
buf-table #bufs 0 ?do i 2dup + c! loop drop
;
@@ -65,46 +65,46 @@
: flush-buffer ( buffer# -- )
dup dirty? if ( buffer# )
false over dirty!
- dup >buffer swap blk# ( buffer-adr block# )
- dup gds-fs-block# <= if
- dup . ." attempt to corrupt superblock or group descriptor" abort
- then
- bbug? if ." W " dup . cr then
- write-fs-block abort" write error "
+ dup >buffer swap d.blk# ( buffer-adr d.block# )
+ 2dup d.gds-fs-block# d<= if ( buffer-adr d.block# )
+ 2dup d. ." attempt to corrupt superblock or group descriptor" abort
+ then ( buffer-adr d.block# )
+ bbug? if ." W " 2dup d. cr then ( buffer-adr d.block# )
+ d.write-fs-block abort" write error "
else
drop
then
;
: flush ( -- ) #bufs 0 ?do i flush-buffer loop ;
-: (buffer) ( block# -- buffer-adr in-buf? )
+: d.(buffer) ( d.block# -- buffer-adr in-buf? )
\ is the block already in a buffer?
- 0
- begin ( block# buf# )
- 2dup blk# = if \ found it
- nip dup mru! >buffer true exit
- then
-
- 1+ dup #bufs =
- until drop \ not found ( block# )
+ #bufs 0 ?do ( d.block# )
+ 2dup i d.blk# d= if \ found it ( d.block# )
+ 2drop i mru! ( )
+ i >buffer true unloop exit ( -- buffer-adr true )
+ then ( d.block# )
+ loop ( d.block# )
\ free up the least-recently-used buffer
- lru dup flush-buffer ( block# buf# )
+ lru dup flush-buffer ( d.block# buf# )
- tuck blk#! >buffer false ( buffer-adr )
+ dup >r d.blk#! ( r: buf# )
+ r> >buffer false ( buffer-adr false )
;
-: buffer ( block# -- a ) \ like block, but does no reads
- (buffer) drop
+: d.buffer ( d.block# -- a ) \ like block, but does no reads
+ d.(buffer) drop
;
-: block ( block# -- a )
- dup (buffer) if nip exit then ( block# buffer-adr )
-
- bbug? if ." r " over . cr then
- dup rot read-fs-block abort" read error " ( buffer-adr )
+: d.block ( d.block# -- a )
+ 2dup d.(buffer) if nip nip exit then ( d.block# buffer-adr )
+
+ bbug? if ." r " 2 pick over d. cr then ( d.block# buffer-adr )
+ dup 2swap d.read-fs-block abort" read error " ( buffer-adr )
;
+: block ( block# -- a ) u>d d.block ;
-: bd ( n -- ) block bsize dump ;
+: d.bd ( d -- ) d.block bsize dump ;
\ LICENSE_BEGIN
\ Copyright (c) 2006 FirmWorks
Modified: ofw/fs/ext2fs/dir.fth
==============================================================================
--- ofw/fs/ext2fs/dir.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/dir.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -192,9 +192,9 @@
: idelete ( -- )
\ Short symlinks hold no blocks, but have a string in the direct block list,
\ so we must not interpret that string as a block list.
- #blks-held if delete-blocks then
+ d.#blks-held d0<> if delete-blocks then
- \ clear #blks-held, link-count, etc.
+ \ clear d.#blks-held, link-count, etc.
0 +i /inode 6 /l* /string erase
\ delete inode, and set its deletion time.
@@ -257,8 +257,8 @@
;
: linkpath ( -- a )
- file-acl if bsize 9 rshift else 0 then ( #acl-blocks )
- #blks-held <> if \ long symbolic link path
+ d.file-acl d0<> if bsize 9 rshift else 0 then ( #acl-blocks )
+ u>d d.#blks-held d<> if \ long symbolic link path
direct0 int@ block
else \ short symbolic link path
direct0
Modified: ofw/fs/ext2fs/inode.fth
==============================================================================
--- ofw/fs/ext2fs/inode.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/inode.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -7,15 +7,14 @@
: set-inode ( inode# -- ) to inode# ;
: ipb ( -- n ) bsize /inode / ;
-: itob ( i# -- offset block# )
+: d.itob ( i# -- offset d.block# )
1- ipg /mod ( rel-i# group )
- gpimin swap ( block# rel-i# )
- ipb /mod ( gp-block# offset rel-blk# )
- blkstofrags
- rot + ( offset block# )
+ d.gpimin 2>r ( rel-i# r: d.iblock# )
+ ipb /mod ( offset rel-blk# r: d.iblock# )
+ u>d 2r> d+ ( offset d.block# )
;
-: inode ( i# -- adr ) itob block swap /inode * + ;
+: inode ( i# -- adr ) d.itob d.block swap /inode * + ;
: ind ( n -- ) inode /inode dump ;
: +i ( n -- ) inode# inode + ;
: file-attr ( -- attributes ) 0 +i short@ ;
@@ -37,10 +36,36 @@
: gid! ( gid -- ) 24 +i short! update ;
: link-count ( -- n ) 26 +i short@ ;
: link-count! ( n -- ) 26 +i short! update ;
-: #blks-held ( -- n ) 28 +i int@ ;
-: #blks-held! ( n -- ) 28 +i int! update ;
-: file-acl ( -- n ) 104 +i int@ ;
-: dir-acl ( -- n ) 108 +i int@ ;
+
+: d.#blks-held ( -- d )
+ 28 +i int@ ( n )
+ \ Should be contingent on sb-huge-files? as below, but the field
+ \ at 116 was reserved before, so it's going to be 0 without huge files
+ 116 +i short@ ( d )
+\ sb-huge-files? if 116 +i short@ else u>d then ( d )
+[ifdef] inode-huge?
+ \ I'm not supporting the representation where the inode block
+ \ count is in file system blocks instead of 512-byte blocks,
+ \ because I can't figure out how it works in the Linux kernel.
+ \ I can see how it works when updating an inode, but I don't
+ \ see how it works with an already-created file.
+ inode-huge? if logbsize 9 - dlshift then ( d' )
+[then]
+;
+
+: d.#blks-held! ( d -- )
+[ifdef] inode-huge?
+ 2dup h# 1.0000.0000.0000. d>= if ( d )
+ logbsize 9 - drshift ( d' )
+ set-inode-huge ( d )
+ else ( d )
+ clear-inode-huge ( d )
+ then ( d )
+[then]
+ 116 +i short! 28 +i int! update ( )
+;
+: d.file-acl ( -- d ) 104 +i int@ 118 +i short@ ;
+\ : dir-acl ( -- n ) 108 +i int@ ;
d# 12 constant #direct-blocks
: direct0 ( -- adr ) 40 +i ;
Modified: ofw/fs/ext2fs/layout.fth
==============================================================================
--- ofw/fs/ext2fs/layout.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/layout.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -77,7 +77,7 @@
dup if ( index block# )
nip
else
- drop add-block ( index new-block# )
+ drop u.add-block ( index new-block# )
dup rot r@ block swap la+ int! update ( new-block# )
then ( block# )
r> drop
@@ -89,7 +89,7 @@
dup if ( index-low index-high block# )
nip
else
- drop add-block ( index-low index-high new-block# )
+ drop u.add-block ( index-low index-high new-block# )
dup rot r@ block swap la+ int! update ( index-low new-block# )
then ( index-low block# )
get-ind1 ( adr )
@@ -102,7 +102,7 @@
dup if ( index-low index-high block# )
nip
else
- drop add-block ( index-low index-high new-block# )
+ drop u.add-block ( index-low index-high new-block# )
dup rot r@ block swap la+ int! update ( index-low new-block# )
then ( index-low block# )
get-ind2 ( adr )
@@ -114,13 +114,13 @@
dup #direct-blocks < if ( lblk# )
dup get-direct ?dup if nip exit then ( lblk# )
- add-block dup rot >direct int! update exit
+ u.add-block dup rot >direct int! update exit
then ( lblk# )
#direct-blocks - ( lblk#' )
dup #ind-blocks1 < if ( lblk# )
#direct-blocks get-direct ?dup 0= if ( lblk# )
- add-block dup #direct-blocks put-direct
+ u.add-block dup #direct-blocks put-direct
then ( lblk# block )
get-ind1 exit
then
@@ -128,7 +128,7 @@
dup #ind-blocks2 < if
#direct-blocks 1+ get-direct ?dup 0= if
- add-block dup #direct-blocks 1+ put-direct
+ u.add-block dup #direct-blocks 1+ put-direct
then ( lblk# block )
get-ind2 exit
then
@@ -136,7 +136,7 @@
dup #ind-blocks3 < if
#direct-blocks 2+ get-direct ?dup 0= if
- add-block dup #direct-blocks 2+ put-direct
+ u.add-block dup #direct-blocks 2+ put-direct
then ( lblk# block )
get-ind3 exit
then
@@ -147,10 +147,10 @@
\ deletes
\ this code is a bit tricky, in that after deleting a block,
-\ you must update the block which pointed to it.
+\ you must update the block that pointed to it.
: del-blk0 ( a -- deleted? )
- int@ dup 0= if exit then free-block true
+ int@ dup 0= if exit then n.free-block true
;
: del-blk1 ( a -- deleted? )
int@ dup 0= if exit then ( blk# )
@@ -158,7 +158,7 @@
bsize 0 do ( blk# )
dup block i + del-blk0 if 0 over block i + int! update then
4 +loop ( blk# )
- free-block true
+ n.free-block true
;
: del-blk2 ( a -- deleted? )
int@ dup 0= if exit then ( blk# )
@@ -166,7 +166,7 @@
bsize 0 do ( blk# )
dup block i + del-blk1 if 0 over block i + int! update then
4 +loop ( blk# )
- free-block true
+ n.free-block true
;
: del-blk3 ( a -- deleted? )
int@ dup 0= if exit then ( blk# )
@@ -174,7 +174,7 @@
bsize 0 do ( blk# )
dup block i + del-blk2 if 0 over block i + int! update then
4 +loop ( blk# )
- free-block true
+ n.free-block true
;
: delete-directs ( -- )
#direct-blocks 0 do
@@ -189,7 +189,7 @@
;
: append-block ( -- )
- add-block ( block )
+ u.add-block ( block )
dfile-size bsize um/mod nip dup bsize um* dfile-size! ( block #blocks )
1+ >pblk int! update
;
@@ -228,7 +228,7 @@
then
/gds do-alloc is gds
- gds /gds gds-block# read-ublocks dup if
+ gds /gds d.gds-block# d.read-ublocks dup if
gds /gds do-free
super-block /super-block do-free exit
then
Modified: ofw/fs/ext2fs/methods.fth
==============================================================================
--- ofw/fs/ext2fs/methods.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/methods.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -7,7 +7,7 @@
external
-: free-bytes ( -- d ) total-free-blocks bsize um* ;
+: free-bytes ( -- d ) d.total-free-blocks bsize du* ;
: $create ( name$ -- error? )
o# 100666 ($create)
@@ -18,10 +18,10 @@
dirent-inode@ set-inode
- add-block ( block# )
- dfile-size h# 400. d+ dfile-size! ( block# )
- dup direct0 int! update ( block# )
- block bsize erase update \ flush ( )
+ u.add-block ( u.block# )
+ dfile-size h# 400. d+ dfile-size! ( u.block# )
+ dup direct0 int! update ( u.block# )
+ u>d d.block bsize erase update \ flush ( )
inode# first-dirent if true exit then ( )
" ." bsize inode# fill-dirent ( )
" .." wd-inum new-dirent ( error? )
Modified: ofw/fs/ext2fs/recovery.fth
==============================================================================
--- ofw/fs/ext2fs/recovery.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/recovery.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -132,7 +132,7 @@
;
: write-jblock ( d.block# adr -- )
- -rot drop write-fs-block ( error? )
+ -rot d.write-fs-block ( error? )
if ." Journal recovery write error" cr abort then
;
Modified: ofw/fs/ext2fs/sb.fth
==============================================================================
--- ofw/fs/ext2fs/sb.fth Sat Dec 31 23:25:58 2011 (r2795)
+++ ofw/fs/ext2fs/sb.fth Tue Jan 3 01:54:24 2012 (r2796)
@@ -36,17 +36,17 @@
\ /block if 1024 6 +sbl lshift to /block then /block
\ ;
-: ceiling ( nom div -- n ) /mod swap if 1+ then ;
+: ceiling ( nom div -- n ) ;
\ : total-inodes ( -- n ) 0 +sbl ;
-: total-blocks ( -- n ) 1 +sbl ;
-: total-free-blocks ( -- n ) 3 +sbl ;
+: d.total-blocks ( -- d ) 1 +sbl 84 +sbl ;
+: d.total-free-blocks ( -- d ) 3 +sbl 86 +sbl ;
\ : total-free-inodes ( -- n ) 4 +sbl ;
\ : total-free-blocks+! ( -- n ) 3 +sbl + super-block 3 la+ int! ;
\ : total-free-inodes+! ( -- n ) 4 +sbl + super-block 4 la+ int! ;
-: total-free-blocks! ( -- n ) super-block 3 la+ int! ;
+: d.total-free-blocks! ( d -- ) super-block tuck 86 la+ int! 3 la+ int! ;
: total-free-inodes! ( -- n ) super-block 4 la+ int! ;
-: #groups ( -- n ) total-blocks bpg ceiling ;
+: #groups ( -- n ) d.total-blocks bpg um/mod swap if 1+ then ;
: recover? ( -- flag ) 24 +sbl 4 and 0<> ;
@@ -64,21 +64,21 @@
\ Used to set partition-offset but now unnecessary as parent handles it
;
-: write-ublocks ( adr len dev-block# -- error? )
- ublock um* " seek" $call-parent ?dup if exit then ( adr len )
+: d.write-ublocks ( adr len d.dev-block# -- error? )
+ ublock du* " seek" $call-parent ?dup if exit then ( adr len )
tuck " write" $call-parent <>
;
: put-super-block ( -- error? )
- super-block /super-block super-block# write-ublocks
+ super-block /super-block super-block# u>d d.write-ublocks
;
-: read-ublocks ( adr len dev-block# -- error? )
- ublock um* " seek" $call-parent ?dup if exit then ( adr len )
+: d.read-ublocks ( adr len dev-block# -- error? )
+ ublock du* " seek" $call-parent ?dup if exit then ( adr len )
tuck " read" $call-parent <>
;
: get-super-block ( -- error? )
- super-block /super-block super-block# read-ublocks ?dup if exit then
+ super-block /super-block super-block# u>d d.read-ublocks ?dup if exit then
['] le-l@ to int@ ['] le-w@ to short@
['] le-l! to int! ['] le-w! to short!
@@ -89,16 +89,20 @@
magic fs-magic <>
;
-: gds-fs-block# ( -- fs-block# )
- datablock0 1+ ( logical-block# )
+: d.gds-fs-block# ( -- d.fs-block# )
+ datablock0 1+ u>d ( d.logical-block# )
;
-: gds-block# ( -- dev-block# )
- gds-fs-block# bsize ublock / * ( dev-block# )
+: d.gds-block# ( -- d.dev-block# )
+ d.gds-fs-block# bsize ublock / du* ( dev-block# )
+;
+: desc64? ( -- flag ) h# 7f +sbw 0<> ;
+: /gd ( -- n ) h# 7f +sbw ?dup 0= if h# 20 then ;
+: /gds ( -- size ) #groups /gd * ublock round-up ;
+: group-desc ( group# -- adr ) /gd * gds + ;
+: d.gpimin ( group -- d.block# )
+ group-desc dup 2 la+ int@ ( adr block# )
+ desc64? if swap 9 la+ int@ else nip 0 then ( d.block# )
;
-: /gds ( -- size ) #groups h# 20 * ublock round-up ;
-: group-desc ( group# -- adr ) h# 20 * gds + ;
-: gpimin ( group -- block# ) group-desc 2 la+ int@ ;
-: blkstofrags ( #blocks -- #frags ) ; \ XXX is this needed?
\ LICENSE_BEGIN
More information about the openfirmware
mailing list