[libvirt] [PATCH] Avoid deadlock on logging mutex due to fork in virFileCreate/virDirCreate.

Laine Stump laine at laine.org
Wed Feb 3 17:06:57 UTC 2010


On 02/03/2010 11:22 AM, Daniel Veillard wrote:
> 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.
>    

My thoughts exactly! (didn't want to do it right now though - too much 
potential for disaster). This wrapper should also take the signal race 
problem into account.




More information about the libvir-list mailing list