multipath assumes pathnames are block devices
PATCH 1/1 multipath assumes pathnames are block devices
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
When a name is passed on the multipath command line, multipath assumes it is a block device if it appears in the filesystem:
multipath/main.c:386:
if (filepresent(conf->dev))
conf->dev_type = DEV_DEVNODE;
else if (sscanf(conf->dev, "%d:%d", &i, &i) == 2)
conf->dev_type = DEV_DEVT;
else
conf->dev_type = DEV_DEVMAP;This conflicts with the use of "-f" (flush map by name), in the case that a file of the same name as the map exists in the current directory:
$ multipath -f mpath0 $ touch mpath0 $ multipath -f mpath0 must provide a map name to remove
The attached patch avoids this by adding a new function isblockdev() to libmultipath/util.c and adding this to the DEV_DEVNODE condition. This also means that we check for the case that what the user passed was a character device, fifo etc.
It's probably also worth changing "-f" option to take an explicit mapname argument, rather than just using argv[optind] after option processing - I'll send another patch for that.
Kind regards,
Bryn.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iD8DBQFFq+W/6YSQoMYUY94RAojDAKDD+0xeACwY8S/ommZw6SX0pw8Z1gCcDzhV ZkYc0ZtRHPxRQzk+JO5zDkU=
=azH8
-----END PGP SIGNATURE-----
libmultipath/util.c +10 -0
@@ -53,6 +53,16 @@ filepresent (char * run) { }int +isblockdev (char * run) { +struct stat buf; + +if (stat (run, &buf)) +return 0 ; + +return S_ISBLK (buf.st_mode); +} + +int get_word (char * sentence,char ** word) {char * p;
multipath/main.c +1 -1
@@ -383,7 +383,7 @@ main (int argc, char *argv[])strncpy (conf->dev, argv[optind],FILE_NAME_SIZE ); -if (filepresent (conf->dev)) +if (filepresent (conf->dev) &&isblockdev (conf->dev)) conf->dev_type =DEV_DEVNODE ;else if (sscanf (conf->dev,"%d:%d" , &i, &i) ==2 ) conf->dev_type =DEV_DEVT ;