summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/ec/src/ec-locks.c
diff options
context:
space:
mode:
authorXavier Hernandez <xhernandez@datalab.es>2014-09-10 23:43:07 +0200
committerVijay Bellur <vbellur@redhat.com>2014-09-19 03:05:25 -0700
commit0ee0cfae80f7b17115b78d76610b995edb1bfa8b (patch)
treeec73cb45642474eec30ab0b8aa98fe12bec5364b /xlators/cluster/ec/src/ec-locks.c
parentf32378b660dab5f3f311da8252969a7da16898f4 (diff)
ec: Fix invalid inode lock in ftruncate
The fops 'truncate' and 'ftruncate' share some code and inodelk() was always made against the inode inside the loc_t structure instead of that of fd_t. Since ftruncate has the loc initialized to NULL, this fop was executed without any lock, allowing some concurrent modifications in the file size. Also changed the way in which 'fop' and 'ffop' are differentiated in shared code. Now it uses 'id' field instead of checking if 'fd' is NULL. Change-Id: Ibd18accf2652193b395a841b9029729e5f4867c6 BUG: 1140396 Signed-off-by: Xavier Hernandez <xhernandez@datalab.es> Reviewed-on: http://review.gluster.org/8695 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/cluster/ec/src/ec-locks.c')
-rw-r--r--xlators/cluster/ec/src/ec-locks.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c
index 2bcec34b6c3..71fd48c05cd 100644
--- a/xlators/cluster/ec/src/ec-locks.c
+++ b/xlators/cluster/ec/src/ec-locks.c
@@ -234,7 +234,7 @@ int32_t ec_manager_entrylk(ec_fop_data_t * fop, int32_t state)
{
if (mask != 0)
{
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_ENTRYLK)
{
ec_entrylk(fop->req_frame, fop->xl, mask, 1,
ec_lock_unlocked, NULL, fop->str[0],
@@ -272,7 +272,7 @@ int32_t ec_manager_entrylk(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_ENTRYLK)
{
if (fop->cbks.entrylk != NULL)
{
@@ -298,7 +298,7 @@ int32_t ec_manager_entrylk(ec_fop_data_t * fop, int32_t state)
case -EC_STATE_REPORT:
GF_ASSERT(fop->error != 0);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_ENTRYLK)
{
if (fop->cbks.entrylk != NULL)
{
@@ -677,7 +677,7 @@ int32_t ec_manager_inodelk(ec_fop_data_t * fop, int32_t state)
flock.l_pid = 0;
flock.l_owner.len = 0;
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_INODELK)
{
ec_inodelk(fop->req_frame, fop->xl, mask, 1,
ec_lock_unlocked, NULL, fop->str[0],
@@ -713,7 +713,7 @@ int32_t ec_manager_inodelk(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_INODELK)
{
if (fop->cbks.inodelk != NULL)
{
@@ -739,7 +739,7 @@ int32_t ec_manager_inodelk(ec_fop_data_t * fop, int32_t state)
case -EC_STATE_REPORT:
GF_ASSERT(fop->error != 0);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_INODELK)
{
if (fop->cbks.inodelk != NULL)
{