more debug output
[linux-2.4.git] / Documentation / mkdev_dyn.cciss
1 #!/bin/sh
2 #
3 # Author: Francis Wiran <Francis.Wiran@hp.com>
4 #
5 # Script to create device nodes for SMART Array controllers, idea from
6 # mkdev.cciss found in Documentation. The argument syntax is different,
7 # hence, the name change.
8 #
9 # Usage:
10 #       mkdev_dyn.cciss [ctlr num] [major num] [num log vol] [num partitions]
11 #
12 # With no arguments, the script will check to see if there are any cciss
13 # nodes already created in the /dev directory. If so, then it will assume
14 # that the nodes for the first 8 controllers are already created by
15 # /etc/makedev.d, which is likely. If not, then the script will create 
16 # them, using the major numbers reserved for cciss controllers (104 thru 111).
17 #
18 # After that, it will start creating nodes for the controllers which major
19 # numbers are dynamically allocated by the kernel. It will check 
20 # /proc/devices for any cciss controllers with major numbers other than
21 # 104 thru 111 and creates the nodes.
22 #
23 # Note that it is a good idea to run rmdev_dyn.cciss script if you remove
24 # those controllers (the ones which major numbers were dynamically allocated)
25 # This will unclutter /dev, as well as preventing possible problems due to 
26 # referenced devices and major numbers no longer available or taken by
27 # other non-cciss drivers.
28 #
29 # With no arguments, the script assumes 16 logical volumes per controller
30 # and 16 partitions per volume; 
31 #
32 # Passing arguments:
33 # If you know that one of your controllers, say cciss8, has been dynamically 
34 # assigned major number 254, and were planning on no more than 2 logical 
35 # volumes, using a maximum of 4 partitions per volume, you could do:
36 #
37 # mkdev_dyn.cciss 8 254 2 4
38 #
39 # Of course, this has no real benefit over "mkdev_dyn.cciss 8 254" except 
40 # that it doesn't create as many device nodes in /dev/cciss.
41 #
42
43 # Inputs
44 NR_CTLR=${1-8}
45 NR_MAJOR=${2-254}
46 NR_VOL=${3-16}
47 NR_PART=${4-16}
48
49 echo_usage()
50 {
51         echo "Usage: mkdev_dyn.cciss [ctlr num] [maj] [volumes] [partitions]"
52         echo "The script assumes that ctlr 0 thru 7 is statically created"
53         echo "Therefore, if you want to pass arguments make sure that"
54         echo "ctlr num is equal or greater than 8, and the major number"
55         echo "is not one that's statically assigned for cciss controller."
56         echo "Check the correct major number in /proc/devices"
57
58         # Hmm... we don't support volumes and partitions greater than 16
59         # either.
60 }
61
62 echo_create()
63 {
64         echo "created /dev/cciss/c${1}* nodes using major number ${2}"
65 }
66
67
68 # Function: do_mknod()
69 #           Creates devices nodes under /dev/cciss
70 # Inputs: $1 - ctlr number
71 #         $2 - major number
72 #         $3 - number of devices on controller
73 #         $4 - number of partitions per device
74 do_mknod()
75 {
76         D=0;
77         while [ $D -lt $3 ]; do
78                 P=0;
79                 while [ $P -lt $4 ]; do
80                         MIN=`expr $D \* 16 + $P`;
81                         if [ $P -eq 0 ]; then
82                                 mknod /dev/cciss/c${1}d${D} b $2 $MIN
83                         else
84                                 mknod /dev/cciss/c${1}d${D}p${P} b $2 $MIN
85                         fi
86                         P=`expr $P + 1`;
87                 done
88                 D=`expr $D + 1`;
89         done
90 }
91
92 # Function: do_dyn
93 #           Search and create cciss nodes for the controllers which
94 #           major numbers are allocated dynamically by the kernel
95 #           instead of using kernel.org 's value of 104 to 111.
96 #
97 # Input: $1 - ctlr num - will create nodes /dev/cciss/c${1}
98 #        $2 - major num - the major number to assign to the nodes
99 #        $3 - volumes - max number of volumes per controller
100 #        $4 - partitions - max number of partitions per volume
101 #
102 # Note: Without input, this function will start creating nodes
103 #       for controller c8 and above, making assumption that 
104 #       c0 thru c7 are already made, and the name c8 and above 
105 #       are not already taken.
106 do_dyn()
107 {
108         if [ $# -eq 0 ]; then
109                 C=0;
110                 for MAJ in `cat /proc/devices |\
111                         grep cciss |\
112                         awk '/cciss[0-9]$/ { sub("cciss", "cciss0") }; {print}' |\
113                         sort -k 2,2 |\
114                         awk '{print $1-i}'`;
115                 do
116                         if [ `ls -l /dev/cciss/c* |\
117                                 awk '{print $5-i}' |\
118                                 uniq |\
119                                 grep $MAJ |\
120                                 wc -l` -gt 0 ]; then
121                                 :
122                         else
123                                 do_mknod $C $MAJ $NR_VOL $NR_PART;
124                                 echo_create $C $MAJ;
125                         fi
126                         C=`expr $C + 1`;
127                 done
128         else
129                 do_mknod $1 $2 $3 $4;
130                 echo_create $1 $2;
131         fi
132         
133         exit
134 }
135
136 # Start here
137
138 # Check the input values
139 if [ $NR_CTLR -lt 8 ]; then
140         echo_usage;
141         exit
142 fi
143
144 if [ $NR_CTLR -ge 8 ]; then
145         if [ \( $NR_MAJOR -ge 104 \) -a \( $NR_MAJOR -le 111 \) ]; then
146                 echo_usage;
147                 exit
148         fi
149 fi
150
151 if [ ! -d /dev/cciss ]; then
152         mkdir -p /dev/cciss
153 fi
154
155 # Assume that if c0d0p1 node already exist, then all nodes from c0d0p1
156 # to c7d15p15 have been created for us.
157 if [ ! -b /dev/cciss/c0d0p1 ]; then
158         C=0; 
159         while [ $C -lt 8 ]; do
160                 MAJ=`expr $C + 104`;
161                 do_mknod $C $MAJ $NR_VOL $NR_PART;
162                 echo_create $C $MAJ;
163                 C=`expr $C + 1`;
164         done
165 fi
166
167 if [ $# -gt 0 ]; then
168         do_dyn $NR_CTLR $NR_MAJOR $NR_VOL $NR_PART;
169 else
170         do_dyn;
171 fi