diff options
-rw-r--r-- | libglusterfs/src/stack.h | 2 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 40 |
2 files changed, 38 insertions, 4 deletions
diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h index 0af9ed35991..722651a4c9d 100644 --- a/libglusterfs/src/stack.h +++ b/libglusterfs/src/stack.h @@ -95,6 +95,8 @@ struct _call_stack_t { pid_t pid; uint32_t ngrps; uint32_t groups[GF_REQUEST_MAXGROUPS]; + uint64_t lk_owner; + call_frame_t frames; int32_t op; diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 732d97e3f18..30ad3e96208 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -168,6 +168,7 @@ typedef struct { char is_revalidate; int32_t callcount; gf_lock_t lock; + uint64_t lk_owner; } fuse_state_t; @@ -282,6 +283,20 @@ get_state (xlator_t *this, fuse_in_header_t *finh) } +void +set_lock_owner (fuse_state_t *state, xlator_t *this, + uint64_t owner, uint64_t pid) +{ + fuse_private_t *priv = NULL; + + priv = this->private; + + if (priv->proto_minor >= 9) + state->lk_owner = owner; + else + state->lk_owner = pid; +} + static call_frame_t * get_call_frame_for_req (fuse_state_t *state) { @@ -301,10 +316,11 @@ get_call_frame_for_req (fuse_state_t *state) return NULL; if (finh) { - frame->root->uid = finh->uid; - frame->root->gid = finh->gid; - frame->root->pid = finh->pid; - frame->root->unique = finh->unique; + frame->root->uid = finh->uid; + frame->root->gid = finh->gid; + frame->root->pid = finh->pid; + frame->root->lk_owner = state->lk_owner; + frame->root->unique = finh->unique; } frame->root->type = GF_OP_TYPE_FOP_REQUEST; @@ -1040,6 +1056,8 @@ fuse_setattr (xlator_t *this, fuse_in_header_t *finh, void *msg) ret = fuse_loc_fill (&state->loc, state, finh->nodeid, 0, NULL); + set_lock_owner (state, this, fsi->lock_owner, (uint64_t) finh->pid); + if ((state->loc.inode == NULL) || (ret < 0)) { @@ -1888,12 +1906,15 @@ fuse_readv (xlator_t *this, fuse_in_header_t *finh, void *msg) fd_t *fd = NULL; GET_STATE (this, finh, state); + state->size = fri->size; state->off = fri->offset; fd = FH_TO_FD (fri->fh); state->fd = fd; + set_lock_owner (state, this, fri->lock_owner, (uint64_t) finh->pid); + gf_log ("glusterfs-fuse", GF_LOG_TRACE, "%"PRIu64": READ (%p, size=%"PRIu32", offset=%"PRIu64")", finh->unique, fd, fri->size, fri->offset); @@ -1965,6 +1986,8 @@ fuse_write (xlator_t *this, fuse_in_header_t *finh, void *msg) vector.iov_base = msg; vector.iov_len = fwi->size; + set_lock_owner (state, this, fwi->lock_owner, (uint64_t) finh->pid); + gf_log ("glusterfs-fuse", GF_LOG_TRACE, "%"PRIu64": WRITE (%p, size=%"PRIu32", offset=%"PRId64")", finh->unique, fd, fwi->size, fwi->offset); @@ -2003,6 +2026,8 @@ fuse_flush (xlator_t *this, fuse_in_header_t *finh, void *msg) if (fd) fd->flush_unique = finh->unique; + set_lock_owner (state, this, ffi->lock_owner, (uint64_t) finh->pid); + gf_log ("glusterfs-fuse", GF_LOG_TRACE, "%"PRIu64": FLUSH %p", finh->unique, fd); @@ -2026,6 +2051,9 @@ fuse_release (xlator_t *this, fuse_in_header_t *finh, void *msg) GET_STATE (this, finh, state); fd = FH_TO_FD (fri->fh); state->fd = fd; + + set_lock_owner (state, this, fri->lock_owner, (uint64_t) finh->pid); + #ifdef GF_LINUX_HOST_OS /* This is an ugly Linux specific hack, relying on subtle * implementation details. @@ -2800,6 +2828,8 @@ fuse_getlk (xlator_t *this, fuse_in_header_t *finh, void *msg) state->fd = fd; convert_fuse_file_lock (&fli->lk, &lock); + set_lock_owner (state, this, fli->owner, (uint64_t) finh->pid); + gf_log ("glusterfs-fuse", GF_LOG_TRACE, "%"PRIu64": GETLK %p", finh->unique, fd); @@ -2862,6 +2892,8 @@ fuse_setlk (xlator_t *this, fuse_in_header_t *finh, void *msg) state->fd = fd; convert_fuse_file_lock (&fli->lk, &lock); + set_lock_owner (state, this, fli->owner, (uint64_t) finh->pid); + gf_log ("glusterfs-fuse", GF_LOG_TRACE, "%"PRIu64": SETLK%s %p", finh->unique, finh->opcode == FUSE_SETLK ? "" : "W", fd); |