cccf7f77f9c275dea48fb88e901ba1c0789cba83
[mapsector.git] / lib / 50_scan_extfs.sh
1 detect_extfs()
2 {
3     which tune2fs >/dev/null 2>&1 && tune2fs -l $device >/dev/null 2>&1
4 }
5
6 describe_extfs()
7 {
8     echo "    ext2-4"
9 }
10
11 scan_extfs()
12 {
13     local fsblocksize
14     local fsblock
15     local fssubsector
16     local fstype
17     local inode
18
19     fstype="`file -s $device | sed -e 's/.*\(ext[0-9]\).*/\1/'`"
20     echo "fstype $fstype"
21
22     # Step 6: Get filesystem blocksize and convert sector number to filesystem block number
23
24     fsblocksize="`tune2fs -l $device | awk '/Block size/{print $3/512}'`"
25
26     if [ -z "$fsblocksize" ]; then
27         echo "! $device is not ext2/ext3" 1>&2
28         exit 1
29     fi
30
31     fsblock="`dc -e "$sector $fsblocksize ~ n [ ] n p"`" #`"
32     fssubsector="${fsblock% *}"
33     fsblock="${fsblock#* }"
34
35     echo "blocksize $fsblocksize"
36     echo "block $fsblock"
37     echo "subsector $fssubsector"
38
39     # Step 7: Check, whether block is in use
40
41     if echo "testb $fsblock" | debugfs $device 2>/dev/null | grep -qF "not in use"; then
42         echo "blockstate free"
43         exit 0
44     fi
45     echo "blockstate used"
46
47     # Step 8: Find inode, to which the block belongs
48
49     inode="`echo "icheck $fsblock" | debugfs $device 2>/dev/null | awk 'FNR>1{print $2}'`" #`"
50
51     if [ -z "$inode" ]; then
52         echo "blocktype meta?"
53         exit 0
54     fi
55
56     echo "inode $inode"
57
58     # Step 9: Find file name(s) referencing the inode
59
60     (
61         namefound="$(\
62             echo "ncheck $inode" \
63                 | debugfs $device 2>/dev/null \
64                 | sed -e '1d' -e 's/^[0-9]*[    ]*//' -e 's/^\/\//\//' \
65                 | while read name; do \
66                 if [ -z "$firstname" ]; then \
67                     echo "blocktype data" 1>&3; \
68                     echo "1"; \
69                     firstname=1; \
70                 fi; \
71                 echo "name $name" 1>&3; \
72             done \
73         )"
74         if [ -z "$namefound" ]; then
75             echo "blocktype journal?"
76         fi
77     ) 3>&1
78 }
79
80 register_scanner "extfs"