提交 fe303a42 编写于 作者: E Eric Blake

storage: simplify fd handling

* src/storage/storage_backend.c (virStorageBackendCreateRaw): Use
new virFileOperation flag.
上级 3eede281
...@@ -370,11 +370,16 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED, ...@@ -370,11 +370,16 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool, virStoragePoolObjPtr pool,
virStorageVolDefPtr vol, virStorageVolDefPtr vol,
virStorageVolDefPtr inputvol, virStorageVolDefPtr inputvol,
unsigned int flags ATTRIBUTE_UNUSED) unsigned int flags)
{ {
int ret = -1; int ret = -1;
int createstat; int fd = -1;
struct createRawFileOpHookData hdata = { vol, inputvol }; struct createRawFileOpHookData hdata = { vol, inputvol };
uid_t uid;
gid_t gid;
int operation_flags;
virCheckFlags(0, -1);
if (vol->target.encryption != NULL) { if (vol->target.encryption != NULL) {
virStorageReportError(VIR_ERR_NO_SUPPORT, virStorageReportError(VIR_ERR_NO_SUPPORT,
...@@ -383,24 +388,31 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED, ...@@ -383,24 +388,31 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
goto cleanup; goto cleanup;
} }
uid_t uid = (vol->target.perms.uid == -1) ? getuid() : vol->target.perms.uid; uid = (vol->target.perms.uid == -1) ? getuid() : vol->target.perms.uid;
gid_t gid = (vol->target.perms.gid == -1) ? getgid() : vol->target.perms.gid; 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, if ((fd = virFileOperation(vol->target.path,
O_RDWR | O_CREAT | O_EXCL, O_RDWR | O_CREAT | O_EXCL,
vol->target.perms.mode, uid, gid, vol->target.perms.mode, uid, gid,
createRawFileOpHook, &hdata, NULL, NULL, operation_flags)) < 0) {
VIR_FILE_OP_FORCE_PERMS | virReportSystemError(-fd,
(pool->def->type == VIR_STORAGE_POOL_NETFS _("cannot create path '%s'"),
? VIR_FILE_OP_AS_UID : 0))) < 0) { vol->target.path);
virReportSystemError(-createstat, goto cleanup;
_("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: cleanup:
VIR_FORCE_CLOSE(fd);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册