The branch, v4-13-test has been updated
       via  2599b6bd3ef s3: modules: vfs_glusterfs: Fix leak of char **lines 
onto mem_ctx on return.
       via  3d5be93eea8 s3-vfs_glusterfs: refuse connection when write-behind 
xlator is present
       via  8079e2a9116 docs-xml/manpages: Add warning about write-behind 
translator for vfs_glusterfs
      from  dbba939ce50 s4:torture: Pass buffer correctly to write()

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-13-test


- Log -----------------------------------------------------------------
commit 2599b6bd3ef0b21590487c95de09be2f82c6d38b
Author: Jeremy Allison <j...@samba.org>
Date:   Mon Nov 2 15:46:51 2020 -0800

    s3: modules: vfs_glusterfs: Fix leak of char **lines onto mem_ctx on return.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14486
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abart...@samba.org>
    Autobuild-Date(master): Tue Nov  3 01:56:59 UTC 2020 on sn-devel-184
    
    (cherry picked from commit 7d846cd178d653600c71ee4bd6a491a9e48a56da)
    
    Autobuild-User(v4-13-test): Karolin Seeger <ksee...@samba.org>
    Autobuild-Date(v4-13-test): Tue Nov  3 10:16:27 UTC 2020 on sn-devel-184

commit 3d5be93eea886e31d1eaf087e9bc21bfae336126
Author: Günther Deschner <g...@samba.org>
Date:   Mon Nov 2 12:30:36 2020 +0100

    s3-vfs_glusterfs: refuse connection when write-behind xlator is present
    
    s3-vfs_glusterfs: refuse connection when write-behind xlator is present
    
    Once the new glusterfs api is available we will programmtically disable
    the translator, for now we just refuse the connection as there is
    a potential for serious data damage.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14486
    
    Guenther
    
    Signed-off-by: Guenther Deschner <g...@samba.org>
    Pair-Programmed-With: Sachin Prabhu <spra...@redhat.com>
    Pair-Programmed-With: Anoop C S <anoo...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Mon Nov  2 21:40:33 UTC 2020 on sn-devel-184
    
    (cherry picked from commit 2a49ccbcf5e3ff0f6833bcb7f04b800125f1783f)

commit 8079e2a9116a70726cf99c7e7ad6b4ed0f925fbe
Author: Sachin Prabhu <spra...@redhat.com>
Date:   Thu Oct 15 12:14:33 2020 +0100

    docs-xml/manpages: Add warning about write-behind translator for 
vfs_glusterfs
    
    Add warning about data corruption with the write-behind translator.
    
    The data corruption is highlighted by the smbtorture test smb2.rw.rw1.
    More information about this data corruption issue is available in the
    bz.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14486
    
    Signed-off-by: Sachin Prabhu <spra...@redhat.com>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Guenther Deschner <g...@samba.org>
    (cherry picked from commit 08f8f665d409ee7b93840c25a8142f2ce8bacfa1)

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/manpages/vfs_glusterfs.8.xml | 22 +++++++++
 source3/modules/vfs_glusterfs.c       | 91 +++++++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+)


Changeset truncated at 500 lines:

diff --git a/docs-xml/manpages/vfs_glusterfs.8.xml 
b/docs-xml/manpages/vfs_glusterfs.8.xml
index cf3b8e5e384..7a4da1af919 100644
--- a/docs-xml/manpages/vfs_glusterfs.8.xml
+++ b/docs-xml/manpages/vfs_glusterfs.8.xml
@@ -161,6 +161,28 @@
 
 </refsect1>
 
+<refsect1>
+       <title>CAVEATS</title>
+
+       <para>
+                The GlusterFS write-behind performance translator, when used
+                with Samba, could be a source of data corruption. The
+                translator, while processing a write call, immediately returns
+                success but continues writing the data to the server in the
+                background. This can cause data corruption when two clients
+                relying on Samba to provide data consistency are operating on
+                the same file.
+        </para>
+        <para>
+                The write-behind translator is enabled by default on GlusterFS.
+                The vfs_glusterfs plugin will check for the presence of the
+                translator and refuse to connect if detected.
+                Please disable the write-behind translator for the GlusterFS
+                volume to allow the plugin to connect to the volume.
+       </para>
+</refsect1>
+
+
 <refsect1>
        <title>VERSION</title>
 
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index bf7244ea3a5..3cbb1ab6cb6 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -264,6 +264,92 @@ out:
 
 /* Disk Operations */
 
+static int check_for_write_behind_translator(TALLOC_CTX *mem_ctx,
+                                            glfs_t *fs,
+                                            const char *volume)
+{
+       char *buf = NULL;
+       char **lines = NULL;
+       int numlines = 0;
+       int i;
+       char *option;
+       bool write_behind_present = false;
+       size_t newlen;
+       int ret;
+
+       ret = glfs_get_volfile(fs, NULL, 0);
+       if (ret == 0) {
+               DBG_ERR("%s: Failed to get volfile for "
+                       "volume (%s): No volfile\n",
+                       volume,
+                       strerror(errno));
+               return -1;
+       }
+       if (ret > 0) {
+               DBG_ERR("%s: Invalid return %d for glfs_get_volfile for "
+                       "volume (%s): No volfile\n",
+                       volume,
+                       ret,
+                       strerror(errno));
+               return -1;
+       }
+
+       newlen = 0 - ret;
+
+       buf = talloc_zero_array(mem_ctx, char, newlen);
+       if (buf == NULL) {
+               return -1;
+       }
+
+       ret = glfs_get_volfile(fs, buf, newlen);
+       if (ret != newlen) {
+               TALLOC_FREE(buf);
+               DBG_ERR("%s: Failed to get volfile for volume (%s)\n",
+                       volume, strerror(errno));
+               return -1;
+       }
+
+       option = talloc_asprintf(mem_ctx, "volume %s-write-behind", volume);
+       if (option == NULL) {
+               TALLOC_FREE(buf);
+               return -1;
+       }
+
+       lines = file_lines_parse(buf,
+                               newlen,
+                               &numlines,
+                               mem_ctx);
+       if (lines == NULL || numlines <= 0) {
+               TALLOC_FREE(option);
+               TALLOC_FREE(buf);
+               return -1;
+       }
+
+       for (i=0; i < numlines; i++) {
+               if (strequal(lines[i], option)) {
+                       write_behind_present = true;
+                       break;
+               }
+       }
+
+       if (write_behind_present) {
+               DBG_ERR("Write behind translator is enabled for "
+                       "volume (%s), refusing to connect! "
+                       "Please check the vfs_glusterfs(8) manpage for "
+                       "further details.\n",
+                       volume);
+               TALLOC_FREE(lines);
+               TALLOC_FREE(option);
+               TALLOC_FREE(buf);
+               return -1;
+       }
+
+       TALLOC_FREE(lines);
+       TALLOC_FREE(option);
+       TALLOC_FREE(buf);
+       return 0;
+}
+
 static int vfs_gluster_connect(struct vfs_handle_struct *handle,
                               const char *service,
                               const char *user)
@@ -363,6 +449,11 @@ static int vfs_gluster_connect(struct vfs_handle_struct 
*handle,
                goto done;
        }
 
+       ret = check_for_write_behind_translator(tmp_ctx, fs, volume);
+       if (ret < 0) {
+               goto done;
+       }
+
        ret = glfs_set_preopened(volume, handle->conn->connectpath, fs);
        if (ret < 0) {
                DEBUG(0, ("%s: Failed to register volume (%s)\n",


-- 
Samba Shared Repository

Reply via email to