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