From b68f671b2b8a0aafef8f98145aee7044edaa907d Mon Sep 17 00:00:00 2001 From: Soumya Koduri Date: Fri, 12 Jun 2015 13:45:09 +0530 Subject: 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 Signed-off-by: Soumya Koduri Reviewed-on: http://review.gluster.org/11196 Reviewed-by: Kaleb KEITHLEY Tested-by: Kaleb KEITHLEY --- api/src/glfs-handleops.c | 12 ++++++++++ api/src/glfs-handles.h | 1 + api/src/glfs-internal.h | 1 + api/src/glfs.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 72 insertions(+), 1 deletion(-) (limited to 'api') diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c index c010f0c9a0f..f458cb4bd58 100644 --- a/api/src/glfs-handleops.c +++ b/api/src/glfs-handleops.c @@ -1881,6 +1881,18 @@ pub_glfs_h_poll_upcall (struct glfs *fs, struct callback_arg *up_arg) __GLFS_ENTRY_VALIDATE_FS (fs, err); + /* check if upcalls are enabled */ + if (!fs->upcall_features) { + errno = ENOTSUP; + goto restore; + } + + /* check if GF_UPCALL_CACHE_INVALIDATION is supported */ + if (!(fs->upcall_features & (1 << GF_UPCALL_CACHE_INVALIDATION))) { + errno = ENOTSUP; + goto restore; + } + /* get the active volume */ subvol = glfs_active_subvol (fs); diff --git a/api/src/glfs-handles.h b/api/src/glfs-handles.h index 19c4e8f7a62..ddb11bf0bd5 100644 --- a/api/src/glfs-handles.h +++ b/api/src/glfs-handles.h @@ -293,6 +293,7 @@ glfs_h_access (struct glfs *fs, struct glfs_object *object, int mask) __THROW 0 : Success. -1 : Error condition, mostly due to out of memory. + 'errno' is set to ENOTSUP if upcall feature is not enabled. */ diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h index 71c83755ec3..5eb57d4b8e4 100644 --- a/api/src/glfs-internal.h +++ b/api/src/glfs-internal.h @@ -199,6 +199,7 @@ struct glfs { gf_boolean_t migration_in_progress; + uint32_t upcall_features; /* supported upcall events */ struct list_head upcall_list; pthread_mutex_t upcall_list_mutex; /* mutex for upcall entry list */ 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; } -- cgit