]>
Commit | Line | Data |
---|---|---|
0ed1b644 | 1 | #!/usr/bin/env python3 |
faa73d4e | 2 | # SPDX-License-Identifier: LGPL-2.1-or-later |
0ed1b644 MW |
3 | # |
4 | # sd-script.py: create LOTS of sd device entries in fake sysfs | |
5 | # | |
6 | # (C) 2018 Martin Wilck, SUSE Linux GmbH | |
7 | # | |
8 | # Run after sys-script.py | |
9 | # Usage: sd-script.py <directory> <num> | |
28423d9a | 10 | # <num> is the number of device nodes (disks + partitions) |
0ed1b644 MW |
11 | # to create in addition to what sys-script.py already did. |
12 | # The script can be run several times in a row if <num> is increased, | |
13 | # adding yet more device entries. | |
14 | # Tested up to 1000 entries, more are possible. | |
15 | # Note that sys-script.py already creates 10 sd device nodes | |
16 | # (sda+sdb and partitions). This script starts with sdc. | |
17 | ||
18 | import re | |
19 | import os | |
20 | import errno | |
21 | import sys | |
22 | ||
23 | def d(path, mode): | |
24 | os.mkdir(path, mode) | |
25 | ||
26 | def l(path, src): | |
27 | os.symlink(src, path) | |
28 | ||
29 | def f(path, mode, contents): | |
30 | with open(path, "wb") as f: | |
31 | f.write(contents) | |
32 | os.chmod(path, mode) | |
33 | ||
34 | class SD(object): | |
35 | ||
36 | sd_major = [8] + list(range(65, 72)) + list(range(128, 136)) | |
37 | _name_re = re.compile(r'sd(?P<f>[a-z]*)$') | |
38 | ||
39 | def _init_from_name(self, name): | |
40 | mt = self._name_re.match(name) | |
41 | if mt is None: | |
42 | raise RuntimeError("invalid name %s" % name) | |
43 | nm = mt.group("f") | |
44 | base = 1 | |
45 | ls = nm[-1] | |
46 | nm = nm[:-1] | |
47 | n = base * (ord(ls)-ord('a')) | |
48 | while len(nm) > 0: | |
49 | ls = nm[-1] | |
50 | nm = nm[:-1] | |
51 | base *= 26 | |
52 | n += base * (1 + ord(ls)-ord('a')) | |
53 | self._num = n | |
54 | ||
55 | def _init_from_dev(self, dev): | |
56 | maj, min = dev.split(":") | |
57 | maj = self.sd_major.index(int(maj, 10)) | |
58 | min = int(min, 10) | |
59 | num = int(min / 16) | |
60 | self._num = 16*maj + num%16 + 256*int(num/16) | |
61 | ||
62 | @staticmethod | |
63 | def _disk_num(a, b): | |
64 | n = ord(a)-ord('a') | |
65 | if b != '': | |
66 | n = 26 * (n+1) + ord(b)-ord('a') | |
67 | return n | |
68 | ||
69 | @staticmethod | |
70 | def _get_major(n): | |
71 | return SD.sd_major[(n%256)//16] | |
72 | @staticmethod | |
73 | def _get_minor(n): | |
74 | return 16 * (n % 16 + 16 * n//256) | |
75 | ||
76 | @staticmethod | |
77 | def _get_name(n): | |
78 | # see sd_format_disk_name() (sd.c) | |
79 | s = chr(n % 26 + ord('a')) | |
80 | n = n // 26 - 1 | |
81 | while n >= 0: | |
82 | s = chr(n % 26 + ord('a')) + s | |
83 | n = n // 26 - 1 | |
84 | return "sd" + s | |
85 | ||
86 | @staticmethod | |
87 | def _get_dev_t(n): | |
88 | maj = SD._get_major(n) | |
89 | min = SD._get_minor(n) | |
90 | return (maj << 20) + min | |
91 | ||
92 | def __init__(self, arg): | |
93 | if type(arg) is type(0): | |
94 | self._num = arg | |
95 | elif arg.startswith("sd"): | |
96 | self._init_from_name(arg) | |
97 | else: | |
98 | self._init_from_dev(arg) | |
99 | ||
100 | def __cmp__(self, other): | |
101 | return cmp(self._num, other._num) | |
102 | ||
74522aa8 YW |
103 | def __eq__(self, other): |
104 | return self.__cmp__(other) == 0 | |
105 | ||
106 | def __ne__(self, other): | |
107 | return not self.__eq__(other) | |
108 | ||
0ed1b644 MW |
109 | def __hash__(self): |
110 | return hash(self._num) | |
111 | ||
112 | def __str__(self): | |
113 | return "%s/%s" % ( | |
114 | self.devstr(), | |
115 | self._get_name(self._num)) | |
116 | ||
117 | def major(self): | |
118 | return self._get_major(self._num) | |
119 | ||
120 | def minor(self): | |
121 | return self._get_minor(self._num) | |
122 | ||
123 | def devstr(self): | |
124 | return "%d:%d" % (self._get_major(self._num), | |
125 | self._get_minor(self._num)) | |
126 | ||
127 | def namestr(self): | |
128 | return self._get_name(self._num) | |
129 | ||
130 | def longstr(self): | |
131 | return "%d\t%s\t%s\t%08x" % (self._num, | |
132 | self.devstr(), | |
133 | self.namestr(), | |
134 | self._get_dev_t(self._num)) | |
135 | ||
136 | class MySD(SD): | |
137 | def subst(self, first_sg): | |
138 | disk = { | |
139 | "lun": self._num, | |
140 | "major": self.major(), | |
141 | "devnode": self.namestr(), | |
142 | "disk_minor": self.minor(), | |
143 | "sg_minor": first_sg + self._num, | |
144 | } | |
145 | return disk | |
146 | ||
147 | disk_template = r"""\ | |
148 | l('sys/bus/scsi/drivers/sd/7:0:0:{lun}', '../../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}') | |
149 | l('sys/bus/scsi/devices/7:0:0:{lun}', '../../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}') | |
150 | l('sys/dev/char/254:{sg_minor}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}') | |
151 | l('sys/dev/char/21:{sg_minor}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}') | |
152 | l('sys/class/scsi_disk/7:0:0:{lun}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}') | |
153 | l('sys/class/scsi_generic/sg{sg_minor}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}') | |
154 | l('sys/class/bsg/7:0:0:{lun}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}') | |
155 | l('sys/class/scsi_device/7:0:0:{lun}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}') | |
156 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}', 0o755) | |
157 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/generic', 'scsi_generic/sg{sg_minor}') | |
158 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/subsystem', '../../../../../../../../../bus/scsi') | |
159 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/driver', '../../../../../../../../../bus/scsi/drivers/sd') | |
160 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/iodone_cnt', 0o644, b'0xc3\n') | |
161 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/device_blocked', 0o644, b'0\n') | |
162 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/max_sectors', 0o644, b'240\n') | |
163 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/modalias', 0o644, b'scsi:t-0x00\n') | |
164 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_level', 0o644, b'3\n') | |
165 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/queue_depth', 0o644, b'1\n') | |
166 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/rev', 0o644, b'1.00\n') | |
167 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/type', 0o644, b'0\n') | |
168 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/iocounterbits', 0o644, b'32\n') | |
169 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/vendor', 0o644, b'Generic \n') | |
170 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/state', 0o644, b'running\n') | |
171 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/queue_type', 0o644, b'none\n') | |
172 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/iorequest_cnt', 0o644, b'0xc3\n') | |
173 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/evt_media_change', 0o644, b'0\n') | |
174 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/model', 0o644, b'USB Flash Drive \n') | |
175 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/ioerr_cnt', 0o644, b'0x2\n') | |
176 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/uevent', 0o644, b'''DEVTYPE=scsi_device | |
177 | DRIVER=sd | |
178 | MODALIAS=scsi:t-0x00 | |
179 | ''') | |
180 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/timeout', 0o644, b'60\n') | |
181 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk', 0o755) | |
182 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}', 0o755) | |
183 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/subsystem', '../../../../../../../../../../../class/scsi_disk') | |
184 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/device', '../../../7:0:0:{lun}') | |
185 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/app_tag_own', 0o644, b'0\n') | |
186 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/FUA', 0o644, b'0\n') | |
187 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/cache_type', 0o644, b'write through\n') | |
188 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/protection_type', 0o644, b'0\n') | |
189 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/manage_start_stop', 0o644, b'0\n') | |
190 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/allow_restart', 0o644, b'1\n') | |
191 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/uevent', 0o644, b'') | |
192 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/power', 0o755) | |
193 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_disk/7:0:0:{lun}/power/wakeup', 0o644, b'\n') | |
194 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/power', 0o755) | |
195 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/power/wakeup', 0o644, b'\n') | |
196 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic', 0o755) | |
197 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}', 0o755) | |
198 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}/subsystem', '../../../../../../../../../../../class/scsi_generic') | |
199 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}/device', '../../../7:0:0:{lun}') | |
200 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}/dev', 0o644, b'21:{sg_minor}\n') | |
201 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}/uevent', 0o644, b'''MAJOR=21 | |
202 | MINOR={sg_minor} | |
203 | ''') | |
204 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}/power', 0o755) | |
205 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_generic/sg{sg_minor}/power/wakeup', 0o644, b'\n') | |
206 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg', 0o755) | |
207 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}', 0o755) | |
208 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}/subsystem', '../../../../../../../../../../../class/bsg') | |
209 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}/device', '../../../7:0:0:{lun}') | |
210 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}/dev', 0o644, b'254:{sg_minor}\n') | |
211 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}/uevent', 0o644, b'''MAJOR=254 | |
212 | MINOR={sg_minor} | |
213 | ''') | |
214 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}/power', 0o755) | |
215 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/bsg/7:0:0:{lun}/power/wakeup', 0o644, b'\n') | |
216 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block', 0o755) | |
217 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device', 0o755) | |
218 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}', 0o755) | |
219 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}/subsystem', '../../../../../../../../../../../class/scsi_device') | |
220 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}/device', '../../../7:0:0:{lun}') | |
221 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}/uevent', 0o644, b'') | |
222 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}/power', 0o755) | |
223 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/scsi_device/7:0:0:{lun}/power/wakeup', 0o644, b'\n') | |
224 | l('sys/dev/block/{major}:{disk_minor}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}') | |
225 | l('sys/class/block/{devnode}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}') | |
226 | l('sys/block/{devnode}', '../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}') | |
227 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}', 0o755) | |
228 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/subsystem', '../../../../../../../../../../../class/block') | |
229 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/bdi', '../../../../../../../../../../virtual/bdi/{major}:{disk_minor}') | |
230 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/device', '../../../7:0:0:{lun}') | |
231 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/capability', 0o644, b'13\n') | |
232 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/ro', 0o644, b'0\n') | |
233 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/make-it-fail', 0o644, b'0\n') | |
234 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/size', 0o644, b'257024\n') | |
235 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/dev', 0o644, b'{major}:{disk_minor}\n') | |
236 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/range', 0o644, b'16\n') | |
237 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/removable', 0o644, b'1\n') | |
238 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/stat', 0o644, b' 117 409 2103 272 0 0 0 0 0 194 272\n') | |
239 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/uevent', 0o644, b'''MAJOR={major} | |
240 | MINOR={disk_minor} | |
241 | DEVTYPE=disk | |
242 | DEVNAME={devnode} | |
243 | ''') | |
244 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue', 0o755) | |
245 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/bsg', '../../../bsg/7:0:0:{lun}') | |
246 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/nr_requests', 0o644, b'128\n') | |
247 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/nomerges', 0o644, b'0\n') | |
248 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/scheduler', 0o644, b'noop anticipatory deadline [cfq] \n') | |
249 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/hw_sector_size', 0o644, b'512\n') | |
250 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/max_hw_sectors_kb', 0o644, b'120\n') | |
251 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/read_ahead_kb', 0o644, b'128\n') | |
252 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/max_sectors_kb', 0o644, b'120\n') | |
253 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched', 0o755) | |
254 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/slice_async_rq', 0o644, b'2\n') | |
255 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/back_seek_max', 0o644, b'16384\n') | |
256 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/slice_sync', 0o644, b'100\n') | |
257 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/slice_async', 0o644, b'40\n') | |
258 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/fifo_expire_sync', 0o644, b'125\n') | |
259 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/slice_idle', 0o644, b'8\n') | |
260 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/back_seek_penalty', 0o644, b'2\n') | |
261 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/fifo_expire_async', 0o644, b'250\n') | |
262 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/queue/iosched/quantum', 0o644, b'4\n') | |
263 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/power', 0o755) | |
264 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/power/wakeup', 0o644, b'\n') | |
265 | """ | |
266 | ||
267 | part_template = r"""\ | |
268 | l('sys/dev/block/{major}:{part_minor}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}') | |
269 | l('sys/class/block/{devnode}{part_num}', '../../devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}') | |
270 | d('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}', 0o755) | |
271 | l('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/subsystem', '../../../../../../../../../../../../class/block') | |
272 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/start', 0o644, b'32\n') | |
273 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/make-it-fail', 0o644, b'0\n') | |
274 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/size', 0o644, b'256992\n') | |
275 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/dev', 0o644, b'{major}:{part_minor}\n') | |
276 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/stat', 0o644, b' 109 392 1903 246 0 0 0 0 0 169 246\n') | |
277 | f('sys/devices/pci0000:00/0000:00:1d.7/usb5/5-1/5-1:1.0/host7/target7:0:0/7:0:0:{lun}/block/{devnode}/{devnode}{part_num}/uevent', 0o644, b'''MAJOR={major} | |
278 | MINOR={part_minor} | |
279 | DEVTYPE=partition | |
280 | DEVNAME={devnode}{part_num} | |
281 | ''') | |
282 | """ | |
283 | ||
284 | if len(sys.argv) != 3: | |
285 | exit("Usage: {} <target dir> <number>".format(sys.argv[0])) | |
286 | ||
287 | if not os.path.isdir(sys.argv[1]): | |
288 | exit("Target dir {} not found".format(sys.argv[1])) | |
289 | ||
290 | def create_part_sysfs(disk, sd, prt): | |
291 | part = disk | |
292 | part.update ({ | |
293 | "part_num": prt, | |
294 | "part_minor": disk["disk_minor"] + prt, | |
295 | }) | |
296 | ||
297 | try: | |
298 | exec(part_template.format(**part)) | |
299 | except OSError: | |
300 | si = sys.exc_info()[1] | |
301 | if (si.errno == errno.EEXIST): | |
302 | print("sysfs structures for %s%d exist" % (sd.namestr(), prt)) | |
303 | else: | |
304 | print("error for %s%d: %s" % (sd.namestr(), prt, si[1])) | |
305 | raise | |
306 | else: | |
307 | print("sysfs structures for %s%d created" % (sd.namestr(), prt)) | |
308 | ||
309 | def create_disk_sysfs(dsk, first_sg, n): | |
310 | sd = MySD(dsk) | |
311 | disk = sd.subst(first_sg) | |
312 | ||
313 | try: | |
314 | exec(disk_template.format(**disk)) | |
315 | except OSError: | |
316 | si = sys.exc_info()[1] | |
317 | if (si.errno == errno.EEXIST): | |
318 | print("sysfs structures for %s exist" % sd.namestr()) | |
319 | elif (si.errno == errno.ENOENT): | |
320 | print("error for %s: %s - have you run sys-script py first?" % | |
321 | (sd.namestr(), si.strerror)) | |
322 | return -1 | |
323 | else: | |
324 | print("error for %s: %s" % (sd.namestr(), si.strerror)) | |
325 | raise | |
326 | else: | |
327 | print("sysfs structures for %s created" % sd.namestr()) | |
328 | ||
329 | n += 1 | |
330 | if n >= last: | |
331 | return n | |
332 | ||
333 | for prt in range(1, 16): | |
334 | create_part_sysfs(disk, sd, prt) | |
335 | n += 1 | |
336 | if n >= last: | |
337 | return n | |
338 | ||
339 | return n | |
340 | ||
341 | os.chdir(sys.argv[1]) | |
342 | n = 0 | |
343 | last = int(sys.argv[2]) | |
344 | first_sg = 2 | |
345 | for dsk in range(2, 1000): | |
346 | n = create_disk_sysfs(dsk, first_sg, n) | |
347 | if n >= last or n == -1: | |
348 | break |