summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2015-12-01 10:59:41 +0530
committerXavier Hernandez <xhernandez@datalab.es>2015-12-01 09:21:47 -0800
commit1a88359040ef1c68bcbe86a01d13a996a8adbb27 (patch)
tree6759300e21e28254b3a6a819c6b5e58fabaf81b6 /xlators
parent21e1782d2b8adc5f668c10a52613e45b627e9bb2 (diff)
cluster/ec: Create copy of dict for setting internal xattrs
Backport of http://review.gluster.com/12831 Problem: Ec takes a ref of the request xdata and sets trusted.ec.version/algo etc xattrs as part of it. But this request xdata could be using same dictionary to do the operation on multiple subvolumes, due to which other subvolumes will have internal xattrs of ec in it and will be created on subvols where they are not supposed to appear. Fix: Take a copy of the request xdata/dict to prevent this from happening. Most of the debugging work and test script is contributed by Nitya. BUG: 1286985 Change-Id: Ie9b7d9f063434789f6c5902c3a68ececdc3c7efa Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/12835 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
Diffstat (limited to 'xlators')
-rw-r--r--xlators/cluster/ec/src/ec-dir-write.c16
-rw-r--r--xlators/cluster/ec/src/ec-inode-write.c22
2 files changed, 19 insertions, 19 deletions
diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c
index 3ae17e565ed..68741137619 100644
--- a/xlators/cluster/ec/src/ec-dir-write.c
+++ b/xlators/cluster/ec/src/ec-dir-write.c
@@ -307,7 +307,7 @@ void ec_create(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -472,7 +472,7 @@ void ec_link(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -648,7 +648,7 @@ void ec_mkdir(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -853,7 +853,7 @@ void ec_mknod(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1018,7 +1018,7 @@ void ec_rename(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1163,7 +1163,7 @@ void ec_rmdir(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1329,7 +1329,7 @@ void ec_symlink(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
@@ -1475,7 +1475,7 @@ void ec_unlink(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL, "Failed to reference a "
diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c
index 4bd692dff57..6aeda5a2481 100644
--- a/xlators/cluster/ec/src/ec-inode-write.c
+++ b/xlators/cluster/ec/src/ec-inode-write.c
@@ -231,7 +231,7 @@ ec_removexattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref (xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -317,7 +317,7 @@ ec_fremovexattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -512,7 +512,7 @@ void ec_setattr(call_frame_t * frame, xlator_t * this, uintptr_t target,
fop->iatt = *stbuf;
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -593,7 +593,7 @@ void ec_fsetattr(call_frame_t * frame, xlator_t * this, uintptr_t target,
fop->iatt = *stbuf;
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -666,7 +666,7 @@ ec_setxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (dict != NULL) {
- fop->dict = dict_ref(dict);
+ fop->dict = dict_copy_with_ref(dict, NULL);
if (fop->dict == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -677,7 +677,7 @@ ec_setxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -795,7 +795,7 @@ ec_fsetxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (dict != NULL) {
- fop->dict = dict_ref(dict);
+ fop->dict = dict_copy_with_ref(dict, NULL);
if (fop->dict == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -806,7 +806,7 @@ ec_fsetxattr (call_frame_t *frame, xlator_t *this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -1092,7 +1092,7 @@ void ec_truncate(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -1170,7 +1170,7 @@ void ec_ftruncate(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,
@@ -1656,7 +1656,7 @@ void ec_writev(call_frame_t * frame, xlator_t * this, uintptr_t target,
}
}
if (xdata != NULL) {
- fop->xdata = dict_ref(xdata);
+ fop->xdata = dict_copy_with_ref(xdata, NULL);
if (fop->xdata == NULL) {
gf_msg (this->name, GF_LOG_ERROR, 0,
EC_MSG_DICT_REF_FAIL,