diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index 456b9d764e..fcbb6da546 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -169,6 +169,9 @@ typedef virStorageFileBackend *virStorageFileBackendPtr;
 struct _virStorageDriverData {
     virStorageFileBackendPtr backend;
     void *priv;
+
+    uid_t uid;
+    gid_t gid;
 };
 
 typedef int
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 455a2efcc0..6d29067fca 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -2801,13 +2801,37 @@ virStorageFileDeinit(virStorageSourcePtr src)
 }
 
 
+/**
+ * virStorageFileInitAs:
+ *
+ * @src: storage source definition
+ * @uid: uid used to access the file, or -1 for current uid
+ * @gid: gid used to access the file, or -1 for current gid
+ *
+ * Initialize a storage source to be used with storage driver. Use the provided
+ * uid and gid if possible for the operations.
+ *
+ * Returns 0 if the storage file was successfully initialized, -1 if the
+ * initialization failed. Libvirt error is reported.
+ */
 int
-virStorageFileInit(virStorageSourcePtr src)
+virStorageFileInitAs(virStorageSourcePtr src,
+                     uid_t uid, gid_t gid)
 {
     int actualType = virStorageSourceGetActualType(src);
     if (VIR_ALLOC(src->drv) < 0)
         return -1;
 
+    if (uid == (uid_t) -1)
+        src->drv->uid = geteuid();
+    else
+        src->drv->uid = uid;
+
+    if (gid == (gid_t) -1)
+        src->drv->gid = getegid();
+    else
+        src->drv->gid = gid;
+
     if (!(src->drv->backend = virStorageFileBackendForType(actualType,
                                                            src->protocol)))
         goto error;
@@ -2824,6 +2848,19 @@ virStorageFileInit(virStorageSourcePtr src)
 }
 
 
+/**
+ * virStorageFileInit:
+ *
+ * See virStorageFileInitAs. The file is initialized to be accessed by the
+ * current user.
+ */
+int
+virStorageFileInit(virStorageSourcePtr src)
+{
+    return virStorageFileInitAs(src, -1, -1);
+}
+
+
 /**
  * virStorageFileCreate: Creates an empty storage file via storage driver
  *
diff --git a/src/storage/storage_driver.h b/src/storage/storage_driver.h
index fb03870df5..49be9995c9 100644
--- a/src/storage/storage_driver.h
+++ b/src/storage/storage_driver.h
@@ -29,8 +29,9 @@
 # include "storage_conf.h"
 # include "virstoragefile.h"
 
-int
-virStorageFileInit(virStorageSourcePtr src);
+int virStorageFileInit(virStorageSourcePtr src);
+int virStorageFileInitAs(virStorageSourcePtr src,
+                         uid_t uid, gid_t gid);
 void virStorageFileDeinit(virStorageSourcePtr src);
 
 int virStorageFileCreate(virStorageSourcePtr src);