render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
99cbc7
From 5b0a3757656c53186fa27ebb8b562ba3e5b7bd69 Mon Sep 17 00:00:00 2001
99cbc7
Message-Id: <5b0a3757656c53186fa27ebb8b562ba3e5b7bd69@dist-git>
99cbc7
From: John Ferlan <jferlan@redhat.com>
99cbc7
Date: Wed, 3 Apr 2019 09:12:19 -0400
99cbc7
Subject: [PATCH] storage: Add default mount options for fs/netfs storage pools
99cbc7
MIME-Version: 1.0
99cbc7
Content-Type: text/plain; charset=UTF-8
99cbc7
Content-Transfer-Encoding: 8bit
99cbc7
99cbc7
https://bugzilla.redhat.com/show_bug.cgi?id=1584663
99cbc7
99cbc7
Modify the command generation to add some default options to the
99cbc7
fs/netfs storage pools based on the OS type. For Linux, it'll be
99cbc7
the "nodev, nosuid, noexec". For FreeBSD, it'll be "nosuid, noexec".
99cbc7
For others, just leave the options alone.
99cbc7
99cbc7
Modify the storagepoolxml2argvtest to handle the fact that the
99cbc7
same input XML could generate different output XML based on whether
99cbc7
Linux, FreeBSD, or other was being built.
99cbc7
99cbc7
Signed-off-by: John Ferlan <jferlan@redhat.com>
99cbc7
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
99cbc7
(cherry picked from commit f00cde7f1133fee96dc13a80d7f402c704346974)
99cbc7
99cbc7
Resolved conflict in tests/storagepoolxml2argvtest.c since commit
99cbc7
a15fe1247dfea01b301a825f9b66d09999d059aa is not present downstream.
99cbc7
99cbc7
Resolved build issue in src/storage/storage_util.c since the VIR_AUTOFREE
99cbc7
is not present downstream.
99cbc7
99cbc7
Signed-off-by: John Ferlan <jferlan@redhat.com>
99cbc7
Message-Id: <20190403131219.16385-8-jferlan@redhat.com>
99cbc7
Reviewed-by: Ján Tomko <jtomko@redhat.com>
99cbc7
---
99cbc7
 src/storage/storage_util.c                    | 38 +++++++++++++--
99cbc7
 .../pool-fs-freebsd.argv                      |  1 +
99cbc7
 .../pool-fs-linux.argv                        |  1 +
99cbc7
 .../pool-netfs-auto-freebsd.argv              |  1 +
99cbc7
 .../pool-netfs-auto-linux.argv                |  1 +
99cbc7
 .../pool-netfs-cifs-freebsd.argv              |  1 +
99cbc7
 .../pool-netfs-cifs-linux.argv                |  1 +
99cbc7
 .../pool-netfs-freebsd.argv                   |  1 +
99cbc7
 .../pool-netfs-gluster-freebsd.argv           |  2 +
99cbc7
 .../pool-netfs-gluster-linux.argv             |  2 +
99cbc7
 .../pool-netfs-linux.argv                     |  1 +
99cbc7
 tests/storagepoolxml2argvtest.c               | 48 +++++++++++++++----
99cbc7
 12 files changed, 86 insertions(+), 12 deletions(-)
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-fs-freebsd.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-fs-linux.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-auto-freebsd.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-auto-linux.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-cifs-freebsd.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-cifs-linux.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-freebsd.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-gluster-freebsd.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-gluster-linux.argv
99cbc7
 create mode 100644 tests/storagepoolxml2argvdata/pool-netfs-linux.argv
99cbc7
99cbc7
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
99cbc7
index 70ce600581..48117bef62 100644
99cbc7
--- a/src/storage/storage_util.c
99cbc7
+++ b/src/storage/storage_util.c
99cbc7
@@ -36,6 +36,11 @@
99cbc7
 # ifndef FS_NOCOW_FL
99cbc7
 #  define FS_NOCOW_FL                     0x00800000 /* Do not cow file */
99cbc7
 # endif
99cbc7
+# define default_mount_opts "nodev,nosuid,noexec"
99cbc7
+#elif defined(__FreeBSD__)
99cbc7
+# define default_mount_opts "nosuid,noexec"
99cbc7
+#else
99cbc7
+# define default_mount_opts ""
99cbc7
 #endif
