]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
storage: conf: Don't set any default <mode> in the XML
authorCole Robinson <crobinso@redhat.com>
Mon, 27 Apr 2015 20:48:05 +0000 (16:48 -0400)
committerCole Robinson <crobinso@redhat.com>
Tue, 26 May 2015 00:52:55 +0000 (20:52 -0400)
The XML parser sets a default <mode> if none is explicitly passed in.
This is then used at pool/vol creation time, and unconditionally reported
in the XML.

The problem with this approach is that it's impossible for other code
to determine if the user explicitly requested a storage mode. There
are some cases where we want to make this distinction, but we currently
can't.

Handle <mode> parsing like we handle <owner>/<group>: if no value is
passed in, set it to -1, and adjust the internal consumers to handle
it.

docs/formatstorage.html.in
docs/schemas/storagecommon.rng
src/conf/storage_conf.c
src/storage/storage_backend.c
src/storage/storage_backend.h
src/storage/storage_backend_fs.c
src/storage/storage_backend_logical.c
tests/storagepoolxml2xmlout/pool-netfs-gluster.xml
tests/storagevolxml2xmlout/vol-gluster-dir.xml
tests/storagevolxml2xmlout/vol-sheepdog.xml

index 8f227b769e17d7ab60ae4d1258ffef1a16ba7707..17558f87be2aed6883baa2db96b5975466c5290a 100644 (file)
         namespace. It provides information about the permissions to use for the
         final directory when the pool is built. There are 4 child elements.
         The <code>mode</code> element contains the octal permission set.
+        The <code>mode</code> defaults to 0755 when not provided.
         The <code>owner</code> element contains the numeric user ID.
         The <code>group</code> element contains the numeric group ID.
         If <code>owner</code> or <code>group</code> aren't specified when
         files. For pools where the volumes are device nodes, the hotplug
         scripts determine permissions. There are 4 child elements.
         The <code>mode</code> element contains the octal permission set.
+        The <code>mode</code> defaults to 0600 when not provided.
         The <code>owner</code> element contains the numeric user ID.
         The <code>group</code> element contains the numeric group ID.
         If <code>owner</code> or <code>group</code> aren't specified when
index 6f7d3695965177daa4f61d222ee710c971ce7358..7c0446247c95dca386085e63a0003c13dcc0da53 100644 (file)
     <optional>
       <element name='permissions'>
         <interleave>
-          <element name='mode'>
-            <ref name='octalMode'/>
-          </element>
+          <optional>
+            <element name='mode'>
+              <ref name='octalMode'/>
+            </element>
+          </optional>
           <optional>
             <element name='owner'>
               <choice>
index ee6e0cf002b2c7ed6aa41a5601db623e8d2cd644..a02e50409aacfbbe759704471a9790e68e1d6c98 100644 (file)
@@ -50,9 +50,6 @@
 
 VIR_LOG_INIT("conf.storage_conf");
 
-#define DEFAULT_POOL_PERM_MODE 0755
-#define DEFAULT_VOL_PERM_MODE  0600
-
 VIR_ENUM_IMPL(virStorageVol,
               VIR_STORAGE_VOL_LAST,
               "file", "block", "dir", "network", "netdir")
@@ -718,8 +715,7 @@ virStoragePoolDefParseSourceString(const char *srcSpec,
 static int
 virStorageDefParsePerms(xmlXPathContextPtr ctxt,
                         virStoragePermsPtr perms,
-                        const char *permxpath,
-                        int defaultmode)
+                        const char *permxpath)
 {
     char *mode;
     long long val;
@@ -730,7 +726,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
     node = virXPathNode(permxpath, ctxt);
     if (node == NULL) {
         /* Set default values if there is not <permissions> element */
-        perms->mode = defaultmode;
+        perms->mode = (mode_t) -1;
         perms->uid = (uid_t) -1;
         perms->gid = (gid_t) -1;
         perms->label = NULL;
@@ -740,10 +736,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
     relnode = ctxt->node;
     ctxt->node = node;
 
-    mode = virXPathString("string(./mode)", ctxt);
-    if (!mode) {
-        perms->mode = defaultmode;
-    } else {
+    if ((mode = virXPathString("string(./mode)", ctxt))) {
         int tmp;
 
         if (virStrToLong_i(mode, NULL, 8, &tmp) < 0 || (tmp & ~0777)) {
@@ -754,6 +747,8 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
         }
         perms->mode = tmp;
         VIR_FREE(mode);
+    } else {
+        perms->mode = (mode_t) -1;
     }
 
     if (virXPathNode("./owner", ctxt) == NULL) {
@@ -949,8 +944,7 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt)
             goto error;
 
         if (virStorageDefParsePerms(ctxt, &ret->target.perms,
-                                    "./target/permissions",
-                                    DEFAULT_POOL_PERM_MODE) < 0)
+                                    "./target/permissions") < 0)
             goto error;
     }
 
