diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2017-01-23 17:40:40 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2017-02-27 03:26:42 -0500 |
commit | b5c26a462caf97bfc5380c81092f5c331ccaf1ae (patch) | |
tree | 8828f7bd3d08b6d5294ce915a5592c15bf630c88 /xlators/storage/posix/src/posix-helpers.c | |
parent | 8aee74f25cfa9dc676e116e9882723254b0509a9 (diff) |
storage/posix: Execute syscalls in xattrop under different locks
... and not inode->lock. This is to prevent the epoll thread from
*potentially* being blocked on this lock in the worst case for
extended period elsewhere in the brick stack, while the syscalls
in xattrop are being performed under the same lock by a different
thread. This could potentially lead to ping-timeout, if the only
available epoll thread is busy waiting on the inode->lock, thereby
preventing it from picking up the ping request from the client(s).
Also removed some unused functions.
Change-Id: I2054a06701ecab11aed1c04e80ee57bbe2e52564
BUG: 1421938
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: https://review.gluster.org/16462
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/storage/posix/src/posix-helpers.c')
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 85 |
1 files changed, 67 insertions, 18 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 3fa6dace327..af3d01b469c 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -2177,39 +2177,88 @@ posix_fdget_objectsignature (int fd, dict_t *xattr) return -EINVAL; } +posix_inode_ctx_t * +__posix_inode_ctx_get (inode_t *inode, xlator_t *this) +{ + int ret = -1; + uint64_t ctx_uint = 0; + posix_inode_ctx_t *ctx_p = NULL; + + ret = __inode_ctx_get (inode, this, &ctx_uint); + if (ret == 0) { + return (posix_inode_ctx_t *)ctx_uint; + } + + ctx_p = GF_CALLOC (1, sizeof (*ctx_p), gf_posix_mt_inode_ctx_t); + if (!ctx_p) + return NULL; + + pthread_mutex_init (&ctx_p->xattrop_lock, NULL); + + ret = __inode_ctx_set (inode, this, (uint64_t *)&ctx_p); + if (ret < 0) { + pthread_mutex_destroy (&ctx_p->xattrop_lock); + GF_FREE (ctx_p); + return NULL; + } + + return ctx_p; +} int -posix_inode_ctx_get (inode_t *inode, xlator_t *this, uint64_t *ctx) +__posix_inode_ctx_set_unlink_flag (inode_t *inode, xlator_t *this, uint64_t ctx) { - int ret = -1; - uint64_t ctx_int = 0; + posix_inode_ctx_t *ctx_p = NULL; - GF_VALIDATE_OR_GOTO (this->name, this, out); - GF_VALIDATE_OR_GOTO (this->name, inode, out); + ctx_p = __posix_inode_ctx_get (inode, this); + if (ctx_p == NULL) + return -1; - ret = inode_ctx_get (inode, this, &ctx_int); + ctx_p->unlink_flag = ctx; - if (ret) - return ret; + return 0; +} - if (ctx) - *ctx = ctx_int; +int +posix_inode_ctx_set_unlink_flag (inode_t *inode, xlator_t *this, uint64_t ctx) +{ + int ret = -1; + + LOCK(&inode->lock); + { + ret = __posix_inode_ctx_set_unlink_flag (inode, this, ctx); + } + UNLOCK(&inode->lock); -out: return ret; } +int +__posix_inode_ctx_get_all (inode_t *inode, xlator_t *this, + posix_inode_ctx_t **ctx) +{ + posix_inode_ctx_t *ctx_p = NULL; + + ctx_p = __posix_inode_ctx_get (inode, this); + if (ctx_p == NULL) + return -1; + + *ctx = ctx_p; + + return 0; +} int -posix_inode_ctx_set (inode_t *inode, xlator_t *this, uint64_t ctx) +posix_inode_ctx_get_all (inode_t *inode, xlator_t *this, + posix_inode_ctx_t **ctx) { - int ret = -1; + int ret = 0; - GF_VALIDATE_OR_GOTO (this->name, this, out); - GF_VALIDATE_OR_GOTO (this->name, inode, out); - GF_VALIDATE_OR_GOTO (this->name, ctx, out); + LOCK(&inode->lock); + { + ret = __posix_inode_ctx_get_all (inode, this, ctx); + } + UNLOCK(&inode->lock); - ret = inode_ctx_set (inode, this, &ctx); -out: return ret; } |