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,  | 
