return 0;
}
-static LIST_HEAD(all_raid_disks);
static LIST_HEAD(pending_raid_disks);
static void bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
printk(KERN_INFO "md: export_rdev(%s)\n",partition_name(rdev->dev));
if (rdev->mddev)
MD_BUG();
- unlock_rdev(rdev);
free_disk_sb(rdev);
- list_del_init(&rdev->all);
- if (!list_empty(&rdev->pending)) {
- printk(KERN_INFO "md: (%s was pending)\n",
- partition_name(rdev->dev));
- list_del_init(&rdev->pending);
- }
+ list_del_init(&rdev->same_set);
+ unlock_rdev(rdev);
#ifndef MODULE
md_autodetect_dev(rdev->dev);
#endif
rdev->desc_nr = -1;
}
}
- list_add(&rdev->all, &all_raid_disks);
- INIT_LIST_HEAD(&rdev->pending);
INIT_LIST_HEAD(&rdev->same_set);
if (rdev->faulty && rdev->sb)
/*
* lets try to run arrays based on all disks that have arrived
- * until now. (those are in the ->pending list)
+ * until now. (those are in pending_raid_disks)
*
* the method: pick the first pending disk, collect all disks with
* the same UUID, remove all from the pending list and put them into
printk(KERN_INFO "md: autorun ...\n");
while (!list_empty(&pending_raid_disks)) {
rdev0 = list_entry(pending_raid_disks.next,
- mdk_rdev_t, pending);
+ mdk_rdev_t, same_set);
printk(KERN_INFO "md: considering %s ...\n", partition_name(rdev0->dev));
INIT_LIST_HEAD(&candidates);
continue;
}
printk(KERN_INFO "md: adding %s ...\n", partition_name(rdev->dev));
- list_del(&rdev->pending);
- list_add(&rdev->pending, &candidates);
+ list_move(&rdev->same_set, &candidates);
}
}
/*
mddev_unlock(mddev);
} else {
printk(KERN_INFO "md: created md%d\n", mdidx(mddev));
- ITERATE_RDEV_GENERIC(candidates,pending,rdev,tmp) {
+ ITERATE_RDEV_GENERIC(candidates,rdev,tmp) {
+ list_del_init(&rdev->same_set);
bind_rdev_to_array(rdev, mddev);
- list_del_init(&rdev->pending);
}
autorun_array(mddev);
mddev_unlock(mddev);
/* on success, candidates will be empty, on error
* it wont...
*/
- ITERATE_RDEV_GENERIC(candidates,pending,rdev,tmp)
+ ITERATE_RDEV_GENERIC(candidates,rdev,tmp)
export_rdev(rdev);
mddev_put(mddev);
}
partition_name(startdev));
goto abort;
}
- list_add(&start_rdev->pending, &pending_raid_disks);
+ list_add(&start_rdev->same_set, &pending_raid_disks);
sb = start_rdev->sb;
partition_name(dev));
continue;
}
- list_add(&rdev->pending, &pending_raid_disks);
+ list_add(&rdev->same_set, &pending_raid_disks);
}
/*
sz += sprintf(page + sz, "unused devices: ");
- ITERATE_RDEV_ALL(rdev,tmp) {
- if (list_empty(&rdev->same_set)) {
- /*
- * The device is not yet used by any array.
- */
- i++;
- sz += sprintf(page + sz, "%s ",
- partition_name(rdev->dev));
- }
+ ITERATE_RDEV_PENDING(rdev,tmp) {
+ i++;
+ sz += sprintf(page + sz, "%s ",
+ partition_name(rdev->dev));
}
if (!i)
sz += sprintf(page + sz, "<none>");
MD_BUG();
continue;
}
- list_add(&rdev->pending, &pending_raid_disks);
+ list_add(&rdev->same_set, &pending_raid_disks);
}
dev_cnt = 0;
struct mdk_rdev_s
{
struct list_head same_set; /* RAID devices within the same set */
- struct list_head all; /* all RAID devices */
- struct list_head pending; /* undetected RAID devices */
kdev_t dev; /* Device number */
kdev_t old_dev; /* "" when it was last imported */
* iterates through some rdev ringlist. It's safe to remove the
* current 'rdev'. Dont touch 'tmp' though.
*/
-#define ITERATE_RDEV_GENERIC(head,field,rdev,tmp) \
+#define ITERATE_RDEV_GENERIC(head,rdev,tmp) \
\
for ((tmp) = (head).next; \
- (rdev) = (list_entry((tmp), mdk_rdev_t, field)), \
+ (rdev) = (list_entry((tmp), mdk_rdev_t, same_set)), \
(tmp) = (tmp)->next, (tmp)->prev != &(head) \
; )
/*
* iterates through the 'same array disks' ringlist
*/
#define ITERATE_RDEV(mddev,rdev,tmp) \
- ITERATE_RDEV_GENERIC((mddev)->disks,same_set,rdev,tmp)
-
-
-/*
- * Iterates through all 'RAID managed disks'
- */
-#define ITERATE_RDEV_ALL(rdev,tmp) \
- ITERATE_RDEV_GENERIC(all_raid_disks,all,rdev,tmp)
+ ITERATE_RDEV_GENERIC((mddev)->disks,rdev,tmp)
/*
* Iterates through 'pending RAID disks'
*/
#define ITERATE_RDEV_PENDING(rdev,tmp) \
- ITERATE_RDEV_GENERIC(pending_raid_disks,pending,rdev,tmp)
+ ITERATE_RDEV_GENERIC(pending_raid_disks,rdev,tmp)
#define xchg_values(x,y) do { __typeof__(x) __tmp = x; \
x = y; y = __tmp; } while (0)