Improve zvol symlink handling.

Change the zvol helper program to replace any embedded spaces
in the pool or dataset names with '+' to ensure we have valid
symlinks.

The '+' character was choosen because it is not a valid character
for a dataset name but it is allowed by udev.  This ensures that
all dataset names with an embedded space will be translated to
a unique /dev/zvol/ symlink.

Signed-off-by: Dan Swartzendruber <dswartz@druber.com>
Signed-off-by: Darik Horn <dajhorn@vanadac.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2834
This commit is contained in:
Dan Swartzendruber 2014-10-28 21:29:53 -04:00 committed by Brian Behlendorf
parent 11662bf969
commit 5f91bd3dea

View File

@ -23,6 +23,8 @@
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#include <ctype.h>
#include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h> #include <fcntl.h>
@ -56,6 +58,7 @@ main(int argc, char **argv)
char *dev_name; char *dev_name;
struct stat64 statbuf; struct stat64 statbuf;
int dev_minor, dev_part; int dev_minor, dev_part;
int i;
if (argc < 2) { if (argc < 2) {
printf("Usage: %s /dev/zvol_device_node\n", argv[0]); printf("Usage: %s /dev/zvol_device_node\n", argv[0]);
@ -89,6 +92,11 @@ main(int argc, char **argv)
else else
snprintf(zvol_name_part, ZFS_MAXNAMELEN, "%s", zvol_name); snprintf(zvol_name_part, ZFS_MAXNAMELEN, "%s", zvol_name);
for (i = 0; i < strlen(zvol_name_part); i++) {
if (isblank(zvol_name_part[i]))
zvol_name_part[i] = '+';
}
printf("%s\n", zvol_name_part); printf("%s\n", zvol_name_part);
close(fd); close(fd);
return (error); return (error);