12 for(x=d->cat.first; x; x=x->link) {
17 list = ialloc(d->cat.ndev * sizeof(Device*), 0);
19 for(x=d->cat.first; x; x=x->link) {
32 for(x=d->cat.first; x; x=x->link) {
44 mcatread(Device *d, Off b, void *c)
50 for(x=d->cat.first; x; x=x->link) {
57 return devread(x, b-l, c);
60 fprint(2, "mcatread past end: %Z block %lld, %lld beyond end\n",
61 d, (Wideoff)b, (Wideoff)l);
66 mcatwrite(Device *d, Off b, void *c)
72 for(x=d->cat.first; x; x=x->link) {
79 return devwrite(x, b-l, c);
82 fprint(2, "mcatwrite past end: %Z block %lld, %lld beyond end\n",
83 d, (Wideoff)b, (Wideoff)l);
88 * multiple interleave devices
96 for(x=d->cat.first; x; x=x->link)
109 for(x=d->cat.first; x; x=x->link) {
115 if(min == 0 || m < min)
123 mlevread(Device *d, Off b, void *c)
130 return devread(list[b%n], b/n, c);
134 mlevwrite(Device *d, Off b, void *c)
141 return devwrite(list[b%n], b/n, c);
152 d->part.d->size = devsize(d->part.d);
160 l = d->part.d->size / 100;
161 size = d->part.size * l;
168 partread(Device *d, Off b, void *c)
170 Devsize base, size, l;
172 l = d->part.d->size / 100;
173 base = d->part.base * l;
174 size = d->part.size * l;
178 return devread(d->part.d, base+b, c);
179 fprint(2, "partread past end: %Z blk %lld size %lld\n",
180 d, (Wideoff)b, (Wideoff)size);
185 partwrite(Device *d, Off b, void *c)
187 Devsize base, size, l;
189 l = d->part.d->size / 100;
190 base = d->part.base * l;
191 size = d->part.size * l;
195 return devwrite(d->part.d, base+b, c);
196 fprint(2, "partwrite past end: %Z blk %lld size %lld\n",
197 d, (Wideoff)b, (Wideoff)size);
210 for(x=d->cat.first; x; x=x->link)
211 x->size = devsize(x);
223 for(x=d->cat.first; x; x=x->link) {
229 if(min == 0 || m < min)
237 mirrread(Device *d, Off b, void *c)
241 if (d->cat.first == nil) {
242 fprint(2, "mirrread: empty mirror %Z\n", d);
245 for(x=d->cat.first; x; x=x->link) {
247 x->size = devsize(x);
248 if (devread(x, b, c) == 0) /* okay? */
251 // DANGER WILL ROBINSON
252 fprint(2, "mirrread: all mirrors of %Z block %lld are bad\n",
258 * write the mirror(s) first so that a power outage, for example, will
259 * find the main device written only if the mirrors are too, thus
260 * checking the main device will also correctly check the mirror(s).
262 * devread and devwrite are synchronous; all buffering must be
263 * implemented at higher levels.
266 ewrite(Device *x, Off b, void *c)
269 x->size = devsize(x);
270 if (devwrite(x, b, c) != 0) {
271 fprint(2, "mirrwrite: error at %Z block %lld\n", x, (Wideoff)b);
278 wrmirrs1st(Device *x, Off b, void *c) // write any mirrors of x, then x
284 e = wrmirrs1st(x->link, b, c);
285 return e | ewrite(x, b, c);
289 mirrwrite(Device *d, Off b, void *c)
291 if (d->cat.first == nil) {
292 fprint(2, "mirrwrite: empty mirror %Z\n", d);
295 return wrmirrs1st(d->cat.first, b, c);