diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2015-12-01 10:59:41 +0530 |
---|---|---|
committer | Xavier Hernandez <xhernandez@datalab.es> | 2015-12-01 09:21:17 -0800 |
commit | b8b050c37004c942b8c565cc66a05e8fa999c1ba (patch) | |
tree | 43b0a8d9569b0cddc50b4ca769958390bbfd2edb /xlators/cluster/ec/src/ec-inode-write.c | |
parent | 3c18b186921c51b1a976eea8cd1c19f7113ef74c (diff) |
cluster/ec: Create copy of dict for setting internal xattrs
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: 1286910
Change-Id: If146435dfb89656158dbed3862a3e9a0cda60581
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/12831
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/cluster/ec/src/ec-inode-write.c')
-rw-r--r-- | xlators/cluster/ec/src/ec-inode-write.c | 22 |
1 files changed, 11 insertions, 11 deletions
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, |