[md PATCH 5/8] Enable OLCE for external IMSM metadata

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>From ace2e51b3e08fac68f4c62446aba456f82a6af6d Mon Sep 17 00:00:00 2001
From: Adam Kwolek <adam.kwolek@xxxxxxxxx>
Date: Thu, 18 Feb 2010 11:26:43 +0100
Subject: [PATCH] OLCE: new_dev and raid_disks changes

Changes to be committed:
	modified:   md.c
	modified:   raid5.c

Signed-off-by: Adam Kwolek <adam.kwolek@xxxxxxxxx>
---
 drivers/md/md.c    |   25 +++++++++++++++++++++----
 drivers/md/raid5.c |    8 ++++++--
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index c7d32c9..5e31b36 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3250,7 +3250,7 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len)
 	int minor;
 	dev_t dev;
 	mdk_rdev_t *rdev;
-	int err;
+	int err = 0;
 
 	if (!*buf || *e != ':' || !e[1] || e[1] == '\n')
 		return -EINVAL;
@@ -5296,11 +5296,28 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks)
 	if (mddev->pers->check_reshape == NULL)
 		return -EINVAL;
 	if (raid_disks <= 0 ||
-	    raid_disks >= mddev->max_disks)
-		return -EINVAL;
+	    raid_disks >= mddev->max_disks) {
+		if (mddev->external &&
+		    (mddev->max_disks == 0)) {
+			printk(KERN_WARNING "OLCE: in update_raid_disks() variable mddev->max_disks is set to MD_SB_DISKS\n");
+			mddev->max_disks = MD_SB_DISKS;
+		} else {
+			return -EINVAL;
+		}
+	}
+
 	if (mddev->sync_thread || mddev->reshape_position != MaxSector)
 		return -EBUSY;
-	mddev->delta_disks = raid_disks - mddev->raid_disks;
+
+	 /* OLCE for external meta */
+	if (mddev->external) {
+		/* increase raid_disks for external meta only */
+		if (raid_disks - mddev->raid_disks >= 0)
+			mddev->delta_disks = raid_disks - mddev->raid_disks;
+		else
+			return -EINVAL;
+	} else
+		mddev->delta_disks = raid_disks - mddev->raid_disks;
 
 	rv = mddev->pers->check_reshape(mddev);
 	return rv;
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 1c6022d..c7a3ca6 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5260,9 +5260,13 @@ static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 	int first = 0;
 	int last = conf->raid_disks - 1;
 
-	if (mddev->degraded > conf->max_degraded)
+	if (mddev->degraded > conf->max_degraded) {
 		/* no point adding a device */
-		return -EINVAL;
+		if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
+			return -EINVAL;
+
+		/* OLCE reconfiguration - add device */
+	}
 
 	if (rdev->raid_disk >= 0)
 		first = last = rdev->raid_disk;
-- 
1.6.0.2

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux