[Parted-maintainers] Bug#367965: Bug #367965: updated dpatch

David Härdeman david at 2gen.com
Wed May 31 21:51:02 BST 2006


I've attached a new lvm/dm dpatch which has been updated for parted 1.7.1.

Regards,
David
-------------- next part --------------
#! /bin/sh -e
## lvm2.dpatch by Andres Salomon <dilinger at voxel.net>
##
## DP: Find LVM2 devices by looking in /dev/mapper
## DP: Closes: #247174
## DP: Upstream objected to merging, will stay debian specific for now.
## DP: Patch generalized by David H?rdeman <david at 2gen.com>
## DP: Now covers all types of device-mapper devices (dm-crypt, lvm, etc)
## DP: Refreshed for 1.7.1

. `dirname $0`/DPATCH

@DPATCH@
diff -urNad parted-1.7.1~/include/parted/device.h parted-1.7.1/include/parted/device.h
--- parted-1.7.1~/include/parted/device.h	2006-05-25 19:28:43.000000000 +0200
+++ parted-1.7.1/include/parted/device.h	2006-05-31 21:48:03.000000000 +0200
@@ -42,7 +42,8 @@
         PED_DEVICE_FILE         = 5,
         PED_DEVICE_ATARAID      = 6,
         PED_DEVICE_I2O          = 7,
-        PED_DEVICE_UBD          = 8
+        PED_DEVICE_UBD          = 8,
+        PED_DEVICE_DM           = 9
 } PedDeviceType;
 
 typedef struct _PedDevice PedDevice;
diff -urNad parted-1.7.1~/libparted/arch/linux.c parted-1.7.1/libparted/arch/linux.c
--- parted-1.7.1~/libparted/arch/linux.c	2006-05-08 20:08:37.000000000 +0200
+++ parted-1.7.1/libparted/arch/linux.c	2006-05-31 22:05:20.000000000 +0200
@@ -270,6 +270,37 @@
 }
 
 static int
+_is_dm_major (int major)
+{
+	FILE*           proc_devices;
+	static int      dm_major = 0;
+	int             tmp_major;
+	char            buf [512];
+	char            dev_name [32];
+
+	if (!dm_major) {
+		/* Obtain the major number for lvm devices; this is listed in
+		 * /proc/devices, under the device-mapper entry.
+		 */
+
+		proc_devices = fopen ("/proc/devices", "r");
+		if (!proc_devices)
+			return 0;
+
+		while (fgets (buf, 512, proc_devices)) {
+			if (sscanf (buf, "%d %31s", &tmp_major, dev_name) == 2 &&
+			    strcmp (dev_name, "device-mapper") == 0) {
+				dm_major = tmp_major;
+				break;
+			}
+		}
+		fclose (proc_devices);
+	}
+
+	return major == dm_major;
+}
+
+static int
 _device_stat (PedDevice* dev, struct stat * dev_stat)
 {
         PED_ASSERT (dev != NULL, return 0);
@@ -324,6 +355,8 @@
                 dev->type = PED_DEVICE_CPQARRAY;
         } else if (dev_major == UBD_MAJOR && (dev_minor % 0x10 == 0)) {
                 dev->type = PED_DEVICE_UBD;
+	} else if (_is_dm_major (dev_major)) {
+		dev->type = PED_DEVICE_DM;
         } else {
                 dev->type = PED_DEVICE_UNKNOWN;
         }
@@ -925,6 +958,11 @@
                         goto error_free_dev;
                 break;
 
+	case PED_DEVICE_DM:
+		if (!init_generic (dev, _("Linux device-mapper")))
+			goto error_free_dev;
+		break;
+
         case PED_DEVICE_FILE:
                 if (!init_file (dev))
                         goto error_free_arch_specific;
@@ -1498,6 +1536,39 @@
 }
 
 static int
+_probe_dm_devices ()
+{
+	DIR*            mapper_dir;
+	struct dirent*  dent;
+	char            buf [512];      /* readdir(3) claims d_name[256] */
+	struct stat     st;
+
+	mapper_dir = opendir ("/dev/mapper");
+	if (!mapper_dir)
+		return 0;
+
+	/* Search the /dev/mapper directory for devices w/ the same major
+	 * number that was returned from _probe_lvm_major().
+	 */
+	while ((dent = readdir (mapper_dir))) {
+		if (strcmp (dent->d_name, ".")  == 0 ||
+		    strcmp (dent->d_name, "..") == 0)
+			continue;
+
+		snprintf (buf, sizeof (buf), "/dev/mapper/%s", dent->d_name);
+
+		if (stat (buf, &st) != 0)
+			continue;
+
+		if (_is_dm_major(major(st.st_rdev)))
+			_ped_device_probe (buf);
+	}
+	closedir (mapper_dir);
+
+	return 1;
+}
+
+static int
 _probe_proc_partitions ()
 {
         FILE*           proc_part_file;
@@ -1640,6 +1711,12 @@
        else
                _probe_standard_devices ();
 
+	/* device-mapper devices aren't listed in /proc/partitions; or, if they are,
+	 * they're listed as dm-X.  So, instead of relying on that, we do
+	 * our own checks.
+	 */
+	_probe_dm_devices ();
+
  	/* /sys/block is more reliable and consistent; fall back to using
  	 * /proc/partitions if the former is unavailable, however.
  	 */
@@ -1665,6 +1742,8 @@
                 /* replace /disc with /path%d */
                 strcpy (result, dev->path);
                 snprintf (result + path_len - 5, 16, "/part%d", num);
+	} else if (dev->type == PED_DEVICE_DM) {
+		strcpy (result, dev->path);
         } else if (dev->type == PED_DEVICE_DAC960
                         || dev->type == PED_DEVICE_CPQARRAY
                         || dev->type == PED_DEVICE_ATARAID
@@ -1926,7 +2005,8 @@
 static int
 linux_disk_commit (PedDisk* disk)
 {
-        if (disk->dev->type != PED_DEVICE_FILE) {
+        if (disk->dev->type != PED_DEVICE_FILE &&
+	    disk->dev->type != PED_DEVICE_DM) {
                 /* The ioctl() command BLKPG_ADD_PARTITION does not notify
                  * the devfs system; consequently, /proc/partitions will not
                  * be up to date, and the proper links in /dev are not


More information about the Parted-maintainers mailing list