[libvirt] [PATCH 2/2]: Call udevsettle in the appropriate places
Daniel P. Berrange
berrange at redhat.com
Wed Nov 26 20:44:55 UTC 2008
On Wed, Nov 26, 2008 at 05:08:49PM +0100, Chris Lalancette wrote:
> Instead of relying solely on polling for /dev devices to appear in libvirt, we
> really should be synchronizing against udev. This is generally done by a call
> to udevsettle, which is exactly what this patch implements for the storage
> backends that are likely to create new /dev nodes. I believe I've read that
> even after udevsettle, you are not guaranteed that devices are all the way
> created, so we still need the polling in the rest of the sources, but this
> should give us a much better chance of things existing as we expect.
>
> Signed-off-by: Chris Lalancette <clalance at redhat.com>
> Index: src/storage_backend.c
> ===================================================================
> RCS file: /data/cvs/libvirt/src/storage_backend.c,v
> retrieving revision 1.29
> diff -u -r1.29 storage_backend.c
> --- a/src/storage_backend.c 17 Nov 2008 11:19:33 -0000 1.29
> +++ b/src/storage_backend.c 26 Nov 2008 12:40:19 -0000
> @@ -270,6 +270,20 @@
> return 0;
> }
>
> +void virStorageBackendWaitForDevices(virConnectPtr conn)
> +{
> + const char *const settleprog[] = { UDEVSETTLE, NULL };
> + int exitstatus;
> +
> + /*
> + * NOTE: we ignore errors here; this is just to make sure that any device
> + * nodes that are being created finish before we try to
> + * scan them. If this fails (udevsettle exits badly, or doesn't exist
> + * at all), then we still have a fallback mechanism anyway.
> + */
> + virRun(conn, settleprog, &exitstatus);
> +}
If we know it doesn't exist, we should not try to run it.
> Index: configure.in
> ===================================================================
> RCS file: /data/cvs/libvirt/configure.in,v
> retrieving revision 1.187
> diff -u -r1.187 configure.in
> --- a/configure.in 25 Nov 2008 15:48:11 -0000 1.187
> +++ b/configure.in 26 Nov 2008 12:40:19 -0000
> @@ -115,11 +115,15 @@
> [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
> AC_PATH_PROG([BRCTL], [brctl], [brctl],
> [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
> +AC_PATH_PROG([UDEVSETTLE], [udevsettle], [udevsettle],
> + [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
This will set UDEVSETTLE=udevsettle even if it doesn't exist. This will
result in us running it on every OS we build on. We should not set this
variable if its not found.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list