@@ -1187,8 +1181,9 @@ virStoragePoolDefFormatBuf(virBufferPtr buf,
 
         virBufferAddLit(buf, "<permissions>\n");
         virBufferAdjustIndent(buf, 2);
-        virBufferAsprintf(buf, "<mode>0%o</mode>\n",
-                          def->target.perms.mode);
+        if (def->target.perms.mode != (mode_t) -1)
+            virBufferAsprintf(buf, "<mode>0%o</mode>\n",
+                              def->target.perms.mode);
         if (def->target.perms.uid != (uid_t) -1)
             virBufferAsprintf(buf, "<owner>%d</owner>\n",
                               (int) def->target.perms.uid);
@@ -1319,8 +1314,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
         if (VIR_ALLOC(ret->target.backingStore->perms) < 0)
             goto error;
         if (virStorageDefParsePerms(ctxt, ret->target.backingStore->perms,
-                                    "./backingStore/permissions",
-                                    DEFAULT_VOL_PERM_MODE) < 0)
+                                    "./backingStore/permissions") < 0)
             goto error;
     }
 
@@ -1365,8 +1359,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     if (VIR_ALLOC(ret->target.perms) < 0)
         goto error;
     if (virStorageDefParsePerms(ctxt, ret->target.perms,
-                                "./target/permissions",
-                                DEFAULT_VOL_PERM_MODE) < 0)
+                                "./target/permissions") < 0)
         goto error;
 
     node = virXPathNode("./target/encryption", ctxt);
