* src/storage/storage_backend.c (virStorageBackendCreateRaw): Use
new virFileOperation flag.
---
src/storage/storage_backend.c | 48 +++++++++++++++++++++++++---------------
1 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index dffc73f..c7c5ccd 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -1,7 +1,7 @@
/*
* storage_backend.c: internal storage driver backend contract
*
- * Copyright (C) 2007-2010 Red Hat, Inc.
+ * Copyright (C) 2007-2011 Red Hat, Inc.
* Copyright (C) 2007-2008 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -344,11 +344,16 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
virStorageVolDefPtr vol,
virStorageVolDefPtr inputvol,
- unsigned int flags ATTRIBUTE_UNUSED)
+ unsigned int flags)
{
int ret = -1;
- int createstat;
+ int fd = -1;
struct createRawFileOpHookData hdata = { vol, inputvol };
+ uid_t uid;
+ gid_t gid;
+ int operation_flags;
+
+ virCheckFlags(0, -1);
if (vol->target.encryption != NULL) {
virStorageReportError(VIR_ERR_NO_SUPPORT,
@@ -357,24 +362,31 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
goto cleanup;
}
- uid_t uid = (vol->target.perms.uid == -1) ? getuid() : vol->target.perms.uid;
- gid_t gid = (vol->target.perms.gid == -1) ? getgid() : vol->target.perms.gid;
+ uid = (vol->target.perms.uid == -1) ? getuid() : vol->target.perms.uid;
+ gid = (vol->target.perms.gid == -1) ? getgid() : vol->target.perms.gid;
+ operation_flags = VIR_FILE_OP_FORCE_PERMS | VIR_FILE_OP_RETURN_FD;
+ if (pool->def->type == VIR_STORAGE_POOL_NETFS)
+ operation_flags |= VIR_FILE_OP_AS_UID;
- if ((createstat = virFileOperation(vol->target.path,
- O_RDWR | O_CREAT | O_EXCL,
- vol->target.perms.mode, uid, gid,
- createRawFileOpHook, &hdata,
- VIR_FILE_OP_FORCE_PERMS |
- (pool->def->type == VIR_STORAGE_POOL_NETFS
- ? VIR_FILE_OP_AS_UID : 0))) < 0) {
- virReportSystemError(-createstat,
- _("cannot create path '%s'"),
- vol->target.path);
- goto cleanup;
+ if ((fd = virFileOperation(vol->target.path,
+ O_RDWR | O_CREAT | O_EXCL,
+ vol->target.perms.mode, uid, gid,
+ NULL, NULL, operation_flags)) < 0) {
+ virReportSystemError(-fd,
+ _("cannot create path '%s'"),
+ vol->target.path);
+ goto cleanup;
+ }
+
+ if ((ret = createRawFileOpHook(fd, &hdata)) < 0) {
+ virReportSystemError(-fd,
+ _("cannot create path '%s'"),
+ vol->target.path);
+ ret = -1;
}
- ret = 0;
cleanup:
+ VIR_FORCE_CLOSE(fd);
return ret;
}
--
1.7.4