summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix-helpers.c
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2017-01-23 17:40:40 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2017-02-27 03:26:42 -0500
commitb5c26a462caf97bfc5380c81092f5c331ccaf1ae (patch)
tree8828f7bd3d08b6d5294ce915a5592c15bf630c88 /xlators/storage/posix/src/posix-helpers.c
parent8aee74f25cfa9dc676e116e9882723254b0509a9 (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.c85
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;
}