diff options
author | Susant Palai <spalai@redhat.com> | 2016-04-17 10:23:20 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2016-05-01 18:04:58 -0700 |
commit | 2f4733657b0a8439620b045fcb597838a818487a (patch) | |
tree | e13f1c324b15ed027c7ca0095e9a9c081bab5dcc | |
parent | 888c29bac041ea45973a4a50acb903143a5ce28c (diff) |
posix/lock: add setactivelk () fop
Change-Id: Ic7ad7362ac0e8bb0f8861698767c9ab7da539403
BUG: 1326085
Signed-off-by: Susant Palai <spalai@redhat.com>
Reviewed-on: http://review.gluster.org/14014
Smoke: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
-rw-r--r-- | xlators/features/locks/src/posix.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index 2f3ad957540..a48d1c49240 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -2944,6 +2944,124 @@ pl_rename (call_frame_t *frame, xlator_t *this, return 0; } +posix_lock_t * +gf_lkmig_info_to_posix_lock (call_frame_t *frame, + lock_migration_info_t *lmi) +{ + posix_lock_t *lock = NULL; + + lock = GF_CALLOC (1, sizeof (posix_lock_t), gf_locks_mt_posix_lock_t); + if (!lock) + goto out; + + lock->fl_start = lmi->flock.l_start; + lock->fl_type = lmi->flock.l_type; + + if (lmi->flock.l_len == 0) + lock->fl_end = LLONG_MAX; + else + lock->fl_end = lmi->flock.l_start + lmi->flock.l_len - 1; + + lock->client = frame->root->client; + + lock->client_uid = gf_strdup (lmi->client_uid); + if (lock->client_uid == NULL) { + GF_FREE (lock); + goto out; + } + + lock->client_pid = lmi->flock.l_pid; + lock->owner = lmi->flock.l_owner; + + INIT_LIST_HEAD (&lock->list); + +out: + return lock; +} + +/* This function is supposed to write the active locks from the source brick(in + * rebalance context) and write here. Hence, will add the locks directly to the + * pl_inode->ext_list*/ +int +pl_write_active_locks (call_frame_t *frame, pl_inode_t *pl_inode, + lock_migration_info_t *locklist) +{ + posix_lock_t *newlock = NULL; + lock_migration_info_t *temp = NULL; + int ret = 0; + + pthread_mutex_lock (&pl_inode->mutex); + { + /* Just making sure the activelk list is empty. Should not + * happen though*/ + if (!list_empty (&pl_inode->ext_list)) { + + gf_msg (THIS->name, GF_LOG_ERROR, 0, 0, + "invalid locks found"); + + ret = -1; + goto out; + } + + /* This list also should not be empty */ + if (list_empty (&locklist->list)) { + gf_msg (THIS->name, GF_LOG_ERROR, 0, 0, + "empty lock list"); + + ret = -1; + goto out; + } + + list_for_each_entry (temp, &locklist->list, list) { + + newlock = gf_lkmig_info_to_posix_lock (frame, temp); + if (!newlock) { + gf_msg (THIS->name, GF_LOG_ERROR, 0, 0, + "mem allocation failed for newlock"); + + ret = -1; + goto out; + } + list_add_tail (&newlock->list, &pl_inode->ext_list); + } + } + +out: + /*TODO: What if few lock add failed with ENOMEM. Should the already + * added locks be clearted */ + pthread_mutex_unlock (&pl_inode->mutex); + + return ret; +} + +static int +pl_setactivelk (call_frame_t *frame, xlator_t *this, loc_t *loc, + lock_migration_info_t *locklist, dict_t *xdata) +{ + pl_inode_t *pl_inode = NULL; + int op_ret = 0; + int op_errno = 0; + int ret = 0; + + pl_inode = pl_inode_get (this, loc->inode); + if (!pl_inode) { + gf_msg (this->name, GF_LOG_ERROR, 0, 0, + "pl_inode_get failed"); + + op_ret = -1; + op_errno = ENOMEM; + goto out; + } + ret = pl_write_active_locks (frame, pl_inode, locklist); + + op_ret = ret; + +out: + STACK_UNWIND_STRICT (setactivelk, frame, op_ret, op_errno, NULL); + + return 0; +} + struct xlator_fops fops = { .lookup = pl_lookup, .create = pl_create, @@ -2966,6 +3084,7 @@ struct xlator_fops fops = { .fsetxattr = pl_fsetxattr, .rename = pl_rename, .getactivelk = pl_getactivelk, + .setactivelk = pl_setactivelk, }; struct xlator_dumpops dumpops = { |