summaryrefslogtreecommitdiffstats
path: root/api/src/glfs.c
diff options
context:
space:
mode:
authorSoumya Koduri <skoduri@redhat.com>2015-06-12 13:45:09 +0530
committerKaleb KEITHLEY <kkeithle@redhat.com>2015-06-27 16:22:51 -0700
commitb68f671b2b8a0aafef8f98145aee7044edaa907d (patch)
tree96a8e2d6a252692887161b3e255aae2cf1db62ce /api/src/glfs.c
parent58a736111fa1db4f10c6646e81066434260f674f (diff)
Upcall/gfapi: Return ENOTSUP when upcall feature is disabled
Changes to detect the list of upcall events enabled using GF_FOP_IPC and return ENOTSUP to applications in case if they poll for any of the events disabled. Change-Id: Icc748054ef903598288119dbe99b1e337174662a BUG: 1231132 Signed-off-by: Niels de Vos <ndevos@redhat.com> Signed-off-by: Soumya Koduri <skoduri@redhat.com> Reviewed-on: http://review.gluster.org/11196 Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com> Tested-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Diffstat (limited to 'api/src/glfs.c')
-rw-r--r--api/src/glfs.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c
index fc392947e1e..7b9f1ed6d01 100644
--- a/api/src/glfs.c
+++ b/api/src/glfs.c
@@ -253,6 +253,58 @@ get_volfp (struct glfs *fs)
}
+static int
+detect_upcall_features (struct glfs *fs)
+{
+ xlator_t *subvol = NULL;
+ int ret = -1;
+ dict_t *dict = NULL;
+ uint32_t features = 0;
+
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
+
+ subvol = glfs_active_subvol (fs);
+ if (!subvol) {
+ ret = -1;
+ errno = EIO;
+ goto out;
+ }
+
+ ret = syncop_ipc (subvol, GF_IPC_UPCALL_FEATURES, NULL, &dict);
+ DECODE_SYNCOP_ERR (ret);
+
+ if (ret)
+ /* some real error occured */
+ goto out;
+
+ if (!dict) {
+ /* unavailable upcalls should not be an error */
+ ret = 0;
+ goto out;
+ }
+
+ ret = dict_get_uint32 (dict, GF_UPCALL_FEATURES, &features);
+ if (ret) {
+ /* unavailable upcalls should not be an error */
+ ret = 0;
+ goto out;
+ }
+
+ fs->upcall_features = features;
+
+out:
+ if (dict)
+ dict_unref (dict);
+
+ glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
+ return ret;
+}
+
+
int
glfs_volumes_init (struct glfs *fs)
{
@@ -267,7 +319,7 @@ glfs_volumes_init (struct glfs *fs)
if (cmd_args->volfile_server) {
ret = glfs_mgmt_init (fs);
- goto out;
+ goto finish;
}
fp = get_volfp (fs);
@@ -284,6 +336,11 @@ glfs_volumes_init (struct glfs *fs)
if (ret)
goto out;
+finish:
+ ret = detect_upcall_features (fs);
+ if (ret)
+ goto out;
+
out:
return ret;
}