isw.c patch to fix the raid10 patch that didn't work correctly on two volumes

Fang, Ying ying.fang at intel.com
Tue Aug 14 16:59:56 UTC 2007



This patch fixed the bug in the isw RAID 10 patch that didn't support
two volumes. It also moved the RAID 10 raid set under a t-group raid set

as a subset.

Signed-off-by: Ying Fang <ying.fang at intel.com>

--- lib/format/ataraid/isw.c.orig	2007-08-13 20:18:15.000000000
-0700
+++ lib/format/ataraid/isw.c	2007-08-13 19:25:52.000000000 -0700
@@ -26,7 +26,7 @@
 
 static const char *handler = HANDLER;
 static struct isw_disk *_get_disk(struct isw *isw, struct dev_info
*di);
-int is_raid10(struct isw *isw);
+int is_raid10(struct isw_dev *dev);
 
 static size_t _name(struct isw *isw, char *str, size_t len, int subset,
 						int num, struct isw_dev
*dev)
@@ -35,7 +35,7 @@
 	case 2:
 		return snprintf(str, len, "isw_%u", isw->family_num);
 	case 1:
-		if(!is_raid10(isw))
+		if(!is_raid10(dev))
 			return snprintf(str, len, "isw_%u_%s",
 			isw->family_num, (char*) dev->volume);
 		else	
@@ -49,16 +49,15 @@
 }
 
 static char *name(struct lib_context *lc, struct raid_dev *rd,
-						unsigned int subset)
+				struct isw_dev *dev, unsigned int
subset)
 {
 	size_t len;
 	char *ret = NULL;
 	int id = 0;
 	struct isw *isw = META(rd, isw);
 	struct isw_disk *disk = isw->disk;
-	struct isw_dev *dev = (struct isw_dev*) (isw->disk +
isw->num_disks);
 
-	if((subset == 1) && (is_raid10(isw))) {
+	if((subset == 1) && (is_raid10(dev))) {
 		if ((disk = _get_disk(isw, rd->di))) {
 			if(disk == isw->disk)	id = 0;
 			else if(disk == isw->disk + 1)	id = 1;
@@ -70,10 +69,10 @@
 	}
 
 	if ((ret = dbg_malloc((len = _name(isw, ret, 0, subset, id,
-							dev) + 1)))) {
-					_name(isw, ret, len, subset, id,
dev);
-		mk_alpha(lc, ret + HANDLER_LEN, snprintf(ret, 0, "%u",
-
isw->family_num));
+								dev) +
1)))) {
+		_name(isw, ret, len, subset, id, dev);
+		len=snprintf(ret, 0, "%u", isw->family_num);
+		mk_alpha(lc, ret + HANDLER_LEN, len );
 	} else
 		log_alloc_err(lc, handler);
 
@@ -131,7 +130,7 @@
 }
 
 /* Neutralize disk type. */
-static enum type type(struct isw *isw)
+static enum type type(struct isw_dev *dev)
 {
 	/* Mapping of Intel types to generic types. */
 	static struct types types[] = {
@@ -141,24 +140,21 @@
 	        { ISW_T_RAID10, t_raid0},
 	        { 0, t_undef},
 	};
-
-	struct isw_dev *dev = (struct isw_dev*) (isw->disk +
isw->num_disks);
 	
-	if(is_raid10(isw))
+	if(is_raid10(dev))
 		dev->vol.map.raid_level = ISW_T_RAID10;
 
 	return dev ? rd_type(types, (unsigned int)
dev->vol.map.raid_level) :
 		     t_group;
 }
 
-int is_raid10(struct isw *isw)
+int is_raid10(struct isw_dev *dev)
 {
 	int ret;
-	struct isw_dev *dev = (struct isw_dev*) (isw->disk +
isw->num_disks);
 
 	ret = ((dev->vol.map.raid_level == ISW_T_RAID10) ||
-			(dev->vol.map.raid_level == ISW_T_RAID1 &&
-			isw->num_disks > 3));
+				(dev->vol.map.raid_level == ISW_T_RAID1
&& 
+				dev->vol.map.num_members > 3));
 
 	return ret;
 }
@@ -341,8 +337,7 @@
 }
 
 /* Check for RAID disk ok. */
