diff options
Diffstat (limited to 'api/src/glfs-fops.c')
-rw-r--r-- | api/src/glfs-fops.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index 182317fa41a..f0c769def29 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -16,6 +16,7 @@ #include "glfs.h" #include "compat-errno.h" #include <limits.h> +#include "glusterfs3.h" #ifdef NAME_MAX #define GF_NAME_MAX NAME_MAX @@ -3495,3 +3496,87 @@ out: GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_dup, 3.4.0); +/* + * This routine is called in case of any notification received + * from the server. All the upcall events are queued up in a list + * to be read by the applications. + * + * XXX: Applications may register a cbk function for each 'fs' + * which then needs to be called by this routine incase of any + * event received. The cbk fn is responsible for notifying the + * applications the way it desires for each event queued (for eg., + * can raise a signal or broadcast a cond variable etc.) + */ +void +priv_glfs_process_upcall_event (struct glfs *fs, void *data) +{ + int ret = -1; + inode_t *inode = NULL; + uuid_t gfid; + upcall_entry *u_list = NULL; + glusterfs_ctx_t *ctx = NULL; + struct gf_upcall *upcall_data = NULL; + struct glfs_object *object = NULL; + + gf_log (THIS->name, GF_LOG_DEBUG, + "Upcall gfapi callback is called"); + + if (!fs || !data) + goto out; + + /* Unlike in I/O path, "glfs_fini" would not have freed + * 'fs' by the time we take lock as it waits for all epoll + * threads to exit including this + */ + pthread_mutex_lock (&fs->mutex); + { + ctx = fs->ctx; + + if (ctx->cleanup_started) { + pthread_mutex_unlock (&fs->mutex); + goto out; + } + + fs->pin_refcnt++; + } + pthread_mutex_unlock (&fs->mutex); + + upcall_data = (struct gf_upcall *)data; + + gf_log (THIS->name, GF_LOG_DEBUG, "Upcall gfapi gfid = %s" + "ret = %d", (char *)(upcall_data->gfid), ret); + + memcpy(gfid, (char *)(upcall_data->gfid), 16); + u_list = GF_CALLOC (1, sizeof(*u_list), + glfs_mt_upcall_entry_t); + + if (!u_list) { + gf_log (THIS->name, GF_LOG_ERROR, "Upcall entry allocation" + "failed."); + goto out; + } + + INIT_LIST_HEAD (&u_list->upcall_list); + + uuid_copy (u_list->gfid, gfid); + u_list->event_type = upcall_data->event_type; + u_list->flags = (uint32_t)(upcall_data->flags); + u_list->expire_time_attr = upcall_data->expire_time_attr; + + pthread_mutex_lock (&fs->upcall_list_mutex); + { + list_add_tail (&u_list->upcall_list, + &fs->upcall_list); + } + pthread_mutex_unlock (&fs->upcall_list_mutex); + + pthread_mutex_lock (&fs->mutex); + { + fs->pin_refcnt--; + } + pthread_mutex_unlock (&fs->mutex); +out: + return; +} + +GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_process_upcall_event, 3.7.0); |