[libvirt] [PATCH] replace last instances of close()
Daniel P. Berrange
berrange at redhat.com
Wed Nov 10 10:41:12 UTC 2010
On Tue, Nov 09, 2010 at 07:43:23PM -0500, Stefan Berger wrote:
> I am replacing the last instances of close() I found with VIR_CLOSE() /
> VIR_FORCE_CLOSE respectively.
>
> The first patch of virsh I missed out on previously.
>
> The 2nd patch I had left out intentionally to look at it more carefully:
> The 'closed' variable could be easily removed since it wasn't used
> anywhere else. The possible race condition that could result from the
> filedescriptor being closed and not set to -1 (and possibly let us write
> into 'something' totally different if the fd was allocated by another
> thread) seems to be prevented by the qemuMonitorLock() already placed
> around the code that reads from or writes to the fd. So the change of
> this code as shown in the patch should not have any side-effects.
>
> Signed-off-by: Stefan Berger <stefanb at us.ibm.com>
> --- libvirt-acl.orig/src/qemu/qemu_monitor.c
> +++ libvirt-acl/src/qemu/qemu_monitor.c
> @@ -73,8 +73,6 @@ struct _qemuMonitor {
>
> /* If the monitor EOF callback is currently active (stops more
> commands being run) */
> unsigned eofcb: 1;
> - /* If the monitor is in process of shutting down */
> - unsigned closed: 1;
>
> unsigned json: 1;
> };
> @@ -692,17 +690,11 @@ void qemuMonitorClose(qemuMonitorPtr mon
> VIR_DEBUG("mon=%p", mon);
>
> qemuMonitorLock(mon);
> - if (!mon->closed) {
> +
> + if (mon->fd >= 0) {
> if (mon->watch)
> virEventRemoveHandle(mon->watch);
> - if (mon->fd != -1)
> - close(mon->fd);
> - /* NB: ordinarily one might immediately set mon->watch to -1
> - * and mon->fd to -1, but there may be a callback active
> - * that is still relying on these fields being valid. So
> - * we merely close them, but not clear their values and
> - * use this explicit 'closed' flag to track this state */
> - mon->closed = 1;
> + VIR_FORCE_CLOSE(mon->fd);
> }
Err, the comment you deleted here explains why this change is not
safe.
Regards,
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.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