summaryrefslogtreecommitdiffstats
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 12:31:46 -0700
commitb8c820be5f1d3ad7f60a2a0c7256081491d79d51 (patch)
tree4da885d039c85e19515e139f13c7c4a59e3271df
parent61bf585398c514d437a022792f6726a4292509dd (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. This is a backport of http://review.gluster.org/8695/ Change-Id: Ibd18accf2652193b395a841b9029729e5f4867c6 BUG: 1140847 Signed-off-by: Xavier Hernandez <xhernandez@datalab.es> Reviewed-on: http://review.gluster.org/8780 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Dan Lambright <dlambrig@redhat.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rw-r--r--xlators/cluster/ec/src/ec-generic.c4
-rw-r--r--xlators/cluster/ec/src/ec-heal.c4
-rw-r--r--xlators/cluster/ec/src/ec-inode-read.c4
-rw-r--r--xlators/cluster/ec/src/ec-inode-write.c18
-rw-r--r--xlators/cluster/ec/src/ec-locks.c12
5 files changed, 21 insertions, 21 deletions
diff --git a/xlators/cluster/ec/src/ec-generic.c b/xlators/cluster/ec/src/ec-generic.c
index 4aa02903969..f16617b1b66 100644
--- a/xlators/cluster/ec/src/ec-generic.c
+++ b/xlators/cluster/ec/src/ec-generic.c
@@ -1420,7 +1420,7 @@ int32_t ec_manager_xattrop(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_XATTROP)
{
if (fop->cbks.xattrop != NULL)
{
@@ -1447,7 +1447,7 @@ int32_t ec_manager_xattrop(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_XATTROP)
{
if (fop->cbks.xattrop != NULL)
{
diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c
index 107ff5ffe3d..54301d10df4 100644
--- a/xlators/cluster/ec/src/ec-heal.c
+++ b/xlators/cluster/ec/src/ec-heal.c
@@ -1336,7 +1336,7 @@ int32_t ec_manager_heal(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == EC_FOP_HEAL)
{
if (fop->cbks.heal != NULL)
{
@@ -1364,7 +1364,7 @@ int32_t ec_manager_heal(ec_fop_data_t * fop, int32_t state)
case -EC_STATE_REPORT:
GF_ASSERT(fop->error != 0);
- if (fop->fd == NULL)
+ if (fop->id == EC_FOP_HEAL)
{
if (fop->cbks.heal != NULL)
{
diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c
index 0cb5559f62b..bc3d94c7e61 100644
--- a/xlators/cluster/ec/src/ec-inode-read.c
+++ b/xlators/cluster/ec/src/ec-inode-read.c
@@ -1534,7 +1534,7 @@ int32_t ec_manager_stat(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_STAT)
{
if (fop->cbks.stat != NULL)
{
@@ -1560,7 +1560,7 @@ int32_t ec_manager_stat(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_STAT)
{
if (fop->cbks.stat != NULL)
{
diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c
index edc7409854d..7e557f12aa3 100644
--- a/xlators/cluster/ec/src/ec-inode-write.c
+++ b/xlators/cluster/ec/src/ec-inode-write.c
@@ -138,7 +138,7 @@ int32_t ec_manager_removexattr(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_REMOVEXATTR)
{
if (fop->cbks.removexattr != NULL)
{
@@ -165,7 +165,7 @@ int32_t ec_manager_removexattr(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_REMOVEXATTR)
{
if (fop->cbks.removexattr != NULL)
{
@@ -547,7 +547,7 @@ int32_t ec_manager_setattr(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_SETATTR)
{
if (fop->cbks.setattr != NULL)
{
@@ -577,7 +577,7 @@ int32_t ec_manager_setattr(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_SETATTR)
{
if (fop->cbks.setattr != NULL)
{
@@ -924,7 +924,7 @@ int32_t ec_manager_setxattr(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_SETXATTR)
{
if (fop->cbks.setxattr != NULL)
{
@@ -950,7 +950,7 @@ int32_t ec_manager_setxattr(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_SETXATTR)
{
if (fop->cbks.setxattr != NULL)
{
@@ -1378,7 +1378,7 @@ int32_t ec_manager_truncate(ec_fop_data_t * fop, int32_t state)
/* Fall through */
case EC_STATE_LOCK:
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_TRUNCATE)
{
ec_lock_prepare_inode(fop, &fop->loc[0]);
}
@@ -1446,7 +1446,7 @@ int32_t ec_manager_truncate(ec_fop_data_t * fop, int32_t state)
GF_ASSERT(cbk != NULL);
- if (fop->fd == NULL)
+ if (fop->id == GF_FOP_TRUNCATE)
{
if (fop->cbks.truncate != NULL)
{
@@ -1476,7 +1476,7 @@ int32_t ec_manager_truncate(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_TRUNCATE)
{
if (fop->cbks.truncate != NULL)
{
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)
{