diff options
author | Soumya Koduri <skoduri@redhat.com> | 2015-06-12 13:45:09 +0530 |
---|---|---|
committer | Kaleb KEITHLEY <kkeithle@redhat.com> | 2015-06-27 16:22:51 -0700 |
commit | b68f671b2b8a0aafef8f98145aee7044edaa907d (patch) | |
tree | 96a8e2d6a252692887161b3e255aae2cf1db62ce /xlators/features/upcall/src/upcall.c | |
parent | 58a736111fa1db4f10c6646e81066434260f674f (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 'xlators/features/upcall/src/upcall.c')
-rw-r--r-- | xlators/features/upcall/src/upcall.c | 49 |
1 files changed, 49 insertions, 0 deletions
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 @@ -1552,6 +1552,52 @@ err: } 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) { int ret = -1; @@ -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, |