diff options
Diffstat (limited to 'xlators/features/upcall/src/upcall.h')
| -rw-r--r-- | xlators/features/upcall/src/upcall.h | 134 | 
1 files changed, 134 insertions, 0 deletions
diff --git a/xlators/features/upcall/src/upcall.h b/xlators/features/upcall/src/upcall.h new file mode 100644 index 00000000000..a5aff9d091e --- /dev/null +++ b/xlators/features/upcall/src/upcall.h @@ -0,0 +1,134 @@ +/* +   Copyright (c) 2015 Red Hat, Inc. <http://www.redhat.com> +   This file is part of GlusterFS. + +   This file is licensed to you under your choice of the GNU Lesser +   General Public License, version 3 or any later version (LGPLv3 or +   later), or the GNU General Public License, version 2 (GPLv2), in all +   cases as published by the Free Software Foundation. +*/ +#ifndef __UPCALL_H__ +#define __UPCALL_H__ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include "compat-errno.h" +#include "stack.h" +#include "call-stub.h" +#include "upcall-mem-types.h" +#include "client_t.h" +#include "rpcsvc.h" +#include "lkowner.h" +#include "locking.h" +#include "upcall-messages.h" +#include "upcall-cache-invalidation.h" + +#define EXIT_IF_UPCALL_OFF(label) do {                     \ +        if (!(ON_CACHE_INVALIDATION))                      \ +                goto label;                                \ +} while (0) + +#define UPCALL_STACK_UNWIND(fop, frame, params ...) do {        \ +        upcall_local_t *__local = NULL;                         \ +        xlator_t *__xl          = NULL;                         \ +        if (frame) {                                            \ +                        __xl         = frame->this;             \ +                        __local      = frame->local;            \ +                        frame->local = NULL;                    \ +                }                                               \ +                STACK_UNWIND_STRICT (fop, frame, params);       \ +                upcall_local_wipe (__xl, __local);              \ +        } while (0) + +#define UPCALL_STACK_DESTROY(frame) do {                   \ +                upcall_local_t *__local = NULL;            \ +                xlator_t    *__xl    = NULL;               \ +                __xl                 = frame->this;        \ +                __local              = frame->local;       \ +                frame->local         = NULL;               \ +                STACK_DESTROY (frame->root);               \ +                upcall_local_wipe (__xl, __local);         \ +        } while (0) + +struct _upcalls_private_t { +        int client_id; /* Not sure if reqd */ +}; +typedef struct _upcalls_private_t upcalls_private_t; + +enum _upcall_event_type_t { +        EVENT_NULL, +        CACHE_INVALIDATION, +}; +typedef enum _upcall_event_type_t upcall_event_type_t; + +struct _upcall_client_t { +        struct list_head client_list; +        /* strdup to store client_uid, strdup. Free it explicitly */ +        char *client_uid; +        time_t access_time; /* time last accessed */ +        /* the amount of time which client can cache this entry */ +        uint32_t expire_time_attr; +}; +typedef struct _upcall_client_t upcall_client_t; + +/* Upcall entries are maintained in inode_ctx */ +struct _upcall_inode_ctx_t { +        struct list_head client_list; +        pthread_mutex_t client_list_lock; /* mutex for clients list +                                                of this upcall entry */ +}; +typedef struct _upcall_inode_ctx_t upcall_inode_ctx_t; + +struct _notify_event_data { +        uuid_t gfid; +        upcall_client_t *client_entry; +        upcall_event_type_t event_type; +        uint32_t invalidate_flags; +        /* any extra data needed, like inode flags +         * to be invalidated incase of cache invalidation, +         * may be fd for lease recalls */ +        void *extra; +}; +typedef struct _notify_event_data notify_event_data_t; + +struct upcall_local { +        /* XXX: need to check if we can store +         * pointers in 'local' which may get freed +         * in future by other thread +         */ +        upcall_inode_ctx_t *upcall_inode_ctx; +        inode_t   *inode; +}; +typedef struct upcall_local upcall_local_t; + +void upcall_local_wipe (xlator_t *this, upcall_local_t *local); +upcall_local_t *upcall_local_init (call_frame_t *frame, xlator_t *this, inode_t *inode); + +upcall_client_t *add_upcall_client (call_frame_t *frame, uuid_t gfid, +                                    client_t *client, +                                    upcall_inode_ctx_t *up_inode_ctx); +upcall_client_t *__add_upcall_client (call_frame_t *frame, uuid_t gfid, +                                      client_t *client, +                                      upcall_inode_ctx_t *up_inode_ctx); +upcall_client_t *__get_upcall_client (call_frame_t *frame, uuid_t gfid, +                                      client_t *client, +                                      upcall_inode_ctx_t *up_inode_ctx); +int __upcall_cleanup_client_entry (upcall_client_t *up_client); + +int __upcall_inode_ctx_set (inode_t *inode, xlator_t *this); +upcall_inode_ctx_t *__upcall_inode_ctx_get (inode_t *inode, xlator_t *this); +upcall_inode_ctx_t *upcall_inode_ctx_get (inode_t *inode, xlator_t *this); +int upcall_cleanup_inode_ctx (xlator_t *this, inode_t *inode); + +void upcall_cache_invalidate (call_frame_t *frame, xlator_t *this, client_t *client, +                              inode_t *inode, uint32_t flags); +void upcall_client_cache_invalidate (xlator_t *xl, uuid_t gfid, +                                     upcall_client_t *up_client_entry, +                                     uint32_t flags); +void upcall_cache_forget (xlator_t *this, inode_t *inode, +                          upcall_inode_ctx_t *up_inode_ctx); + +#endif /* __UPCALL_H__ */  | 
