summaryrefslogtreecommitdiff
path: root/0185-gfapi-provide-an-api-for-setting-statedump-path.patch
diff options
context:
space:
mode:
Diffstat (limited to '0185-gfapi-provide-an-api-for-setting-statedump-path.patch')
-rw-r--r--0185-gfapi-provide-an-api-for-setting-statedump-path.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/0185-gfapi-provide-an-api-for-setting-statedump-path.patch b/0185-gfapi-provide-an-api-for-setting-statedump-path.patch
new file mode 100644
index 0000000..8e93247
--- /dev/null
+++ b/0185-gfapi-provide-an-api-for-setting-statedump-path.patch
@@ -0,0 +1,174 @@
+From 462e3988936761317975fd811dd355b81328b60a Mon Sep 17 00:00:00 2001
+From: Amar Tumballi <amarts@redhat.com>
+Date: Thu, 14 Mar 2019 10:04:28 +0530
+Subject: [PATCH 185/192] gfapi: provide an api for setting statedump path
+
+Currently for an application using glfsapi to use glusterfs, when a
+statedump is taken, it uses /var/run/gluster dir to dump info.
+
+There can be concerns as this directory may be owned by some other
+user, and hence it may fail taking statedump. Such applications
+should have an option to use different path.
+
+This patch provides an API to do so.
+
+Upstream details:
+> Updates: bz#1689097
+> Change-Id: I8918e002bc823d83614c972b6c738baa04681b23
+> URL: https://review.gluster.org/22364
+
+BUG: 1720461
+Change-Id: I6079c8d799f35eaf76e62d259b51573bf561ba5b
+Signed-off-by: Amar Tumballi <amarts@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/173451
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
+---
+ api/src/gfapi.aliases | 2 ++
+ api/src/gfapi.map | 5 ++++
+ api/src/glfs.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ api/src/glfs.h | 28 +++++++++++++++++++++++
+ 4 files changed, 98 insertions(+)
+
+diff --git a/api/src/gfapi.aliases b/api/src/gfapi.aliases
+index 09c0fd8..8fdf734 100644
+--- a/api/src/gfapi.aliases
++++ b/api/src/gfapi.aliases
+@@ -195,3 +195,5 @@ _pub_glfs_zerofill_async _glfs_zerofill_async$GFAPI_6.0
+ _pub_glfs_copy_file_range _glfs_copy_file_range$GFAPI_6.0
+ _pub_glfs_fsetattr _glfs_fsetattr$GFAPI_6.0
+ _pub_glfs_setattr _glfs_setattr$GFAPI_6.0
++
++_pub_glfs_set_statedump_path _glfs_set_statedump_path@GFAPI_future
+diff --git a/api/src/gfapi.map b/api/src/gfapi.map
+index b97a614..cf118e8 100644
+--- a/api/src/gfapi.map
++++ b/api/src/gfapi.map
+@@ -271,3 +271,8 @@ GFAPI_PRIVATE_6.1 {
+ global:
+ glfs_setfspid;
+ } GFAPI_6.0;
++
++GFAPI_future {
++ global:
++ glfs_set_statedump_path;
++} GFAPI_PRIVATE_6.1;
+diff --git a/api/src/glfs.c b/api/src/glfs.c
+index f4a8e08..ba513e6 100644
+--- a/api/src/glfs.c
++++ b/api/src/glfs.c
+@@ -1212,6 +1212,7 @@ glusterfs_ctx_destroy(glusterfs_ctx_t *ctx)
+ glusterfs_graph_destroy_residual(trav_graph);
+ }
+
++ GF_FREE(ctx->statedump_path);
+ FREE(ctx);
+
+ return ret;
+@@ -1738,3 +1739,65 @@ invalid_fs:
+ }
+
+ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_unregister, 3.13.0);
++
++int
++pub_glfs_set_statedump_path(struct glfs *fs, const char *path)
++{
++ struct stat st;
++ int ret;
++ DECLARE_OLD_THIS;
++ __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);
++
++ if (!path) {
++ gf_log("glfs", GF_LOG_ERROR, "path is NULL");
++ errno = EINVAL;
++ goto err;
++ }
++
++ /* If path is not present OR, if it is directory AND has enough permission
++ * to create files, then proceed */
++ ret = sys_stat(path, &st);
++ if (ret && errno != ENOENT) {
++ gf_log("glfs", GF_LOG_ERROR, "%s: not a valid path (%s)", path,
++ strerror(errno));
++ errno = EINVAL;
++ goto err;
++ }
++
++ if (!ret) {
++ /* file is present, now check other things */
++ if (!S_ISDIR(st.st_mode)) {
++ gf_log("glfs", GF_LOG_ERROR, "%s: path is not directory", path);
++ errno = EINVAL;
++ goto err;
++ }
++ if (sys_access(path, W_OK | X_OK) < 0) {
++ gf_log("glfs", GF_LOG_ERROR,
++ "%s: path doesn't have write permission", path);
++ errno = EPERM;
++ goto err;
++ }
++ }
++
++ /* If set, it needs to be freed, so we don't have leak */
++ GF_FREE(fs->ctx->statedump_path);
++
++ fs->ctx->statedump_path = gf_strdup(path);
++ if (!fs->ctx->statedump_path) {
++ gf_log("glfs", GF_LOG_ERROR,
++ "%s: failed to set statedump path, no memory", path);
++ errno = ENOMEM;
++ goto err;
++ }
++
++ __GLFS_EXIT_FS;
++
++ return 0;
++err:
++ __GLFS_EXIT_FS;
++
++invalid_fs:
++ return -1;
++}
++
++GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_statedump_path, future);
+diff --git a/api/src/glfs.h b/api/src/glfs.h
+index 6714782..a6c12e1 100644
+--- a/api/src/glfs.h
++++ b/api/src/glfs.h
+@@ -1453,5 +1453,33 @@ int
+ glfs_setattr(struct glfs *fs, const char *path, struct glfs_stat *stat,
+ int follow) __THROW GFAPI_PUBLIC(glfs_setattr, 6.0);
+
++/*
++ SYNOPSIS
++
++ glfs_set_statedump_path: Function to set statedump path.
++
++ DESCRIPTION
++
++ This function is used to set statedump directory
++
++ PARAMETERS
++
++ @fs: The 'virtual mount' object to be configured with the volume
++ specification file.
++
++ @path: statedump path. Should be a directory. But the API won't fail if the
++ directory doesn't exist yet, as one may create it later.
++
++ RETURN VALUES
++
++ 0 : Success.
++ -1 : Failure. @errno will be set with the type of failure.
++
++ */
++
++int
++glfs_set_statedump_path(struct glfs *fs, const char *path) __THROW
++ GFAPI_PUBLIC(glfs_set_statedump_path, future);
++
+ __END_DECLS
+ #endif /* !_GLFS_H */
+--
+1.8.3.1
+