summaryrefslogtreecommitdiffstats
path: root/dasdconf.sh
blob: 2be527672e551ab20bdb05c314af9e681662cc2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/sh

# config file syntax:
# deviceno   sysfs_opts...
#
# Examples:
# 0.0.0203 readonly=1 failfast=1
# 0.0.0204
# 0.0.0205 erplog=1

[ -z "$DEVPATH" ] && exit 0
[ "$ACTION" != "add" ] && exit 0

CHANNEL=${DEVPATH##*/}

CONFIG=/etc/dasd.conf
PATH=/sbin:/bin
export PATH

warn() {
    [ -e /dev/kmsg ] && echo "<4>dasdconf.sh Warning: $@" > /dev/kmsg
    echo "dasdconf.sh Warning: $@" >&2
}

if [ -f "$CONFIG" ]; then
    if [ ! -d /sys/bus/ccw/drivers/dasd-eckd ] && [ ! -d /sys/bus/ccw/drivers/dasd-fba ]; then
	#warn "No dasd-eckd or dasd-eckd loaded"
        exit 0
    fi
    sed 'y/ABCDEF/abcdef/' < $CONFIG | while read line; do
        case $line in
            \#*) ;;
            *)
                [ -z "$line" ] && continue
                set $line

		# if we are in single add mode, only add the new CHANNEL
		[ "$SUBSYSTEM" = "ccw" ] && [ "$1" != "$CHANNEL" ] && continue

                DEVICE=$1
                SYSFSPATH=

                if [ -r "/sys/bus/ccw/drivers/dasd-eckd/$DEVICE" ]; then
                    SYSFSPATH="/sys/bus/ccw/drivers/dasd-eckd/$DEVICE"
                elif [ -r "/sys/bus/ccw/drivers/dasd-fba/$DEVICE" ]; then
                    SYSFSPATH="/sys/bus/ccw/drivers/dasd-fba/$DEVICE"
                else
		    # if we are in single add mode, this is a failure!
		    [ "$SUBSYSTEM" = "ccw" ] && warn "Could not find $DEVICE in sysfs"
                    continue
                fi

		# skip already onlined devices
		if [ "$(cat $SYSFSPATH/online)" = "1" ]; then
		    if [ "$SUBSYSTEM" = "ccw" ]; then
		        # if we are in single add mode, we should not touch the device
			warn "$DEVICE is already online, not configuring"
			exit 0
		    fi
		    continue
		fi

                shift
                while [ -n "$1" ]; do
                    (
                        attribute="$1"
                        IFS="="
                        set $attribute

                        if [ "$1" = "use_diag" ]; then
			    # this module better only returns after
			    # all sysfs entries have the "use_diag" file
                            modprobe dasd_diag_mod
                        fi

                        if [ -r "$SYSFSPATH/$1" ]; then
                            echo $2 > $SYSFSPATH/$1 || warn "Could not set $1=$2 for $DEVICE"
                        else
			    warn "$1 does not exist for $DEVICE"
                        fi
                    )
                    shift
                done
		
		# Now, put the device online
                echo 1 > $SYSFSPATH/online || echo "Could not activate $DEVICE"

		# if we are in single add mode, we are done
		[ "$SUBSYSTEM" = "ccw" ] && exit 0
                ;;
        esac
    done
fi
exit 0