106
106
rdev_dec_pending(rdev, conf->mddev);
109
static void unplug_slaves(mddev_t *mddev)
111
multipath_conf_t *conf = mddev->private;
115
for (i=0; i<mddev->raid_disks; i++) {
116
mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
117
if (rdev && !test_bit(Faulty, &rdev->flags)
118
&& atomic_read(&rdev->nr_pending)) {
119
struct request_queue *r_queue = bdev_get_queue(rdev->bdev);
121
atomic_inc(&rdev->nr_pending);
126
rdev_dec_pending(rdev, mddev);
133
static void multipath_unplug(struct request_queue *q)
135
unplug_slaves(q->queuedata);
139
109
static int multipath_make_request(mddev_t *mddev, struct bio * bio)
141
111
multipath_conf_t *conf = mddev->private;
178
148
seq_printf (seq, " [%d/%d] [", conf->raid_disks,
179
conf->working_disks);
149
conf->raid_disks - mddev->degraded);
180
150
for (i = 0; i < conf->raid_disks; i++)
181
151
seq_printf (seq, "%s",
182
152
conf->multipaths[i].rdev &&
216
186
static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
218
188
multipath_conf_t *conf = mddev->private;
189
char b[BDEVNAME_SIZE];
220
if (conf->working_disks <= 1) {
191
if (conf->raid_disks - mddev->degraded <= 1) {
222
193
* Uh oh, we can do nothing if this is our last path, but
223
194
* first check if this is a queued request for a device
224
195
* which has just failed.
226
197
printk(KERN_ALERT
227
"multipath: only one IO path left and IO error.\n");
198
"multipath: only one IO path left and IO error.\n");
228
199
/* leave it active... it's all we have */
231
* Mark disk as unusable
233
if (!test_bit(Faulty, &rdev->flags)) {
234
char b[BDEVNAME_SIZE];
235
clear_bit(In_sync, &rdev->flags);
236
set_bit(Faulty, &rdev->flags);
237
set_bit(MD_CHANGE_DEVS, &mddev->flags);
238
conf->working_disks--;
240
printk(KERN_ALERT "multipath: IO failure on %s,"
241
" disabling IO path.\n"
242
"multipath: Operation continuing"
243
" on %d IO paths.\n",
244
bdevname (rdev->bdev,b),
245
conf->working_disks);
203
* Mark disk as unusable
205
if (test_and_clear_bit(In_sync, &rdev->flags)) {
207
spin_lock_irqsave(&conf->device_lock, flags);
209
spin_unlock_irqrestore(&conf->device_lock, flags);
211
set_bit(Faulty, &rdev->flags);
212
set_bit(MD_CHANGE_DEVS, &mddev->flags);
213
printk(KERN_ALERT "multipath: IO failure on %s,"
214
" disabling IO path.\n"
215
"multipath: Operation continuing"
216
" on %d IO paths.\n",
217
bdevname(rdev->bdev, b),
218
conf->raid_disks - mddev->degraded);
250
221
static void print_multipath_conf (multipath_conf_t *conf)
257
228
printk("(conf==NULL)\n");
260
printk(" --- wd:%d rd:%d\n", conf->working_disks,
231
printk(" --- wd:%d rd:%d\n", conf->raid_disks - conf->mddev->degraded,
261
232
conf->raid_disks);
263
234
for (i = 0; i < conf->raid_disks; i++) {
304
275
PAGE_CACHE_SIZE - 1);
307
conf->working_disks++;
278
spin_lock_irq(&conf->device_lock);
308
279
mddev->degraded--;
309
280
rdev->raid_disk = path;
310
281
set_bit(In_sync, &rdev->flags);
282
spin_unlock_irq(&conf->device_lock);
311
283
rcu_assign_pointer(p->rdev, rdev);
313
285
md_integrity_add_rdev(rdev, mddev);
484
457
spin_lock_init(&conf->device_lock);
485
458
INIT_LIST_HEAD(&conf->retry_list);
487
if (!conf->working_disks) {
460
if (!working_disks) {
488
461
printk(KERN_ERR "multipath: no operational IO paths for %s\n",
490
463
goto out_free_conf;
492
mddev->degraded = conf->raid_disks - conf->working_disks;
465
mddev->degraded = conf->raid_disks - working_disks;
494
467
conf->pool = mempool_create_kmalloc_pool(NR_RESERVED_BUFS,
495
468
sizeof(struct multipath_bh));
513
486
"multipath: array %s active with %d out of %d IO paths\n",
514
mdname(mddev), conf->working_disks, mddev->raid_disks);
487
mdname(mddev), conf->raid_disks - mddev->degraded,
516
490
* Ok, everything is just fine now
518
492
md_set_array_sectors(mddev, multipath_size(mddev, 0, 0));
520
mddev->queue->unplug_fn = multipath_unplug;
521
494
mddev->queue->backing_dev_info.congested_fn = multipath_congested;
522
495
mddev->queue->backing_dev_info.congested_data = mddev;
523
md_integrity_register(mddev);
497
if (md_integrity_register(mddev))