[libvirt] [PATCHv4 08/15] storage: simplify fd handling

Eric Blake eblake at redhat.com
Thu Mar 10 01:45:48 UTC 2011


* 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




More information about the libvir-list mailing list