3 which mdadm >/dev/null 2>&1 && mdadm -Q $device | grep -qF -- "--examine"
17 echo "# $device: RAID detected" 1>&2
19 mddevice="`mdadm -Q $device | sed -ne 's/.*\(raid[0-9] \/dev\/[^.]*\).*/\1/' -eT -ep`"
21 if [ -z "$mddevice" ]; then
22 echo "! raid master device for raid componentn device $device not found" 1>&2
26 mdlevel="${mddevice% *}"
27 mddevice="${mddevice#* }"
29 echo "device $mddevice md"
30 echo "raidlevel $mdlevel"
34 raid5) do_raid_raid5 $mddevice ;;
36 echo "! unsopported raid level $mdlevel" 1>&2
47 raid5_leftsymmetric_calc()
50 local drive="$2" # range 0..$ndrives-1
55 # block = chunk / ndrives
56 # blockrow = chunk % ndrives
57 # if blockrow == ndrives-drive-1:
60 # if drive > ndrives-blockrow-1:
61 # blockrow = blockrow - 1
62 # return block*ndrives*(ndrives-1) + blockrow*ndrives + drive
64 dc -e "$chunk $ndrives ~ d $ndrives $drive - 1 - [q]sa=a" \
65 -e "d $ndrives r - 1 - $drive [1-]sa<a" \
66 -e "$ndrives * $drive + r $ndrives * $ndrives 1 - * + p"
80 mdlayout="`mdadm -D $mddevice | awk '/Layout :/{print $3}'`"
81 echo "raidlayout $mdlayout"
83 left-symmetric) mdcalc="raid5_leftsymmetric_calc" ;;
85 echo "! unsopported raid layout $mdlayout" 1>&2
90 mdchunksize="`mdadm -D $mddevice | awk '/Chunk Size :/{print $4}'`"
91 mdchunksize="`dc -e "${mdchunksize%K} 2 * p"`"
92 mddrives="`mdadm -D $mddevice | awk '/Raid Devices :/{print $4}'`"
93 mddrive="`mdadm -D $mddevice | awk "/${device##*/}"'$/{print $4}'`"
95 echo "raiddrives $mddrives"
96 echo "raiddrive $mddrive"
97 echo "chunksize $mdchunksize"
99 chunk="`dc -e "$sector $mdchunksize ~ n [ ] n p"`"
100 subsector="${chunk% *}"
104 echo "subsector $subsector"
106 mdchunk="`$mdcalc $mddrives $mddrive $chunk`"
107 if [ -z "$mdchunk" ]; then
108 echo "chunktype parity"
109 echo "! no parity chunk support"
113 echo "chunktype data"
114 echo "raidchunk $mdchunk"
116 sector="`dc -e "$mdchunk $mdchunksize * $subsector + p"`"
119 register_mapper "raid"