diff options
Diffstat (limited to 'api/src')
-rw-r--r-- | api/src/gfapi-messages.h | 2 | ||||
-rw-r--r-- | api/src/glfs-fops.c | 53 |
2 files changed, 45 insertions, 10 deletions
diff --git a/api/src/gfapi-messages.h b/api/src/gfapi-messages.h index 20418627690..03269a1c9d8 100644 --- a/api/src/gfapi-messages.h +++ b/api/src/gfapi-messages.h @@ -49,6 +49,6 @@ GLFS_MSGID(API, API_MSG_MEM_ACCT_INIT_FAILED, API_MSG_MASTER_XLATOR_INIT_FAILED, API_MSG_INODE_LINK_FAILED, API_MSG_STATEDUMP_FAILED, API_MSG_XREADDIRP_R_FAILED, API_MSG_LOCK_INSERT_MERGE_FAILED, API_MSG_SETTING_LOCK_TYPE_FAILED, API_MSG_INODE_FIND_FAILED, - API_MSG_FDCTX_SET_FAILED); + API_MSG_FDCTX_SET_FAILED, API_MSG_UPCALL_SYNCOP_FAILED); #endif /* !_GFAPI_MESSAGES_H__ */ diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index 54eb2603f38..302ccc5db07 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -31,6 +31,11 @@ #define GF_NAME_MAX 255 #endif +struct upcall_syncop_args { + struct glfs *fs; + struct gf_upcall *upcall_data; +}; + #define READDIRBUF_SIZE (sizeof(struct dirent) + GF_NAME_MAX + 1) typedef void (*glfs_io_cbk34)(glfs_fd_t *fd, ssize_t ret, void *data); @@ -5294,19 +5299,17 @@ out: return ret; } -static void -glfs_cbk_upcall_data(struct glfs *fs, struct gf_upcall *upcall_data) +static int +glfs_cbk_upcall_syncop(void *opaque) { + struct upcall_syncop_args *args = opaque; int ret = -1; struct glfs_upcall *up_arg = NULL; + struct glfs *fs; + struct gf_upcall *upcall_data; - if (!fs || !upcall_data) - goto out; - - if (!(fs->upcall_events & upcall_data->event_type)) { - /* ignore events which application hasn't registered*/ - goto out; - } + fs = args->fs; + upcall_data = args->upcall_data; up_arg = GLFS_CALLOC(1, sizeof(struct gf_upcall), glfs_release_upcall, glfs_mt_upcall_entry_t); @@ -5353,6 +5356,38 @@ out: GLFS_FREE(up_arg); } + return ret; +} + +static void +glfs_cbk_upcall_data(struct glfs *fs, struct gf_upcall *upcall_data) +{ + struct upcall_syncop_args args = { + 0, + }; + int ret = -1; + + if (!fs || !upcall_data) + goto out; + + if (!(fs->upcall_events & upcall_data->event_type)) { + /* ignore events which application hasn't registered*/ + goto out; + } + + args.fs = fs; + args.upcall_data = upcall_data; + + ret = synctask_new(THIS->ctx->env, glfs_cbk_upcall_syncop, NULL, NULL, + &args); + /* should we retry incase of failure? */ + if (ret) { + gf_msg(THIS->name, GF_LOG_ERROR, errno, API_MSG_UPCALL_SYNCOP_FAILED, + "Synctak for Upcall event_type(%d) and gfid(%s) failed", + upcall_data->event_type, (char *)(upcall_data->gfid)); + } + +out: return; } |