[libvirt] [PATCH] Avoid deadlock on logging mutex due to fork in virFileCreate/virDirCreate.
Daniel Veillard
veillard at redhat.com
Wed Feb 3 16:22:35 UTC 2010
On Wed, Feb 03, 2010 at 10:27:32AM -0500, Laine Stump wrote:
> These functions have the same potential problem that Cole found in
> virExec - if the log mutex is currently held at the time of the fork,
> the child process' logging mutex will be locked, but nobody in the
> process to unlock it. If the child process tries to log anything, it
> will wait forever for this lock. The solution is to have the parent
> acquire the lock before fork, then both parent and child release the
> lock right after.
>
> Note that this patch requires Cole's patch to be applied first.
> ---
> src/util/util.c | 12 ++++++++++--
> 1 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/src/util/util.c b/src/util/util.c
> index 901c0d2..d8a2394 100644
> --- a/src/util/util.c
> +++ b/src/util/util.c
> @@ -1263,7 +1263,11 @@ int virFileCreate(const char *path, mode_t mode,
> * following dance avoids problems caused by root-squashing
> * NFS servers. */
>
> - if ((pid = fork()) < 0) {
> + virLogLock();
> + pid = fork();
> + virLogUnlock();
> +
> + if (pid < 0) {
> ret = errno;
> virReportSystemError(NULL, errno,
> _("cannot fork o create file '%s'"), path);
> @@ -1369,7 +1373,11 @@ int virDirCreate(const char *path, mode_t mode,
> return virDirCreateSimple(path, mode, uid, gid, flags);
> }
>
> - if ((pid = fork()) < 0) {
> + virLogLock();
> + pid = fork();
> + virLogUnlock();
> +
> + if (pid < 0) {
> ret = errno;
> virReportSystemError(NULL, errno,
> _("cannot fork to create directory '%s'"),
Okay, makes sense, ACK, and applied !
Maybe at some point a wrapper around fork() may be nicer.
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list