]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libdisk: use major/minor when calling dmsetup
authorEric Sandeen <sandeen@redhat.com>
Tue, 15 Sep 2009 14:47:24 +0000 (09:47 -0500)
committerEric Sandeen <sandeen@redhat.com>
Tue, 15 Sep 2009 14:47:24 +0000 (09:47 -0500)
In RH bugzilla,
[Bug 471102] Error message seen during mkfs.xfs on multipath device
(unfortunately marked private) reports problems when making xfs
fileystems on multipath devices:

# mkfs -t xfs -f /dev/mpath/oramp4
dm_task_set_name: Device /dev/dm-12 not found
Command failed
dm_task_set_name: Device /dev/dm-12 not found
Command failed
meta-data=/dev/mpath/oramp4      isize=256    agcount=4, agsize=2359680 blks
...

This is because dmsetup takes a "name" which is sometimes, but not
always (I think) the same as the device name.

dmsetup also can take major/minor as arguments, so this may be
simpler at this point.

Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Christoph Hellwig <hch@lst.de>
libdisk/dm.c

index fd91164babe1599e2632500307bdfc5be19cedf3..dfc1f375b1f4e684b630dc66f28b274b9ba7fd65 100644 (file)
@@ -36,10 +36,11 @@ dm_get_subvol_stripe(
 {
        int             count, stripes = 0, stripesize = 0;
        int             dmpipe[2];
-       char            *dpath, *largv[4], tmppath[PATH_MAX];
+       char            *largv[7];
        FILE            *stream;
        long long       offset, size;
        static char     *command = "table";     /* dmsetup table /dev/xxx */
+       char            major_str[4], minor_str[4];
 
        if (!mnt_is_dm_subvol(sb->st_rdev))
                return 0;
@@ -57,16 +58,15 @@ dm_get_subvol_stripe(
                return 0;
        }
 
-       if (!(dpath = realpath(dfile, tmppath))) {
-               fprintf(stderr,
-       _("Warning - device mapper device, but cannot resolve path %s: %s\n"),
-                       dfile, strerror(errno));
-               return 0;
-       }
+       snprintf(major_str, 4, "%d", major(sb->st_rdev));
+       snprintf(minor_str, 4, "%d", minor(sb->st_rdev));
 
        largv[1] = command;
-       largv[2] = dpath;
-       largv[3] = NULL;
+       largv[2] = "-j";
+       largv[3] = major_str;
+       largv[4] = "-m";
+       largv[5] = minor_str;
+       largv[6] = NULL;
 
        /* Open pipe */
        if (pipe(dmpipe) < 0) {