@@ -1524,8 +1517,9 @@ virStorageVolTargetDefFormat(virStorageVolOptionsPtr options,
         virBufferAddLit(buf, "<permissions>\n");
         virBufferAdjustIndent(buf, 2);
 
-        virBufferAsprintf(buf, "<mode>0%o</mode>\n",
-                          def->perms->mode);
+        if (def->perms->mode != (mode_t) -1)
+            virBufferAsprintf(buf, "<mode>0%o</mode>\n",
+                              def->perms->mode);
         if (def->perms->uid != (uid_t) -1)
             virBufferAsprintf(buf, "<owner>%d</owner>\n",
                               (int) def->perms->uid);
index 289f45480a55b183f1136692889339a71c25eed4..ce59f63acf6477c1d7ef0d9f87d6e6a30807db34 100644 (file)
@@ -318,6 +318,7 @@ virStorageBackendCreateBlockFrom(virConnectPtr conn ATTRIBUTE_UNUSED,
     struct stat st;
     gid_t gid;
     uid_t uid;
+    mode_t mode;
     bool reflink_copy = false;
 
     virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA |
@@ -367,10 +368,13 @@ virStorageBackendCreateBlockFrom(virConnectPtr conn ATTRIBUTE_UNUSED,
                              (unsigned int) gid);
         goto cleanup;
     }
-    if (fchmod(fd, vol->target.perms->mode) < 0) {
+
+    mode = (vol->target.perms->mode == (mode_t) -1 ?
+            VIR_STORAGE_DEFAULT_VOL_PERM_MODE : vol->target.perms->mode);
+    if (fchmod(fd, mode) < 0) {
         virReportSystemError(errno,
                              _("cannot set mode of '%s' to %04o"),
-                             vol->target.path, vol->target.perms->mode);
+                             vol->target.path, mode);
         goto cleanup;
     }
     if (VIR_CLOSE(fd) < 0) {
@@ -509,7 +513,9 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
 
     if ((fd = virFileOpenAs(vol->target.path,
                             O_RDWR | O_CREAT | O_EXCL,
-                            vol->target.perms->mode,
+                            (vol->target.perms->mode ?
+                             VIR_STORAGE_DEFAULT_VOL_PERM_MODE :
+                             vol->target.perms->mode),
                             vol->target.perms->uid,
                             vol->target.perms->gid,
                             operation_flags)) < 0) {
@@ -664,6 +670,7 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
     struct stat st;
     gid_t gid;
     uid_t uid;
+    mode_t mode;
     bool filecreated = false;
 
     if ((pool->def->type == VIR_STORAGE_POOL_NETFS)
@@ -709,10 +716,13 @@ virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
                              (unsigned int) gid);
         return -1;
     }
-    if (chmod(vol->target.path, vol->target.perms->mode) < 0) {
+
+    mode = (vol->target.perms->mode == (mode_t) -1 ?
+            VIR_STORAGE_DEFAULT_VOL_PERM_MODE : vol->target.perms->mode);
+    if (chmod(vol->target.path, mode) < 0) {
         virReportSystemError(errno,
                              _("cannot set mode of '%s' to %04o"),
-                             vol->target.path, vol->target.perms->mode);
+                             vol->target.path, mode);
         return -1;
     }
     return 0;
index 85a8a4b5ad815cc5000014e57aa5f4637d38d05c..39c00b1a807751640848d6d0caddaaaf4ac9e228 100644 (file)
@@ -177,6 +177,9 @@ int virStorageBackendVolOpen(const char *path, struct stat *sb,
     ATTRIBUTE_RETURN_CHECK
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+# define VIR_STORAGE_DEFAULT_POOL_PERM_MODE 0755
+# define VIR_STORAGE_DEFAULT_VOL_PERM_MODE  0600
+
 int virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
                                    bool withBlockVolFormat,
                                    unsigned int openflags);
index 235ab204b5eb3e29117a64bd4c434aa4f098cee9..ed569351cc1f2ab2b756cd93a737eb7286109284 100644 (file)
@@ -801,7 +801,9 @@ virStorageBackendFileSystemBuild(virConnectPtr conn ATTRIBUTE_UNUSED,
      * requested in the config. If the dir already exists, just set
      * the perms. */
     if ((err = virDirCreate(pool->def->target.path,
-                            pool->def->target.perms.mode,
+                            (pool->def->target.perms.mode == (mode_t) -1 ?
+                             VIR_STORAGE_DEFAULT_POOL_PERM_MODE :
+                             pool->def->target.perms.mode),
                             pool->def->target.perms.uid,
                             pool->def->target.perms.gid,
                             VIR_DIR_CREATE_ALLOW_EXIST |
@@ -1071,7 +1073,10 @@ static int createFileDir(virConnectPtr conn ATTRIBUTE_UNUSED,
     }
 
 
-    if ((err = virDirCreate(vol->target.path, vol->target.perms->mode,
+    if ((err = virDirCreate(vol->target.path,
+                            (vol->target.perms->mode == (mode_t) -1 ?
+                             VIR_STORAGE_DEFAULT_VOL_PERM_MODE :
+                             vol->target.perms->mode),
                             vol->target.perms->uid,
                             vol->target.perms->gid,
                             (pool->def->type == VIR_STORAGE_POOL_NETFS
index 11c568388443f447a99aa900395982f24efbd2c0..9c77b4c1a3103b8501179dd2378ff9b7e7ba0fac 100644 (file)
@@ -787,7 +787,9 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
             goto error;
         }
     }
-    if (fchmod(fd, vol->target.perms->mode) < 0) {
+    if (fchmod(fd, (vol->target.perms->mode == (mode_t) -1 ?
+                    VIR_STORAGE_DEFAULT_VOL_PERM_MODE :
+                    vol->target.perms->mode)) < 0) {
         virReportSystemError(errno,
                              _("cannot set file mode '%s'"),
                              vol->target.path);
index 90143f919d107fd4780e9a468038fa007767d302..9e36cb6ce925d746e0123eaec3e6a720733f7fe8 100644 (file)
@@ -12,7 +12,6 @@
   <target>
     <path>/mnt/gluster</path>
     <permissions>
-      <mode>0755</mode>
     </permissions>
   </target>
 </pool>
index 0af0be179d5ba75071ba98869588efabbed9d1c5..37400b980a32a25bcad720966c2a9aeeebc45ebd 100644 (file)
@@ -9,7 +9,6 @@
     <path>gluster://example.com/vol/dir</path>
     <format type='dir'/>
     <permissions>
-      <mode>0600</mode>
     </permissions>
   </target>
 </volume>
index d8f34d3806cbff8a00ec4c238810d69f714d5d9c..fe1879fd2f208ecdefb31dfd4b9f6fc41f9a397f 100644 (file)
@@ -8,7 +8,6 @@
     <path>sheepdog:test2</path>
     <format type='unknown'/>
     <permissions>
-      <mode>0600</mode>
     </permissions>
   </target>
 </volume>