Illumos #1949, #1953
[zfs.git] / lib / libzfs / libzfs_util.c
index f55b658..982a6f0 100644 (file)
@@ -635,15 +635,22 @@ int
 libzfs_run_process(const char *path, char *argv[], int flags)
 {
        pid_t pid;
-       int rc;
+       int rc, devnull_fd;
 
        pid = vfork();
        if (pid == 0) {
+               devnull_fd = open("/dev/null", O_WRONLY);
+
+               if (devnull_fd < 0)
+                       _exit(-1);
+
                if (!(flags & STDOUT_VERBOSE))
-                       close(STDOUT_FILENO);
+                       (void) dup2(devnull_fd, STDOUT_FILENO);
 
                if (!(flags & STDERR_VERBOSE))
-                       close(STDERR_FILENO);
+                       (void) dup2(devnull_fd, STDERR_FILENO);
+
+               close(devnull_fd);
 
                (void) execvp(path, argv);
                _exit(-1);
@@ -814,16 +821,29 @@ int
 zfs_resolve_shortname(const char *name, char *path, size_t pathlen)
 {
        int i, err;
-       char dirs[5][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool"};
+       char dirs[6][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool",
+                          "by-vdev"};
 
+       /* /dev/ */
        (void) snprintf(path, pathlen, "%s/%s", DISK_ROOT, name);
        err = access(path, F_OK);
-       for (i = 0; i < 5 && err < 0; i++) {
+       if (err == 0)
+               return (err);
+
+       /* /dev/mapper/ */
+       (void) snprintf(path, pathlen, "%s/mapper/%s", DISK_ROOT, name);
+       err = access(path, F_OK);
+       if (err == 0)
+               return (err);
+
+       /* /dev/disk/<dirs>/ */
+       for (i = 0; i < 6 && err < 0; i++) {
                (void) snprintf(path, pathlen, "%s/%s/%s",
                    UDISK_ROOT, dirs[i], name);
                err = access(path, F_OK);
        }
-       return err;
+
+       return (err);
 }
 
 /*