Re: [PATCH 2/3] md: Add support for Raid5->Raid0 and Raid10->Raid0 takeover
From: Neil Brown <hidden>
Date: 2010-02-01 00:05:49
On Fri, 29 Jan 2010 14:54:10 +0000 "Trela, Maciej" [off-list ref] wrote:
+static void *raid0_takeover_raid10(mddev_t *mddev)
+{
+ mdk_rdev_t *rdev;
+
+ /* Check layout:
+ * assuming that far_copies is 1 and disks number is even
+ * also all mirrors must be already degraded
+ */
+ if ((mddev->layout >> 8) != 1) {
+ printk(KERN_ERR "error: Raid0 cannot takover layout: %x\n", mddev->layout);
+ return ERR_PTR(-EINVAL);
+ }
+ if (mddev->raid_disks & 1) {
+ printk(KERN_ERR "error: Raid0 cannot takover Raid10 with odd disk number.\n");
+ return ERR_PTR(-EINVAL);
+ }
+ if (mddev->degraded != (mddev->raid_disks>>1)) {
+ printk(KERN_ERR "error: All mirrors must be already degraded!\n");
+ return ERR_PTR(-EINVAL);
+ }
+
+ /* Set new parameters */
+ mddev->new_level = 0;
+ mddev->raid_disks -= mddev->degraded;
+ mddev->delta_disks = -mddev->degraded;
+ mddev->degraded = 0;
+ /* make sure it will be not marked as dirty */
+ mddev->recovery_cp = MaxSector;
+
+ list_for_each_entry(rdev, &mddev->disks, same_set) {
+ rdev->raid_disk /= 2;
+ }You assume here that near_copies is 2, but you never check for that. Also - and this applies to raid5 and raid10 - the devices may not be all the same size. raid5 and raid10 will just use the size of the smallest device, but raid0 won't. For for a seamless conversion, you need to handle the case that the devices are not the same size. Either disallow that case, or make use of the extra space. NeilBrown