[libvirt] [PATCH v2] Fix qemu-nbd cleanup crashes
John Ferlan
jferlan at redhat.com
Tue Jul 14 13:12:37 UTC 2015
On 07/10/2015 07:51 AM, Cédric Bosdonnat wrote:
> The virLXCControllerAppendNBDPids function didn't properly initialize
> pids and npids. In case of failure it was crashing when freeing those.
>
> The nbd device pid file doesn't appear immediately after starting
> qemu-nbd: adding a small loop to wait for it.
>
> Diff to v1:
> * Fixed a typo in a variable name.... working with several repos leads
> to troubles ;)
> ---
> src/lxc/lxc_controller.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
This should be two patches...
#1 to just add the NULL for pids and 0 for npids - to fix the crash
#2 to add that loop to wait for the file to appear (and of course the
s/loops/loop or vice versa change
ACK with the split
John
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index 828b8a8..78d3eee 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -533,16 +533,31 @@ static int virLXCControllerAppendNBDPids(virLXCControllerPtr ctrl,
> const char *dev)
> {
> char *pidpath = NULL;
> - pid_t *pids;
> - size_t npids;
> + pid_t *pids = NULL;
> + size_t npids = 0;
> size_t i;
> int ret = -1;
> + size_t loops = 0;
> pid_t pid;
>
> if (!STRPREFIX(dev, "/dev/") ||
> virAsprintf(&pidpath, "/sys/devices/virtual/block/%s/pid", dev + 5) < 0)
> goto cleanup;
>
> + /* Wait for the pid file to appear */
How about wait for up to 1 second for the file to appear - and then
strike the second comment since it'd be duplicitous
> + while (!virFileExists(pidpath)) {
> + /* wait for 100ms before checking again, but don't do it for ever */
> + if (errno == ENOENT && loop < 10) {
> + usleep(100 * 1000);
> + loop++;
> + } else {
> + virReportSystemError(errno,
> + _("Cannot check NBD device %s pid"),
s/%s/'%s'
> + dev + 5);
> + goto cleanup;
> + }
> + }
> +
> if (virPidFileReadPath(pidpath, &pid) < 0)
> goto cleanup;
>
>
More information about the libvir-list
mailing list