diff options
Diffstat (limited to 'libglusterfs/src/syncop.c')
-rw-r--r-- | libglusterfs/src/syncop.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 63b9973a2d1..4fa23002e24 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -3062,3 +3062,82 @@ syncop_fxattrop (xlator_t *subvol, fd_t *fd, gf_xattrop_flags_t flags, return args.op_ret; } + +int32_t +syncop_getactivelk_cbk (call_frame_t *frame, + void *cookie, + xlator_t *this, + int32_t op_ret, + int32_t op_errno, + lock_migration_info_t *locklist, dict_t *xdata) +{ + struct syncargs *args = NULL; + lock_migration_info_t *tmp = NULL; + lock_migration_info_t *entry = NULL; + + args = cookie; + + INIT_LIST_HEAD (&args->locklist.list); + + args->op_ret = op_ret; + args->op_errno = op_errno; + if (xdata) + args->xdata = dict_ref (xdata); + + if (op_ret > 0) { + list_for_each_entry (tmp, &locklist->list, list) { + entry = GF_CALLOC (1, sizeof (lock_migration_info_t), + gf_common_mt_char); + + if (!entry) { + gf_msg (THIS->name, GF_LOG_ERROR, 0, 0, + "lock mem allocation failed"); + gf_free_mig_locks (&args->locklist); + + break; + } + + INIT_LIST_HEAD (&entry->list); + + entry->flock = tmp->flock; + + entry->client_uid = gf_strdup (tmp->client_uid); + + list_add_tail (&entry->list, &args->locklist.list); + + } + } + + __wake (args); + + return 0; + +} + +int +syncop_getactivelk (xlator_t *subvol, loc_t *loc, + lock_migration_info_t *locklist, dict_t *xdata_in, + dict_t **xdata_out) +{ + struct syncargs args = {0, }; + + SYNCOP (subvol, (&args), syncop_getactivelk_cbk, + subvol->fops->getactivelk, + loc, xdata_in); + + if (locklist) + list_splice_init (&args.locklist.list, &locklist->list); + else + gf_free_mig_locks (&args.locklist) ; + + if (xdata_out) + *xdata_out = args.xdata; + else if (args.xdata) + dict_unref (args.xdata); + + if (args.op_ret < 0) + return -args.op_errno; + + return args.op_ret; + +} |