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 --- xlators/features/upcall/src/upcall.c | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'xlators') diff --git a/xlators/features/upcall/src/upcall.c b/xlators/features/upcall/src/upcall.c index 4954d43db07..bb29866543b 100644 --- a/xlators/features/upcall/src/upcall.c +++ b/xlators/features/upcall/src/upcall.c @@ -1551,6 +1551,52 @@ err: return 0; } +int32_t +up_ipc (call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata) +{ + int ret = 0; + uint32_t features = 0; + + /* upcall only has one IPC operation */ + if (op != GF_IPC_UPCALL_FEATURES) + goto wind; + + if (!xdata) { + xdata = dict_new(); + if (!xdata) { + ret = -1; + goto unwind; + } + } else { + /* take an extra reference so that we can unconditionally unref + * it later */ + dict_ref (xdata); + } + + /* build the feature bitmask */ + if (is_upcall_enabled(this)) + features |= (1 << GF_UPCALL_EVENT_NULL); + + /* check if 'GF_UPCALL_CACHE_INVALIDATION' is available */ + if (is_cache_invalidation_enabled(this)) + features |= (1 << GF_UPCALL_CACHE_INVALIDATION); + + ret = dict_set_uint32 (xdata, GF_UPCALL_FEATURES, features); + +unwind: + UPCALL_STACK_UNWIND (ipc, frame, ret, errno, xdata); + + dict_unref (xdata); + + return 0; + +wind: + STACK_WIND (frame, default_ipc_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->ipc, op, xdata); + + return 0; +} + int32_t mem_acct_init (xlator_t *this) { @@ -1813,6 +1859,9 @@ struct xlator_fops fops = { .rmdir = up_rmdir, .rename = up_rename, + /* xlator internal communication */ + .ipc = up_ipc, + #ifdef NOT_SUPPORTED /* internal lk fops */ .inodelk = up_inodelk, -- cgit