git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Retry removal of busy minors
[zfs.git]
/
lib
/
libzfs
/
libzfs_util.c
diff --git
a/lib/libzfs/libzfs_util.c
b/lib/libzfs/libzfs_util.c
index
da1b9bc
..
982a6f0
100644
(file)
--- a/
lib/libzfs/libzfs_util.c
+++ b/
lib/libzfs/libzfs_util.c
@@
-635,15
+635,22
@@
int
libzfs_run_process(const char *path, char *argv[], int flags)
{
pid_t pid;
libzfs_run_process(const char *path, char *argv[], int flags)
{
pid_t pid;
- int rc;
+ int rc
, devnull_fd
;
pid = vfork();
if (pid == 0) {
pid = vfork();
if (pid == 0) {
+ devnull_fd = open("/dev/null", O_WRONLY);
+
+ if (devnull_fd < 0)
+ _exit(-1);
+
if (!(flags & STDOUT_VERBOSE))
if (!(flags & STDOUT_VERBOSE))
-
close(
STDOUT_FILENO);
+
(void) dup2(devnull_fd,
STDOUT_FILENO);
if (!(flags & STDERR_VERBOSE))
if (!(flags & STDERR_VERBOSE))
- close(STDERR_FILENO);
+ (void) dup2(devnull_fd, STDERR_FILENO);
+
+ close(devnull_fd);
(void) execvp(path, argv);
_exit(-1);
(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;
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);
(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);
}
(void) snprintf(path, pathlen, "%s/%s/%s",
UDISK_ROOT, dirs[i], name);
err = access(path, F_OK);
}
- return err;
+
+ return (err);
}
/*
}
/*
@@
-1186,11
+1206,14
@@
str2shift(libzfs_handle_t *hdl, const char *buf)
}
/*
}
/*
- *
We want to allow trailing 'b' characters for 'GB' or 'Mb'. But don't
- *
allow 'BB' - that's just weir
d.
+ *
Allow 'G' = 'GB' = 'GiB', case-insensitively.
+ *
However, 'BB' and 'BiB' are disallowe
d.
*/
*/
- if (buf[1] == '\0' || (toupper(buf[1]) == 'B' && buf[2] == '\0' &&
- toupper(buf[0]) != 'B'))
+ if (buf[1] == '\0' ||
+ (toupper(buf[0]) != 'B' &&
+ ((toupper(buf[1]) == 'B' && buf[2] == '\0') ||
+ (toupper(buf[1]) == 'I' && toupper(buf[2]) == 'B' &&
+ buf[3] == '\0'))))
return (10*i);
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
return (10*i);
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,