[libvirt] [PATCH v2 5/5] qemu: Use transactions from security driver

Michal Privoznik mprivozn at redhat.com
Tue Jan 10 12:15:01 UTC 2017


On 01/09/2017 11:18 PM, John Ferlan wrote:
> 
> 
> On 01/09/2017 07:58 AM, Michal Privoznik wrote:
>> So far if qemu is spawned under separate mount namespace in order
>> to relabel everything it needs an access to the security driver
>> is run in that namespace too. This has a very nasty down side -
> 
> s/is/to/
> 
>> it is being run in a separate process, so any internal state
>> transition is NOT reflected in the dameon. This can lead to many
> 
> s/dameon/daemon
> 
>> sleepless nights. Therefore, use the transaction APIs so that
>> libvirt developers can sleep tight again.
> 
> Having trouble sleeping lately? ;-)
> 
> 
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  src/qemu/qemu_security.c | 100 ++++++++++++++---------------------------------
>>  1 file changed, 30 insertions(+), 70 deletions(-)
>>
>> diff --git a/src/qemu/qemu_security.c b/src/qemu/qemu_security.c
>> index 9ab91e9f2..544feeb4a 100644
>> --- a/src/qemu/qemu_security.c
>> +++ b/src/qemu/qemu_security.c
>> @@ -40,66 +40,31 @@ struct qemuSecuritySetRestoreAllLabelData {
>>  };
>>  
>>  
>> -static int
>> -qemuSecuritySetRestoreAllLabelHelper(pid_t pid,
>> -                                     void *opaque)
>> -{
>> -    struct qemuSecuritySetRestoreAllLabelData *data = opaque;
>> -
>> -    virSecurityManagerPostFork(data->driver->securityManager);
>> -
>> -    if (data->set) {
>> -        VIR_DEBUG("Setting up security labels inside namespace pid=%lld",
>> -                  (long long) pid);
>> -        if (virSecurityManagerSetAllLabel(data->driver->securityManager,
>> -                                          data->vm->def,
>> -                                          data->stdin_path) < 0)
>> -            return -1;
>> -    } else {
>> -        VIR_DEBUG("Restoring security labels inside namespace pid=%lld",
>> -                  (long long) pid);
>> -        if (virSecurityManagerRestoreAllLabel(data->driver->securityManager,
>> -                                              data->vm->def,
>> -                                              data->migrated) < 0)
>> -            return -1;
>> -    }
>> -
>> -    return 0;
>> -}
>> -
>> -
>>  int
>>  qemuSecuritySetAllLabel(virQEMUDriverPtr driver,
>>                          virDomainObjPtr vm,
>>                          const char *stdin_path)
>>  {
>> -    struct qemuSecuritySetRestoreAllLabelData data;
>> +    int ret = -1;
>>  
>> -    memset(&data, 0, sizeof(data));
>> +    if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT) &&
>> +        virSecurityManagerTransactionStart(driver->securityManager) < 0)
>> +        goto cleanup;
>>  
>> -    data.set = true;
>> -    data.driver = driver;
>> -    data.vm = vm;
>> -    data.stdin_path = stdin_path;
>> +    if (virSecurityManagerSetAllLabel(driver->securityManager,
>> +                                      vm->def,
>> +                                      stdin_path) < 0)
>> +        goto cleanup;
>>  
>> -    if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT)) {
>> -        if (virSecurityManagerPreFork(driver->securityManager) < 0)
>> -            return -1;
> 
> Both paths have removed the PreFork/PostFork processing... Is that then
> no longer required?  This is/was the only PreFork caller I think.


Yes, it is no longer required. There is no fork() happening in
virSecurityManagerSetAllLabel() anymore.

Michal




More information about the libvir-list mailing list