99cbc7
 
99cbc7
 #if WITH_BLKID
99cbc7
@@ -4245,12 +4250,36 @@ virStorageBackendFileSystemGetPoolSource(virStoragePoolObjPtr pool)
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
+static void
99cbc7
+virStorageBackendFileSystemMountAddOptions(virCommandPtr cmd,
99cbc7
+                                           const char *providedOpts)
99cbc7
+{
99cbc7
+    char *mountOpts = NULL;
99cbc7
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
99cbc7
+
99cbc7
+    if (*default_mount_opts != '\0')
99cbc7
+        virBufferAsprintf(&buf, "%s,", default_mount_opts);
99cbc7
+
99cbc7
+    if (providedOpts)
99cbc7
+        virBufferAsprintf(&buf, "%s,", providedOpts);
99cbc7
+
99cbc7
+    virBufferTrim(&buf, ",", -1);
99cbc7
+    mountOpts = virBufferContentAndReset(&buf;;
99cbc7
+
99cbc7
+    if (mountOpts)
99cbc7
+        virCommandAddArgList(cmd, "-o", mountOpts, NULL);
99cbc7
+
99cbc7
+    VIR_FREE(mountOpts);
99cbc7
+}
99cbc7
+
99cbc7
+
99cbc7
 static void
99cbc7
 virStorageBackendFileSystemMountNFSArgs(virCommandPtr cmd,
99cbc7
                                         const char *src,
99cbc7
                                         virStoragePoolDefPtr def)
99cbc7
 {
99cbc7
     virCommandAddArgList(cmd, src, def->target.path, NULL);
99cbc7
+    virStorageBackendFileSystemMountAddOptions(cmd, NULL);
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
@@ -4262,8 +4291,8 @@ virStorageBackendFileSystemMountGlusterArgs(virCommandPtr cmd,
99cbc7
     const char *fmt;
99cbc7
 
99cbc7
     fmt = virStoragePoolFormatFileSystemNetTypeToString(def->source.format);
99cbc7
-    virCommandAddArgList(cmd, "-t", fmt, src, "-o", "direct-io-mode=1",
99cbc7
-                         def->target.path, NULL);
99cbc7
+    virCommandAddArgList(cmd, "-t", fmt, src, def->target.path, NULL);
99cbc7
+    virStorageBackendFileSystemMountAddOptions(cmd, "direct-io-mode=1");
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
@@ -4275,8 +4304,8 @@ virStorageBackendFileSystemMountCIFSArgs(virCommandPtr cmd,
99cbc7
     const char *fmt;
99cbc7
 
99cbc7
     fmt = virStoragePoolFormatFileSystemNetTypeToString(def->source.format);
99cbc7
-    virCommandAddArgList(cmd, "-t", fmt, src, def->target.path,
99cbc7
-                         "-o", "guest", NULL);
99cbc7
+    virCommandAddArgList(cmd, "-t", fmt, src, def->target.path, NULL);
99cbc7
+    virStorageBackendFileSystemMountAddOptions(cmd, "guest");
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
@@ -4292,6 +4321,7 @@ virStorageBackendFileSystemMountDefaultArgs(virCommandPtr cmd,
99cbc7
     else
99cbc7
         fmt = virStoragePoolFormatFileSystemNetTypeToString(def->source.format);
99cbc7
     virCommandAddArgList(cmd, "-t", fmt, src, def->target.path, NULL);
99cbc7
+    virStorageBackendFileSystemMountAddOptions(cmd, NULL);
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-fs-freebsd.argv b/tests/storagepoolxml2argvdata/pool-fs-freebsd.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..a35d73e254
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-fs-freebsd.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount -t ext3 /dev/sda6 /mnt -o nosuid,noexec
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-fs-linux.argv b/tests/storagepoolxml2argvdata/pool-fs-linux.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..19543f442d
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-fs-linux.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount -t ext3 /dev/sda6 /mnt -o nodev,nosuid,noexec
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-auto-freebsd.argv b/tests/storagepoolxml2argvdata/pool-netfs-auto-freebsd.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..39e5c97aed
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-auto-freebsd.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount localhost:/var/lib/libvirt/images /mnt -o nosuid,noexec
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-auto-linux.argv b/tests/storagepoolxml2argvdata/pool-netfs-auto-linux.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..1f82d3d29c
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-auto-linux.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount localhost:/var/lib/libvirt/images /mnt -o nodev,nosuid,noexec
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-cifs-freebsd.argv b/tests/storagepoolxml2argvdata/pool-netfs-cifs-freebsd.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..d72749a032
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-cifs-freebsd.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount -t cifs //example.com/samba_share /mnt/cifs -o nosuid,noexec,guest
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-cifs-linux.argv b/tests/storagepoolxml2argvdata/pool-netfs-cifs-linux.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..85aa9cf23f
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-cifs-linux.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount -t cifs //example.com/samba_share /mnt/cifs -o nodev,nosuid,noexec,guest
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-freebsd.argv b/tests/storagepoolxml2argvdata/pool-netfs-freebsd.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..05c1951f32
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-freebsd.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount -t nfs localhost:/var/lib/libvirt/images /mnt -o nosuid,noexec
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-gluster-freebsd.argv b/tests/storagepoolxml2argvdata/pool-netfs-gluster-freebsd.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..700107d78e
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-gluster-freebsd.argv
99cbc7
@@ -0,0 +1,2 @@
99cbc7
+mount -t glusterfs example.com:/volume /mnt/gluster -o nosuid,noexec,\
99cbc7
+direct-io-mode=1
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-gluster-linux.argv b/tests/storagepoolxml2argvdata/pool-netfs-gluster-linux.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..9535c8a1b9
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-gluster-linux.argv
99cbc7
@@ -0,0 +1,2 @@
99cbc7
+mount -t glusterfs example.com:/volume /mnt/gluster -o nodev,nosuid,noexec,\
99cbc7
+direct-io-mode=1
99cbc7
diff --git a/tests/storagepoolxml2argvdata/pool-netfs-linux.argv b/tests/storagepoolxml2argvdata/pool-netfs-linux.argv
99cbc7
new file mode 100644
99cbc7
index 0000000000..22fafd7b32
99cbc7
--- /dev/null
99cbc7
+++ b/tests/storagepoolxml2argvdata/pool-netfs-linux.argv
99cbc7
@@ -0,0 +1 @@
99cbc7
+mount -t nfs localhost:/var/lib/libvirt/images /mnt -o nodev,nosuid,noexec
99cbc7
diff --git a/tests/storagepoolxml2argvtest.c b/tests/storagepoolxml2argvtest.c
99cbc7
index 3bf2c3b003..0ea8b3b94c 100644
99cbc7
--- a/tests/storagepoolxml2argvtest.c
99cbc7
+++ b/tests/storagepoolxml2argvtest.c
99cbc7
@@ -86,6 +86,8 @@ testCompareXMLToArgvFiles(bool shouldFail,
99cbc7
 struct testInfo {
99cbc7
     bool shouldFail;
99cbc7
     const char *pool;
99cbc7
+    bool linuxOut;
99cbc7
+    bool freebsdOut;
99cbc7
 };
99cbc7
 
99cbc7
 static int
99cbc7
@@ -100,9 +102,19 @@ testCompareXMLToArgvHelper(const void *data)
99cbc7
                     abs_srcdir, info->pool) < 0)
99cbc7
         goto cleanup;
99cbc7
 
99cbc7
-    if (virAsprintf(&cmdline, "%s/storagepoolxml2argvdata/%s.argv",
99cbc7
-                    abs_srcdir, info->pool) < 0 && !info->shouldFail)
99cbc7
-        goto cleanup;
99cbc7
+    if (info->linuxOut) {
99cbc7
+        if (virAsprintf(&cmdline, "%s/storagepoolxml2argvdata/%s-linux.argv",
99cbc7
+                        abs_srcdir, info->pool) < 0 && !info->shouldFail)
99cbc7
+            goto cleanup;
99cbc7
+    } else if (info->freebsdOut) {
99cbc7
+        if (virAsprintf(&cmdline, "%s/storagepoolxml2argvdata/%s-freebsd.argv",
99cbc7
+                        abs_srcdir, info->pool) < 0 && !info->shouldFail)
99cbc7
+            goto cleanup;
99cbc7
+    } else {
99cbc7
+        if (virAsprintf(&cmdline, "%s/storagepoolxml2argvdata/%s.argv",
99cbc7
+                        abs_srcdir, info->pool) < 0 && !info->shouldFail)
99cbc7
+            goto cleanup;
99cbc7
+    }
99cbc7
 
99cbc7
     result = testCompareXMLToArgvFiles(info->shouldFail, poolxml, cmdline);
99cbc7
 
99cbc7
@@ -119,9 +131,9 @@ mymain(void)
99cbc7
 {
99cbc7
     int ret = 0;
99cbc7
 
99cbc7
-#define DO_TEST_FULL(shouldFail, pool) \
99cbc7
+#define DO_TEST_FULL(shouldFail, pool, linuxOut, freebsdOut) \
99cbc7
     do { \
99cbc7
-        struct testInfo info = { shouldFail, pool }; \
99cbc7
+        struct testInfo info = { shouldFail, pool, linuxOut, freebsdOut }; \
99cbc7
         if (virTestRun("Storage Pool XML-2-argv " pool, \
99cbc7
                        testCompareXMLToArgvHelper, &info) < 0) \
99cbc7
             ret = -1; \
99cbc7
@@ -129,14 +141,19 @@ mymain(void)
99cbc7
     while (0);
99cbc7
 
99cbc7
 #define DO_TEST(pool, ...) \
99cbc7
-    DO_TEST_FULL(false, pool)
99cbc7
+    DO_TEST_FULL(false, pool, false, false)
99cbc7
 
99cbc7
 #define DO_TEST_FAIL(pool, ...) \
99cbc7
-    DO_TEST_FULL(true, pool)
99cbc7
+    DO_TEST_FULL(true, pool, false, false)
99cbc7
+
99cbc7
+#define DO_TEST_LINUX(pool, ...) \
99cbc7
+    DO_TEST_FULL(false, pool, true, false)
99cbc7
+
99cbc7
+#define DO_TEST_FREEBSD(pool, ...) \
99cbc7
+    DO_TEST_FULL(false, pool, false, true)
99cbc7
 
99cbc7
     DO_TEST_FAIL("pool-dir");
99cbc7
     DO_TEST_FAIL("pool-dir-naming");
99cbc7
-    DO_TEST("pool-fs");
99cbc7
     DO_TEST_FAIL("pool-logical");
99cbc7
     DO_TEST_FAIL("pool-logical-nopath");
99cbc7
     DO_TEST_FAIL("pool-logical-create");
99cbc7
@@ -145,10 +162,25 @@ mymain(void)
99cbc7
     DO_TEST_FAIL("pool-disk-device-nopartsep");
99cbc7
     DO_TEST_FAIL("pool-iscsi");
99cbc7
     DO_TEST_FAIL("pool-iscsi-auth");
99cbc7
+#ifdef __linux__
99cbc7
+    DO_TEST_LINUX("pool-fs");
99cbc7
+    DO_TEST_LINUX("pool-netfs");
99cbc7
+    DO_TEST_LINUX("pool-netfs-auto");
99cbc7
+    DO_TEST_LINUX("pool-netfs-gluster");
99cbc7
+    DO_TEST_LINUX("pool-netfs-cifs");
99cbc7
+#elif defined(__FreeBSD__)
99cbc7
+    DO_TEST_FREEBSD("pool-fs");
99cbc7
+    DO_TEST_FREEBSD("pool-netfs");
99cbc7
+    DO_TEST_FREEBSD("pool-netfs-auto");
99cbc7
+    DO_TEST_FREEBSD("pool-netfs-gluster");
99cbc7
+    DO_TEST_FREEBSD("pool-netfs-cifs");
99cbc7
+#else
99cbc7
+    DO_TEST("pool-fs");
99cbc7
     DO_TEST("pool-netfs");
99cbc7
     DO_TEST("pool-netfs-auto");
99cbc7
     DO_TEST("pool-netfs-gluster");
99cbc7
     DO_TEST("pool-netfs-cifs");
99cbc7
+#endif
99cbc7
     DO_TEST_FAIL("pool-scsi");
99cbc7
     DO_TEST_FAIL("pool-scsi-type-scsi-host");
99cbc7
     DO_TEST_FAIL("pool-scsi-type-fc-host");
99cbc7
-- 
99cbc7
2.21.0
99cbc7