aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@ozlabs.ru>2019-12-30 13:58:35 +1100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2020-02-21 14:03:07 +1100
commit8bce323185e253a91b9e62b5b748b8c46e232357 (patch)
tree32eaaa90ed2aed2f47b6954f622d1f69f2b79cd8
parent12b5d02e378a204c986b52d56b4ca8a0dab6ba21 (diff)
downloadSLOF-8bce323185e253a91b9e62b5b748b8c46e232357.zip
SLOF-8bce323185e253a91b9e62b5b748b8c46e232357.tar.gz
SLOF-8bce323185e253a91b9e62b5b748b8c46e232357.tar.bz2
ext2: Prepare for extending
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
-rw-r--r--slof/fs/packages/ext2-files.fs43
1 files changed, 29 insertions, 14 deletions
diff --git a/slof/fs/packages/ext2-files.fs b/slof/fs/packages/ext2-files.fs
index 262c64a..392615d 100644
--- a/slof/fs/packages/ext2-files.fs
+++ b/slof/fs/packages/ext2-files.fs
@@ -39,9 +39,9 @@ INSTANCE VARIABLE dindirect-block
INSTANCE VARIABLE inode
INSTANCE VARIABLE file-len
-INSTANCE VARIABLE blocks
+INSTANCE VARIABLE blocks \ data from disk blocks
INSTANCE VARIABLE #blocks
-INSTANCE VARIABLE ^blocks
+INSTANCE VARIABLE ^blocks \ current pointer in blocks
INSTANCE VARIABLE #blocks-left
: blocks-read ( n -- ) dup negate #blocks-left +! 4 * ^blocks +! ;
: read-indirect-blocks ( indirect-block# -- )
@@ -73,20 +73,27 @@ INSTANCE VARIABLE #blocks-left
drop \ drop 0, the invalid block number
;
+: inode-i-block ( inode -- block ) 28 + ;
+
+\ Reads block numbers into blocks
: read-block#s ( -- )
- blocks @ ?dup IF #blocks @ 4 * free-mem THEN
- inode @ 4 + l@-le file-len !
- file-len @ block-size @ // #blocks !
- #blocks @ 4 * alloc-mem blocks !
+ blocks @ ?dup IF #blocks @ 4 * free-mem THEN \ free blocks if allocated
+ inode @ 4 + l@-le file-len ! \ *file-len = i_size_lo
+ file-len @ block-size @ // #blocks ! \ *#blocks = roundup(file-len/block-size)
+ #blocks @ 4 * alloc-mem blocks ! \ *blocks = allocmem(*#blocks)
blocks @ ^blocks ! #blocks @ #blocks-left !
#blocks-left @ c min \ # direct blocks
- inode @ 28 + over 4 * ^blocks @ swap move blocks-read
+ inode @ inode-i-block over 4 * ^blocks @ swap move blocks-read
#blocks-left @ IF inode @ 58 + l@-le read-indirect-blocks THEN
#blocks-left @ IF inode @ 5c + l@-le read-double-indirect-blocks THEN
- #blocks-left @ IF inode @ 60 + l@-le read-triple-indirect-blocks THEN ;
+ #blocks-left @ IF inode @ 60 + l@-le read-triple-indirect-blocks THEN
+;
+
: read-inode ( inode# -- )
- 1- inodes/group @ u/mod \ # in group, group #
- 20 * group-descriptors @ + 8 + l@-le block-size @ * \ # in group, inode table
+ 1- inodes/group @ u/mod
+ 20 * group-descriptors @ +
+ 8 + l@-le \ reads bg_inode_table_lo
+ block-size @ * \ # in group, inode table
swap inode-size @ * + xlsplit seek drop inode @ inode-size @ read drop
;
@@ -153,17 +160,25 @@ INSTANCE VARIABLE current-pos
: read-dir ( inode# -- adr )
read-inode read-block#s file-len @ alloc-mem
0 0 seek ABORT" ext2-files read-dir: seek failed"
- dup file-len @ read file-len @ <> ABORT" ext2-files read-dir: read failed" ;
+ dup file-len @ read file-len @ <> ABORT" ext2-files read-dir: read failed"
+;
+
: .dir ( inode# -- )
read-dir dup BEGIN 2dup file-len @ - > over l@-le tuck and WHILE
cr dup 8 0.r space read-inode .inode space space dup .name
- dup 4 + w@-le + REPEAT 2drop file-len @ free-mem ;
+ dup 4 + w@-le + REPEAT 2drop file-len @ free-mem
+;
+
: (find-file) ( adr name len -- inode#|0 )
2>r dup BEGIN 2dup file-len @ - > over l@-le and WHILE
dup 8 + over 6 + c@ 2r@ str= IF 2r> 2drop nip l@-le EXIT THEN
- dup 4 + w@-le + REPEAT 2drop 2r> 2drop 0 ;
+ dup 4 + w@-le + REPEAT 2drop 2r> 2drop 0
+;
+
: find-file ( inode# name len -- inode#|0 )
- 2>r read-dir dup 2r> (find-file) swap file-len @ free-mem ;
+ 2>r read-dir dup 2r> (find-file) swap file-len @ free-mem
+;
+
: find-path ( inode# name len -- inode#|0 )
dup 0= IF 3drop 0 ." empty name " EXIT THEN
over c@ [char] \ = IF 1 /string ." slash " RECURSE EXIT THEN