[openfirmware] [commit] r2645 - ofw/fs/ext2fs
repository service
svn at openfirmware.info
Sun Oct 23 01:36:33 CEST 2011
Author: wmb
Date: Sun Oct 23 01:36:33 2011
New Revision: 2645
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2645
Log:
ext2/3 file system - added ext3 journal recovery.
Modified:
ofw/fs/ext2fs/ext2fs.fth
ofw/fs/ext2fs/ext2test.sh
ofw/fs/ext2fs/layout.fth
ofw/fs/ext2fs/methods.fth
ofw/fs/ext2fs/recovery.fth
ofw/fs/ext2fs/sb.fth
Modified: ofw/fs/ext2fs/ext2fs.fth
==============================================================================
--- ofw/fs/ext2fs/ext2fs.fth Sat Oct 22 12:40:13 2011 (r2644)
+++ ofw/fs/ext2fs/ext2fs.fth Sun Oct 23 01:36:33 2011 (r2645)
@@ -10,7 +10,9 @@
fload ${BP}/ofw/fs/ext2fs/bitmap.fth
fload ${BP}/ofw/fs/ext2fs/layout.fth
fload ${BP}/ofw/fs/ext2fs/dir.fth
+fload ${BP}/ofw/fs/ext2fs/recovery.fth
fload ${BP}/ofw/fs/ext2fs/methods.fth
+
\ LICENSE_BEGIN
\ Copyright (c) 2006 FirmWorks
\
Modified: ofw/fs/ext2fs/ext2test.sh
==============================================================================
--- ofw/fs/ext2fs/ext2test.sh Sat Oct 22 12:40:13 2011 (r2644)
+++ ofw/fs/ext2fs/ext2test.sh Sun Oct 23 01:36:33 2011 (r2645)
@@ -63,10 +63,11 @@
if [ ! -b "${DEVICE}" ]; then
echo REMAKING FILE
rm -f "${DEVICE}"
-dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=8388000 2> /dev/null #8388608
+# dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=8388000 2> /dev/null #8388608
# dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=4194303 2> /dev/null
-#dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=2097151 2> /dev/null
-#dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=1050000 2> /dev/null
+# dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=2097151 2> /dev/null
+# dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=1050000 2> /dev/null
+dd if=/dev/zero of=${DEVICE} bs=512 count=1 seek=10000 2> /dev/null # 5 MiB
chmod 666 ${DEVICE}
fi
# if [ ! -b "${DEVICE}" -a ! -f "${DEVICE}" ]; then
@@ -123,7 +124,7 @@
echo -n "make filesystem ... "
#/sbin/mke2fs -n -b 4096 -q ${PARTITION}
# /sbin/mke2fs -n -j -O dir_index,^huge_file -E resize=8G -m 1 -b 4096 -q ${PARTITION}
-/sbin/mke2fs -n -j -O dir_index -m 1 -b 1024 -q ${PARTITION}
+/sbin/mke2fs -j -O dir_index -m 1 -b 1024 -q ${PARTITION}
echo "made"
# we occasionally get
@@ -133,12 +134,12 @@
until mount ${PARTITION} /mnt; do sleep 0.1; done
echo "mounted"
-echo -n "create test content and unmount ... "
+echo "create test content"
mkdir /mnt/boot
cp ext2test.fth /mnt/boot/olpc.fth
-cd /mnt
+pushd /mnt
touch touched
echo hello > hello
echo hello world > hello-world
@@ -151,11 +152,23 @@
echo hello world down here > directory/hw
mkfifo fifo
mknod node b 1 1
-cd
+popd
+
+if [ ! -b ${DEVICE} ] ; then
+ echo -n "save dirty journal ..."
+ sleep 10
+ cp ${DEVICE} ${DEVICE}.dirty
+fi
+
+echo -n "unmount ... "
umount /mnt
+sync
if [ ! -b ${DEVICE} ] ; then
/sbin/losetup -d ${PARTITION}
+ sync
+ mv ${DEVICE} ${DEVICE}.clean
+ cp ${DEVICE}.dirty ${DEVICE}.test
fi
echo "finished"
Modified: ofw/fs/ext2fs/layout.fth
==============================================================================
--- ofw/fs/ext2fs/layout.fth Sat Oct 22 12:40:13 2011 (r2644)
+++ ofw/fs/ext2fs/layout.fth Sun Oct 23 01:36:33 2011 (r2645)
@@ -211,7 +211,8 @@
else \ find or allocate physical block
get-pblk# ( adr pblk# )
then
- dup h# f8 < if dup . ." attempt to destroy file system" cr abort then
+\ This interferes with journal recovery
+\ dup h# f8 < if dup . ." attempt to destroy file system" cr abort then
block bsize move update
;
Modified: ofw/fs/ext2fs/methods.fth
==============================================================================
--- ofw/fs/ext2fs/methods.fth Sat Oct 22 12:40:13 2011 (r2644)
+++ ofw/fs/ext2fs/methods.fth Sun Oct 23 01:36:33 2011 (r2645)
@@ -216,6 +216,8 @@
my-args " <NoFile>" $= if true exit then
+ recover? if process-journal then
+
\ Start out in the root directory
set-root
Modified: ofw/fs/ext2fs/recovery.fth
==============================================================================
--- ofw/fs/ext2fs/recovery.fth Sat Oct 22 12:40:13 2011 (r2644)
+++ ofw/fs/ext2fs/recovery.fth Sun Oct 23 01:36:33 2011 (r2645)
@@ -6,6 +6,21 @@
/l field >h_sequence
constant /journal-header
+\ Superblock - blocktype 3 (version 1) or 4 (version 2)
+/journal-header
+ /l field >s_blocksize
+ /l field >s_maxlen
+ /l field >s_first
+ /l field >s_sequence
+ /l field >s_start
+ /l field >s_errno
+ /l field >s_feature_compat
+ /l field >s_feature_incompat
+ /l field >s_feature_ro_compat
+ \ We don't need the rest
+drop
+
+\ Commit header - blocktype 2
/journal-header
/c field >h_chksum_type
/c field >h_chksum_size
@@ -15,10 +30,13 @@
/l field >h_commit_nsec
constant /commit-header
+\ Revoke header - blocktype 5
/journal-header
/l field >r_count
constant /revoke-header
+\ Descriptor block - blocktype 1 - journal header followed by an array of tags
+\ Tag - 32-bit and 64-bit forms
struct
/l field >t_blocknr
/l field >t_flags
@@ -26,19 +44,6 @@
/l field >t_blocknr_high
constant /tag64
-/journal-header
- /l field >s_blocksize
- /l field >s_maxlen
- /l field >s_first
- /l field >s_sequence
- /l field >s_start
- /l field >s_errno
- /l field >s_feature_compat
- /l field >s_feature_incompat
- /l field >s_feature_ro_compat
- \ We don't need the rest
-drop
-
0 value j-buf
0 value j-compat
0 value j-incompat
@@ -72,7 +77,7 @@
then
jsb >s_start be-l@ to j-start
- jsb 0= if
+ j-start 0= if
free-journal true exit ( -- skip? )
then
@@ -333,6 +338,7 @@
then
;
: commit-journal ( -- )
+ jsb >s_sequence dup be-l@ 1+ swap be-l!
0 jsb >s_start be-l!
jsb 0 write-file-block
flush
@@ -340,6 +346,8 @@
: process-journal ( -- )
read-journal if exit then
+." Recovering from journal ... "
+
0 ['] one-pass catch if
." Journal scan failed" cr
free-journal exit
@@ -357,6 +365,7 @@
free-revoke-list
- \ commit-journal
+ commit-journal
free-journal
+cr
;
Modified: ofw/fs/ext2fs/sb.fth
==============================================================================
--- ofw/fs/ext2fs/sb.fth Sat Oct 22 12:40:13 2011 (r2644)
+++ ofw/fs/ext2fs/sb.fth Sun Oct 23 01:36:33 2011 (r2645)
@@ -48,10 +48,10 @@
: total-free-inodes! ( -- n ) super-block 4 la+ int! ;
: #groups ( -- n ) total-blocks bpg ceiling ;
+: recover? ( -- flag ) 24 +sbl 4 and 0<> ;
+
\ Don't write to a disk that uses extensions we don't understand
: unknown-extensions? ( -- unsafe? )
- 24 +sbl 4 and if ." ext3 journal needs recovery" cr then
-
23 +sbl h# ffffffff invert and \ Accept all compat extensions
24 +sbl h# 00000002 invert and or \ Incompatible - accept FILETYPE
25 +sbl h# 00000003 invert and or \ RO - accept SPARSE_SUPER and LARGE_FILE
More information about the openfirmware
mailing list