]> git.ipfire.org Git - thirdparty/dracut.git/blob - modules.d/80cms/cmssetup.sh
37fd84ee3275483715b73ddc630052cd6320f021
[thirdparty/dracut.git] / modules.d / 80cms / cmssetup.sh
1 #!/bin/bash
2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
4
5 type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
6
7 function sysecho () {
8 file="$1"
9 shift
10 local i=1
11 while [ $i -le 10 ] ; do
12 if [ ! -f "$file" ]; then
13 sleep 1
14 i=$((i+1))
15 else
16 break
17 fi
18 done
19 local status
20 read status < "$file"
21 if [[ ! $status == $* ]]; then
22 [ -f "$file" ] && echo $* > "$file"
23 fi
24 }
25
26 function dasd_settle() {
27 local dasd_status=/sys/bus/ccw/devices/$1/status
28 if [ ! -f $dasd_status ]; then
29 return 1
30 fi
31 local i=1
32 while [ $i -le 60 ] ; do
33 local status
34 read status < $dasd_status
35 case $status in
36 online|unformatted)
37 return 0 ;;
38 *)
39 sleep 0.1
40 i=$((i+1)) ;;
41 esac
42 done
43 return 1
44 }
45
46 function dasd_settle_all() {
47 for dasdccw in $(while read line; do echo ${line%%(*}; done < /proc/dasd/devices) ; do
48 if ! dasd_settle $dasdccw ; then
49 echo $"Could not access DASD $dasdccw in time"
50 return 1
51 fi
52 done
53 return 0
54 }
55
56 # prints a canonocalized device bus ID for a given devno of any format
57 function canonicalize_devno()
58 {
59 case ${#1} in
60 3) echo "0.0.0${1}" ;;
61 4) echo "0.0.${1}" ;;
62 *) echo "${1}" ;;
63 esac
64 return 0
65 }
66
67 # read file from CMS and write it to /tmp
68 function readcmsfile() # $1=dasdport $2=filename
69 {
70 local dev
71 local numcpus
72 local devname
73 local ret=0
74 if [ $# -ne 2 ]; then return; fi
75 # precondition: udevd created dasda block device node
76 if ! dasd_cio_free -d $1 ; then
77 echo $"DASD $1 could not be cleared from device blacklist"
78 return 1
79 fi
80
81 modprobe dasd_mod dasd=$CMSDASD
82 modprobe dasd_eckd_mod
83 udevadm settle
84
85 # precondition: dasd_eckd_mod driver incl. dependencies loaded,
86 # dasd_mod must be loaded without setting any DASD online
87 dev=$(canonicalize_devno $1)
88 numcpus=$(
89 while read line; do
90 if strstr "$line" "# processors"; then
91 echo ${line##*:};
92 break;
93 fi;
94 done < /proc/cpuinfo
95 )
96
97 if [ ${numcpus} -eq 1 ]; then
98 echo 1 > /sys/bus/ccw/devices/$dev/online
99 else
100 if ! sysecho /sys/bus/ccw/devices/$dev/online 1; then
101 echo $"DASD $dev could not be set online"
102 return 1
103 fi
104 udevadm settle
105 if ! dasd_settle $dev ; then
106 echo $"Could not access DASD $dev in time"
107 return 1
108 fi
109 fi
110
111 udevadm settle
112
113 devname=$(cd /sys/bus/ccw/devices/$dev/block; set -- *; [ -b /dev/$1 ] && echo $1)
114 devname=${devname:-dasda}
115
116 [[ -d /mnt ]] || mkdir /mnt
117 if cmsfs-fuse --to=UTF-8 -a /dev/$devname /mnt; then
118 cat /mnt/$2 > /run/initramfs/$2
119 umount /mnt || umount -l /mnt
120 udevadm settle
121 else
122 echo $"Could not read conf file $2 on CMS DASD $1."
123 ret=1
124 fi
125
126 if ! sysecho /sys/bus/ccw/devices/$dev/online 0; then
127 echo $"DASD $dev could not be set offline again"
128 #return 1
129 fi
130 udevadm settle
131
132 # unbind all dasds to unload the dasd modules for a clean start
133 ( cd /sys/bus/ccw/drivers/dasd-eckd; for i in *.*; do echo $i > unbind;done)
134 udevadm settle
135 modprobe -r dasd_eckd_mod
136 udevadm settle
137 modprobe -r dasd_diag_mod
138 udevadm settle
139 modprobe -r dasd_mod
140 udevadm settle
141 return $ret
142 }
143
144 processcmsfile()
145 {
146 source /tmp/cms.conf
147
148 if [[ $NETTYPE ]]; then
149 (
150 echo -n $NETTYPE,$SUBCHANNELS
151 [[ $PORTNAME ]] && echo -n ",portname=$PORTNAME"
152 [[ $LAYER2 ]] && echo -n ",layer2=$LAYER2"
153 [[ "$NETTYPE" = "ctc" ]] && [[ $CTCPROT ]] && echo -n ",protocol=$CTCPROT"
154 echo
155 ) >> /etc/ccw.conf
156
157 OLDIFS=$IFS
158 IFS=,
159 read -a subch_array <<< "indexzero,$SUBCHANNELS"
160 IFS=$OLDIFS
161 devbusid=${subch_array[1]}
162 if [ "$NETTYPE" = "ctc" ]; then
163 driver="ctcm"
164 else
165 driver=$NETTYPE
166 fi
167
168 printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="%s", KERNELS=="%s", ENV{INTERFACE}=="?*", RUN+="/sbin/initqueue --onetime --unique --name cmsifup-$env{INTERFACE} /sbin/cmsifup $env{INTERFACE}"\n' "$driver" "$devbusid" > /etc/udev/rules.d/99-cms.rules
169 # remove the default net rules
170 rm -f /etc/udev/rules.d/91-default-net.rules
171 [[ -f /etc/udev/rules.d/90-net.rules ]] \
172 || printf 'SUBSYSTEM=="net", ACTION=="online", RUN+="/sbin/initqueue --onetime --env netif=$env{INTERFACE} source_hook initqueue/online"\n' >> /etc/udev/rules.d/99-cms.rules
173 udevadm control --reload
174 znet_cio_free
175 fi
176
177 if [[ $DASD ]]; then
178 echo $DASD | normalize_dasd_arg > /etc/dasd.conf
179 echo "options dasd_mod dasd=$DASD" > /etc/modprobe.d/dasd_mod.conf
180 dasd_cio_free
181 fi
182
183 unset _do_zfcp
184 for i in ${!FCP_*}; do
185 echo "${!i}" >> /etc/zfcp.conf
186 _do_zfcp=1
187 done
188 [[ $_do_zfcp ]] && zfcp_cio_free
189 unset _do_zfcp
190 }
191
192 [[ $CMSDASD ]] || CMSDASD=$(getarg "CMSDASD=")
193 [[ $CMSCONFFILE ]] || CMSCONFFILE=$(getarg "CMSCONFFILE=")
194
195 # Parse configuration
196 if [ -n "$CMSDASD" -a -n "$CMSCONFFILE" ]; then
197 if readcmsfile $CMSDASD $CMSCONFFILE; then
198 ln -s /run/initramfs/$CMSCONFFILE /tmp/$CMSCONFFILE
199 ln -s /run/initramfs/$CMSCONFFILE /tmp/cms.conf
200 processcmsfile
201 fi
202 fi