qemuOpenFile: Move to qemu_domain.c
Move the code to qemu_domain.c so that it can be reused in other parts of the qemu driver. 'qemu_domain' was chosen as the permissions are based on the domain configuration. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
4362068979
commit
19b2d84854
@ -64,6 +64,7 @@
|
|||||||
#include "virdomaincheckpointobjlist.h"
|
#include "virdomaincheckpointobjlist.h"
|
||||||
#include "backup_conf.h"
|
#include "backup_conf.h"
|
||||||
#include "virutil.h"
|
#include "virutil.h"
|
||||||
|
#include "virqemu.h"
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -10825,3 +10826,44 @@ qemuDomainDiskBlockJobIsSupported(virDomainObjPtr vm,
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemuDomainOpenFile:
|
||||||
|
* @driver: driver object
|
||||||
|
* @vm: domain object
|
||||||
|
* @path: path to file to open
|
||||||
|
* @oflags: flags for opening/creation of the file
|
||||||
|
* @needUnlink: set to true if file was created by this function
|
||||||
|
*
|
||||||
|
* Internal function to properly create or open existing files, with
|
||||||
|
* ownership affected by qemu driver setup and domain DAC label.
|
||||||
|
*
|
||||||
|
* Returns the file descriptor on success and negative errno on failure.
|
||||||
|
*
|
||||||
|
* This function should not be used on storage sources. Use
|
||||||
|
* qemuDomainStorageFileInit and storage driver APIs if possible.
|
||||||
|
**/
|
||||||
|
int
|
||||||
|
qemuDomainOpenFile(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
const char *path,
|
||||||
|
int oflags,
|
||||||
|
bool *needUnlink)
|
||||||
|
{
|
||||||
|
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||||
|
uid_t user = cfg->user;
|
||||||
|
gid_t group = cfg->group;
|
||||||
|
bool dynamicOwnership = cfg->dynamicOwnership;
|
||||||
|
virSecurityLabelDefPtr seclabel;
|
||||||
|
|
||||||
|
/* TODO: Take imagelabel into account? */
|
||||||
|
if (vm &&
|
||||||
|
(seclabel = virDomainDefGetSecurityLabelDef(vm->def, "dac")) != NULL &&
|
||||||
|
seclabel->label != NULL &&
|
||||||
|
(virParseOwnershipIds(seclabel->label, &user, &group) < 0))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return virQEMUFileOpenAs(user, group, dynamicOwnership,
|
||||||
|
path, oflags, needUnlink);
|
||||||
|
}
|
||||||
|
@ -1023,3 +1023,10 @@ void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
void qemuDomainRemoveInactiveJobLocked(virQEMUDriverPtr driver,
|
void qemuDomainRemoveInactiveJobLocked(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuDomainOpenFile(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
const char *path,
|
||||||
|
int oflags,
|
||||||
|
bool *needUnlink);
|
||||||
|
@ -3021,46 +3021,6 @@ qemuCompressGetCommand(virQEMUSaveFormat compression)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* qemuOpenFile:
|
|
||||||
* @driver: driver object
|
|
||||||
* @vm: domain object
|
|
||||||
* @path: path to file to open
|
|
||||||
* @oflags: flags for opening/creation of the file
|
|
||||||
* @needUnlink: set to true if file was created by this function
|
|
||||||
*
|
|
||||||
* Internal function to properly create or open existing files, with
|
|
||||||
* ownership affected by qemu driver setup and domain DAC label.
|
|
||||||
*
|
|
||||||
* Returns the file descriptor on success and negative errno on failure.
|
|
||||||
*
|
|
||||||
* This function should not be used on storage sources. Use
|
|
||||||
* qemuDomainStorageFileInit and storage driver APIs if possible.
|
|
||||||
**/
|
|
||||||
static int
|
|
||||||
qemuOpenFile(virQEMUDriverPtr driver,
|
|
||||||
virDomainObjPtr vm,
|
|
||||||
const char *path,
|
|
||||||
int oflags,
|
|
||||||
bool *needUnlink)
|
|
||||||
{
|
|
||||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
|
||||||
uid_t user = cfg->user;
|
|
||||||
gid_t group = cfg->group;
|
|
||||||
bool dynamicOwnership = cfg->dynamicOwnership;
|
|
||||||
virSecurityLabelDefPtr seclabel;
|
|
||||||
|
|
||||||
/* TODO: Take imagelabel into account? */
|
|
||||||
if (vm &&
|
|
||||||
(seclabel = virDomainDefGetSecurityLabelDef(vm->def, "dac")) != NULL &&
|
|
||||||
seclabel->label != NULL &&
|
|
||||||
(virParseOwnershipIds(seclabel->label, &user, &group) < 0))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return virQEMUFileOpenAs(user, group, dynamicOwnership,
|
|
||||||
path, oflags, needUnlink);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuFileWrapperFDClose(virDomainObjPtr vm,
|
qemuFileWrapperFDClose(virDomainObjPtr vm,
|
||||||
@ -3154,7 +3114,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver,
|
|||||||
if (qemuFileWrapperFDClose(vm, wrapperFd) < 0)
|
if (qemuFileWrapperFDClose(vm, wrapperFd) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((fd = qemuOpenFile(driver, vm, path, O_WRONLY, NULL)) < 0 ||
|
if ((fd = qemuDomainOpenFile(driver, vm, path, O_WRONLY, NULL)) < 0 ||
|
||||||
virQEMUSaveDataFinish(data, &fd, path) < 0)
|
virQEMUSaveDataFinish(data, &fd, path) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -6593,7 +6553,7 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
|
|||||||
oflags |= directFlag;
|
oflags |= directFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((fd = qemuOpenFile(driver, NULL, path, oflags, NULL)) < 0)
|
if ((fd = qemuDomainOpenFile(driver, NULL, path, oflags, NULL)) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (bypass_cache &&
|
if (bypass_cache &&
|
||||||
@ -11593,7 +11553,7 @@ qemuDomainMemoryPeek(virDomainPtr dom,
|
|||||||
* @ret_sb: pointer to return stat buffer (local or remote)
|
* @ret_sb: pointer to return stat buffer (local or remote)
|
||||||
* @skipInaccessible: Don't report error if files are not accessible
|
* @skipInaccessible: Don't report error if files are not accessible
|
||||||
*
|
*
|
||||||
* For local storage, open the file using qemuOpenFile and then use
|
* For local storage, open the file using qemuDomainOpenFile and then use
|
||||||
* fstat() to grab the stat struct data for the caller.
|
* fstat() to grab the stat struct data for the caller.
|
||||||
*
|
*
|
||||||
* For remote storage, attempt to access the file and grab the stat
|
* For remote storage, attempt to access the file and grab the stat
|
||||||
@ -11616,8 +11576,8 @@ qemuDomainStorageOpenStat(virQEMUDriverPtr driver,
|
|||||||
if (skipInaccessible && !virFileExists(src->path))
|
if (skipInaccessible && !virFileExists(src->path))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((*ret_fd = qemuOpenFile(driver, vm, src->path, O_RDONLY,
|
if ((*ret_fd = qemuDomainOpenFile(driver, vm, src->path, O_RDONLY,
|
||||||
NULL)) < 0)
|
NULL)) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (fstat(*ret_fd, ret_sb) < 0) {
|
if (fstat(*ret_fd, ret_sb) < 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user