From 93664d38d26afb1086fc4a56ef9e6e58dcb1a3ec Mon Sep 17 00:00:00 2001 From: Pavel Butsykin Date: Thu, 13 Apr 2017 19:44:06 +0300 Subject: [PATCH] daemon: run 'udevadm settle' with --exit-if-exists option Add udev_settle_file() to run 'udevadm settle' with --exit-if-exists option. It will slightly reduce the waiting-time for pending events if we need to wait for events related to a particular device/file. Signed-off-by: Pavel Butsykin RWMJ: - Use local variable for MAX_ARGS. - Use commandv instead of commandrv, fix checking of return code. --- daemon/daemon.h | 2 ++ daemon/guestfsd.c | 32 +++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/daemon/daemon.h b/daemon/daemon.h index abec087cd..332e2966a 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -142,6 +142,8 @@ extern int parse_btrfsvol (const char *desc, mountable_t *mountable); extern int prog_exists (const char *prog); +extern void udev_settle_file (const char *file); + extern void udev_settle (void); extern int random_name (char *template); diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index a848fe139..1daa46471 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -1213,20 +1213,34 @@ random_name (char *template) * fussed if it fails. */ void -udev_settle (void) +udev_settle_file (const char *file) { - char cmd[80]; + const size_t MAX_ARGS = 64; + const char *argv[MAX_ARGS]; + CLEANUP_FREE char *err = NULL; + size_t i = 0; int r; - snprintf (cmd, sizeof cmd, "%s%s settle", - str_udevadm, verbose ? " --debug" : ""); + ADD_ARG (argv, i, str_udevadm); if (verbose) - printf ("%s\n", cmd); - r = system (cmd); + ADD_ARG (argv, i, "--debug"); + + ADD_ARG (argv, i, "settle"); + if (file) { + ADD_ARG (argv, i, "-E"); + ADD_ARG (argv, i, file); + } + ADD_ARG (argv, i, NULL); + + r = commandv (NULL, &err, argv); if (r == -1) - perror ("system"); - else if (!WIFEXITED (r) || WEXITSTATUS (r) != 0) - fprintf (stderr, "warning: udevadm command failed\n"); + fprintf (stderr, "udevadm settle: %s\n", err); +} + +void +udev_settle (void) +{ + udev_settle_file (NULL); } char *