diff options
Diffstat (limited to 'api/src')
| -rw-r--r-- | api/src/gfapi-messages.h | 3 | ||||
| -rw-r--r-- | api/src/glfs-fops.c | 55 | 
2 files changed, 47 insertions, 11 deletions
| diff --git a/api/src/gfapi-messages.h b/api/src/gfapi-messages.h index 4d9dff7196d..07cdb067799 100644 --- a/api/src/gfapi-messages.h +++ b/api/src/gfapi-messages.h @@ -77,7 +77,8 @@ GLFS_MSGID(API,          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 50f32fae6f6..4e349b3ddb5 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); @@ -4859,19 +4864,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, @@ -4921,7 +4924,39 @@ out:                  GLFS_FREE (up_arg);          } -        return; +        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;  }  /* | 