-static int disk_ok(struct lib_context *lc, struct dev_info *di,
-						struct isw *isw)
+static int disk_ok(struct lib_context *lc, struct dev_info *di, struct
isw *isw)
 {
 	struct isw_disk *disk = get_disk(lc, di, isw);
 
@@ -358,7 +353,7 @@
 	struct isw *isw;
 
 	if (!(isw = alloc_private_and_read(lc, handler, size,
-					di->path, isw_sboffset)))
+						di->path,
isw_sboffset)))
 		goto out;
 
 	/*
@@ -466,6 +461,7 @@
 		goto free;
 	memcpy(r->private.ptr, dev, sizeof(*dev));
 
+
 	if (!(r->meta_areas = alloc_meta_areas(lc, rd, handler, 1)))
 		return 0;
 
@@ -473,13 +469,13 @@
 	r->meta_areas->size = rd->meta_areas->size; 
 	r->meta_areas->area = rd->meta_areas->area; 
 
-	if ((r->type = type(isw)) == t_undef) {
+	if ((r->type = type(dev)) == t_undef) {
 		log_err(lc, "%s: RAID type %u not supported",
 			handler, (unsigned int)
dev->vol.map.raid_level);
 		goto free;
 	}
 
-        if (!(r->name = name(lc, rd, 1)))
+        if (!(r->name = name(lc, rd, dev, 1)))
 		goto free;
 
 	r->di = rd->di;
@@ -527,8 +523,8 @@
  * and shall be returned on success (or NULL on error).
  */
 static struct raid_set *group_rd(struct lib_context *lc,
-				struct raid_set *rs_group,
-				struct raid_dev *rd_meta)
+					struct raid_set *rs_group,
+					struct raid_dev *rd_meta)
 {
 	unsigned int d;
 	void *private;
@@ -545,10 +541,11 @@
 		if (!(rd = _create_rd(lc, rd_meta, isw, dev)))
 			return NULL;
 
-		if(is_raid10(isw)) {
-			nm = name(lc, rd, 0);
-			ss = find_or_alloc_raid_set(lc, nm, FIND_TOP,
rd,
-						LC_RS(lc),
super_created, dev);
+		if(is_raid10(dev)) {
+			nm = name(lc, rd, dev, 0);
+			ss = find_or_alloc_raid_set(lc, nm, FIND_ALL,
rd,
+					 &rs_group->sets, super_created,
dev);
+
 	 		if (!(rs = find_or_alloc_raid_set(lc, rd->name,
 					FIND_ALL, rd, &ss->sets,
create_rs,
 					dev))) {
@@ -556,7 +553,7 @@
 				return NULL;
 			}
 		} else {
-			if (!(rs = find_or_alloc_raid_set(lc, rd->name,
+			if (!(rs = find_or_alloc_raid_set(lc, rd->name, 
 						FIND_ALL, rd,
&rs_group->sets,
 						create_rs, dev))) {
 				free_raid_dev(lc, &rd);
@@ -573,11 +570,6 @@
 		/* Restore. */
 		rd->private.ptr = private;
 
-		if(is_raid10(isw)) {
-			ss = join_superset(lc, name, super_created,
set_sort,
-								rs, rd);
-			return ss;
-		}
 	}
 
 	return rs_group;
@@ -585,35 +577,35 @@
 
 /* Add an Intel SW RAID device to a set */
 static struct raid_set *isw_group(struct lib_context *lc,
-		struct raid_dev *rd_meta)
+					struct raid_dev *rd_meta)
 {
 	struct raid_set *rs_group = NULL;
-	struct isw *isw = META(rd_meta, isw);
 
 	if (T_SPARE(rd_meta))
 		return NULL;
 
-	if(!is_raid10(isw)) {
-		/*
-	 	* Once we get here, an Intel SW RAID disk containing a
metadata
-		* area with a volume table has been discovered by
isw_read.
-	 	*/
-		/* Check if a top level group RAID set already exists.
*/
-		if (!(rs_group = find_or_alloc_raid_set(lc,
rd_meta->name,
-				FIND_TOP, rd_meta, LC_RS(lc),
-				NO_CREATE, NO_CREATE_ARG)))
-			return NULL;
+	/*
+	 * Once we get here, an Intel SW RAID disk containing a metadata
area
+	 * with a volume table has been discovered by isw_read. There is
one 
+	 * goup RAID set for each metadata configuration. The volume
defined in
+	 * the metadata is a subset of the group RAID set.
+	 */
+		
+	 /* Check if a top level group RAID set already exists. */
+	if (!(rs_group = find_or_alloc_raid_set(lc, rd_meta->name,
FIND_TOP,
+				      		rd_meta, LC_RS(lc),
+						NO_CREATE,
NO_CREATE_ARG)))
+		return NULL;
 
-		/*
-	 	* Add the whole underlying (meta) RAID device to the
group set.
-	 	* Sorting is no problem here, because RAID sets and
devices
-	 	* will be created for all the Volumes of an ISW set and
those
-		* need sorting.
-	 	*/
-		rd_meta->private.ptr = rd_meta->meta_areas->area;
-		list_add_sorted(lc, &rs_group->devs, &rd_meta->devs,
dev_sort);
-		rd_meta->private.ptr = NULL;
-	}
+	/*
+	 * Add the whole underlying (meta) RAID device to the group set.
+	 * Sorting is no problem here, because RAID sets and devices
will
+	 * be created for all the Volumes of an ISW set and those need
sorting.
+	*/
+	rd_meta->private.ptr = rd_meta->meta_areas->area;
+	list_add_sorted(lc, &rs_group->devs, &rd_meta->devs, dev_sort);
+	rd_meta->private.ptr = NULL;
+	
 
 	/*
 	 * We need to run through the volume table and create a RAID set
and
@@ -651,18 +643,23 @@
 
 static int _isw_check(struct lib_context *lc, struct raid_set *rs)
 {
-	return check_raid_set(lc, rs, devices, NULL, check_rd, NULL,
handler);
+        struct raid_set *r;
+	
+	list_for_each_entry(r, &rs->sets, list) {
+		if(SETS(r))
+			check_raid_set(lc, r, devices, NULL,
+						NO_CHECK_RD, NULL,
handler);
+		else
+			check_raid_set(lc, r, devices, NULL, check_rd,
+								NULL,
handler);
+	}
+	return 1;
 }
 
 static int isw_check(struct lib_context *lc, struct raid_set *rs)
 {
-	/* If it is a stacked set like RAID10 */
-	if((!T_GROUP(rs)) && SETS(rs)) {
-		return check_raid_set(lc, rs, devices, NULL,
-				NO_CHECK_RD, NULL, handler);
-	} else {
-		return T_GROUP(rs) ? _isw_check(lc, rs) : 0;
-	}
+	return T_GROUP(rs) ? _isw_check(lc, rs) : 0;
+	
 }
 /*
  * IO error event handler.
@@ -886,7 +883,7 @@
 	rd->status = status(lc, rd);
 	rd->type   = t_group;
 
-        return (rd->name = name(lc, rd, 2)) ? 1 : 0;
+        return (rd->name = name(lc, rd, NULL, 2)) ? 1 : 0;
 }
 
 




More information about the Ataraid-list mailing list