[lvm-devel] LVM2/lib/device dev-md.c device.c device.h

snitzer at sourceware.org snitzer at sourceware.org
Sat Aug 1 17:11:02 UTC 2009


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	snitzer at sourceware.org	2009-08-01 17:11:02

Modified files:
	lib/device     : dev-md.c device.c device.h 

Log message:
	Retrieve MD sysfs attributes for MD partitions
	
	Rename private _primary_dev() to a public get_primary_dev() and reuse it
	to allow retrieval of the MD sysfs attributes (raid level, etc) for MD
	partitions.
	
	Signed-off-by: Mike Snitzer <snitzer at redhat.com>

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/device/dev-md.c.diff?cvsroot=lvm2&r1=1.16&r2=1.17
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/device/device.c.diff?cvsroot=lvm2&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/device/device.h.diff?cvsroot=lvm2&r1=1.42&r2=1.43

--- LVM2/lib/device/dev-md.c	2009/07/20 18:44:13	1.16
+++ LVM2/lib/device/dev-md.c	2009/08/01 17:11:02	1.17
@@ -127,20 +127,25 @@
 
 static int _md_sysfs_attribute_snprintf(char *path, size_t size,
 					const char *sysfs_dir,
-					struct device *dev,
+					struct device *blkdev,
 					const char *attribute)
 {
 	struct stat info;
+	dev_t dev = blkdev->dev;
 	int ret = -1;
 
-	if (MAJOR(dev->dev) != md_major())
+	if (!sysfs_dir || !*sysfs_dir)
 		return ret;
 
-	if (!sysfs_dir || !*sysfs_dir)
+check_md_major:
+	if (MAJOR(dev) != md_major()) {
+		if (get_primary_dev(sysfs_dir, blkdev, &dev))
+			goto check_md_major;
 		return ret;
+	}
 
 	ret = dm_snprintf(path, size, "%s/dev/block/%d:%d/md/%s", sysfs_dir,
-			  (int)MAJOR(dev->dev), (int)MINOR(dev->dev), attribute);
+			  (int)MAJOR(dev), (int)MINOR(dev), attribute);
 	if (ret < 0) {
 		log_error("dm_snprintf md %s failed", attribute);
 		return ret;
@@ -149,7 +154,7 @@
 	if (stat(path, &info) < 0) {
 		/* old sysfs structure */
 		ret = dm_snprintf(path, size, "%s/block/md%d/md/%s",
-				  sysfs_dir, (int)MINOR(dev->dev), attribute);
+				  sysfs_dir, (int)MINOR(dev), attribute);
 		if (ret < 0) {
 			log_error("dm_snprintf old md %s failed", attribute);
 			return ret;
--- LVM2/lib/device/device.c	2009/08/01 17:09:48	1.30
+++ LVM2/lib/device/device.c	2009/08/01 17:11:02	1.31
@@ -286,8 +286,8 @@
 
 #ifdef linux
 
-static int _primary_dev(const char *sysfs_dir,
-			struct device *dev, dev_t *result)
+int get_primary_dev(const char *sysfs_dir,
+		    struct device *dev, dev_t *result)
 {
 	char path[PATH_MAX+1];
 	char temp_path[PATH_MAX+1];
@@ -387,7 +387,7 @@
 	 *   or the device could be a partition
 	 */
 	if (stat(path, &info) < 0) {
-		if (!_primary_dev(sysfs_dir, dev, &primary))
+		if (!get_primary_dev(sysfs_dir, dev, &primary))
 			return 0;
 
 		/* get attribute from partition's primary device */
@@ -450,6 +450,12 @@
 
 #else
 
+int get_primary_dev(const char *sysfs_dir,
+		    struct device *dev, dev_t *result)
+{
+	return 0;
+}
+
 unsigned long dev_alignment_offset(const char *sysfs_dir,
 				   struct device *dev)
 {
--- LVM2/lib/device/device.h	2009/08/01 17:08:44	1.42
+++ LVM2/lib/device/device.h	2009/08/01 17:11:02	1.43
@@ -100,6 +100,9 @@
 
 int is_partitioned_dev(struct device *dev);
 
+int get_primary_dev(const char *sysfs_dir,
+		    struct device *dev, dev_t *result);
+
 unsigned long dev_alignment_offset(const char *sysfs_dir,
 				   struct device *dev);
 




More information about the lvm-devel mailing list