diff options
| -rw-r--r-- | xlators/features/locks/src/common.c | 11 | ||||
| -rw-r--r-- | xlators/features/locks/src/common.h | 2 | ||||
| -rw-r--r-- | xlators/features/locks/src/locks.h | 1 | ||||
| -rw-r--r-- | xlators/features/locks/src/posix.c | 13 | 
4 files changed, 20 insertions, 7 deletions
diff --git a/xlators/features/locks/src/common.c b/xlators/features/locks/src/common.c index fb011fe6a7a..17be81ff24c 100644 --- a/xlators/features/locks/src/common.c +++ b/xlators/features/locks/src/common.c @@ -421,7 +421,7 @@ out:  /* Create a new posix_lock_t */  posix_lock_t * -new_posix_lock (struct flock *flock, transport_t *transport, pid_t client_pid) +new_posix_lock (struct flock *flock, transport_t *transport, pid_t client_pid, uint64_t owner)  {  	posix_lock_t *lock = NULL; @@ -440,6 +440,7 @@ new_posix_lock (struct flock *flock, transport_t *transport, pid_t client_pid)  	lock->transport  = transport;  	lock->client_pid = client_pid; +        lock->owner      = owner;  	INIT_LIST_HEAD (&lock->list); @@ -507,8 +508,10 @@ locks_overlap (posix_lock_t *l1, posix_lock_t *l2)  int  same_owner (posix_lock_t *l1, posix_lock_t *l2)  { -	return ((l1->client_pid == l2->client_pid) && -		(l1->transport  == l2->transport)); + +                return ((l1->owner == l2->owner) && +                        (l1->transport  == l2->transport)); +  } @@ -680,6 +683,7 @@ __insert_and_merge (pl_inode_t *pl_inode, posix_lock_t *lock)                                  sum->fl_type    = lock->fl_type;                                  sum->transport  = lock->transport;                                  sum->client_pid = lock->client_pid; +                                sum->owner      = lock->owner;                                  __delete_lock (pl_inode, conf);                                  __destroy_lock (conf); @@ -694,6 +698,7 @@ __insert_and_merge (pl_inode_t *pl_inode, posix_lock_t *lock)                                  sum->fl_type    = conf->fl_type;                                  sum->transport  = conf->transport;                                  sum->client_pid = conf->client_pid; +                                sum->owner      = conf->owner;                                  v = subtract_locks (sum, lock); diff --git a/xlators/features/locks/src/common.h b/xlators/features/locks/src/common.h index 292d82ce8c3..0d847f77029 100644 --- a/xlators/features/locks/src/common.h +++ b/xlators/features/locks/src/common.h @@ -21,7 +21,7 @@  #define __COMMON_H__  posix_lock_t * -new_posix_lock (struct flock *flock, transport_t *transport, pid_t client_pid); +new_posix_lock (struct flock *flock, transport_t *transport, pid_t client_pid, uint64_t owner);  pl_inode_t *  pl_inode_get (xlator_t *this, inode_t *inode); diff --git a/xlators/features/locks/src/locks.h b/xlators/features/locks/src/locks.h index 4738da068c9..1b234dd17fd 100644 --- a/xlators/features/locks/src/locks.h +++ b/xlators/features/locks/src/locks.h @@ -51,6 +51,7 @@ struct __posix_lock {          transport_t       *transport;     /* to identify client node */          pid_t              client_pid;    /* pid of client process */ +        uint64_t           owner;         /* lock owner from fuse */  };  typedef struct __posix_lock posix_lock_t; diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index 95941994e5c..674485576fd 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -77,7 +77,7 @@ pl_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  static int  truncate_allowed (pl_inode_t *pl_inode,                    transport_t *transport, pid_t client_pid, -                  off_t offset) +                  uint64_t owner, off_t offset)  {          posix_lock_t *l = NULL;          posix_lock_t  region = {.list = {0, }, }; @@ -87,6 +87,7 @@ truncate_allowed (pl_inode_t *pl_inode,          region.fl_end     = LLONG_MAX;          region.transport  = transport;          region.client_pid = client_pid; +        region.owner      = owner;          pthread_mutex_lock (&pl_inode->mutex);          { @@ -142,7 +143,8 @@ truncate_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (priv->mandatory              && pl_inode->mandatory              && !truncate_allowed (pl_inode, frame->root->trans, -                                  frame->root->pid, local->offset)) { +                                  frame->root->pid, frame->root->lk_owner, +                                  local->offset)) {                  op_ret   = -1;                  op_errno = EAGAIN;                  goto unwind; @@ -454,6 +456,7 @@ pl_readv (call_frame_t *frame, xlator_t *this,                  region.fl_end     = offset + size - 1;                  region.transport  = frame->root->trans;                  region.client_pid = frame->root->pid; +                region.owner      = frame->root->lk_owner;                  pthread_mutex_lock (&pl_inode->mutex);                  { @@ -549,6 +552,7 @@ pl_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,                  region.fl_end     = offset + iov_length (vector, count) - 1;                  region.transport  = frame->root->trans;                  region.client_pid = frame->root->pid; +                region.owner      = frame->root->lk_owner;                  pthread_mutex_lock (&pl_inode->mutex);                  { @@ -614,6 +618,7 @@ pl_lk (call_frame_t *frame, xlator_t *this,  {          transport_t           *transport = NULL;          pid_t                  client_pid = 0; +        uint64_t               owner      = 0;          posix_locks_private_t *priv = NULL;          pl_inode_t            *pl_inode = NULL;          int                    op_ret = 0; @@ -625,6 +630,7 @@ pl_lk (call_frame_t *frame, xlator_t *this,          transport  = frame->root->trans;          client_pid = frame->root->pid; +        owner      = frame->root->lk_owner;          priv       = this->private;          pl_inode = pl_inode_get (this, fd->inode); @@ -636,7 +642,8 @@ pl_lk (call_frame_t *frame, xlator_t *this,                  goto unwind;          } -        reqlock = new_posix_lock (flock, transport, client_pid); +        reqlock = new_posix_lock (flock, transport, client_pid, owner); +          if (!reqlock) {                  gf_log (this->name, GF_LOG_ERROR,                          "Out of memory.");  | 
