diff options
author | ShyamsundarR <srangana@redhat.com> | 2018-03-10 23:08:04 -0500 |
---|---|---|
committer | ShyamsundarR <srangana@redhat.com> | 2018-03-10 23:12:48 -0500 |
commit | ece3f0f669dd5497f49c6169634b59b307d6e18b (patch) | |
tree | 89554ba05bbb38fe6c4ef15d918f4774de759084 /xlators/protocol | |
parent | b966c7790e35de353ae09ee48d4e2f55e0117f7e (diff) |
protocol: Fix 4.0 client, parsing older iatt in dict
In a mixed mode cluster involving 4.0 and older 3.x bricks, if
clients are newer, then the iatt encoded in the dictionary can be
of the older iatt format, which a newer client will map incorrectly
to the newer structure.
This causes failures in FOPs that depend on this iatt for some
functionality (seen in mkdir operations failing as EIO, when DHT
hits its internal setxattr call).
The fix provided is to convert the iatt in the dict, based on which
RPC version is used to communicate with the server.
IOW, this is the reverse of change in commit "b966c7790e"
Tested using a mixed mode cluster (i.e bricks in 3.12 and 4.0 versions)
and a mixed set of clients, 3.12 and 4.0 clients.
There is no regression test provided, as this needs a mixed mode cluster
to test and validate.
Change-Id: I454e54651ca836b9f7c28f45f51d5956106aefa9
BUG: 1554053
Signed-off-by: ShyamsundarR <srangana@redhat.com>
Diffstat (limited to 'xlators/protocol')
-rw-r--r-- | xlators/protocol/client/src/client-common.c | 10 | ||||
-rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 42 | ||||
-rw-r--r-- | xlators/protocol/server/src/server-helpers.h | 2 | ||||
-rw-r--r-- | xlators/protocol/server/src/server-rpc-fops.c | 10 |
4 files changed, 20 insertions, 44 deletions
diff --git a/xlators/protocol/client/src/client-common.c b/xlators/protocol/client/src/client-common.c index 2a08ce2e0ab..c5b0322334b 100644 --- a/xlators/protocol/client/src/client-common.c +++ b/xlators/protocol/client/src/client-common.c @@ -1461,6 +1461,8 @@ client_post_unlink (xlator_t *this, gfs3_unlink_rsp *rsp, GF_PROTOCOL_DICT_UNSERIALIZE (this, *xdata, (rsp->xdata.xdata_val), (rsp->xdata.xdata_len), ret, rsp->op_errno, out); + + ret = gf_replace_new_iatt_in_dict (*xdata); out: return ret; } @@ -1679,6 +1681,8 @@ client_post_setxattr (xlator_t *this, gf_common_rsp *rsp, dict_t **xdata) GF_PROTOCOL_DICT_UNSERIALIZE (this, *xdata, (rsp->xdata.xdata_val), (rsp->xdata.xdata_len), ret, rsp->op_errno, out); + + ret = gf_replace_new_iatt_in_dict (*xdata); out: return ret; } @@ -1713,6 +1717,8 @@ client_post_removexattr (xlator_t *this, gf_common_rsp *rsp, GF_PROTOCOL_DICT_UNSERIALIZE (this, *xdata, (rsp->xdata.xdata_val), (rsp->xdata.xdata_len), ret, rsp->op_errno, out); + + ret = gf_replace_new_iatt_in_dict (*xdata); out: return ret; } @@ -1983,6 +1989,8 @@ client_post_fsetxattr (xlator_t *this, gf_common_rsp *rsp, dict_t **xdata) GF_PROTOCOL_DICT_UNSERIALIZE (this, *xdata, (rsp->xdata.xdata_val), (rsp->xdata.xdata_len), ret, rsp->op_errno, out); + + ret = gf_replace_new_iatt_in_dict (*xdata); out: return ret; } @@ -2062,6 +2070,8 @@ client_post_fremovexattr (xlator_t *this, gf_common_rsp *rsp, GF_PROTOCOL_DICT_UNSERIALIZE (this, *xdata, (rsp->xdata.xdata_val), (rsp->xdata.xdata_len), ret, rsp->op_errno, out); + + ret = gf_replace_new_iatt_in_dict (*xdata); out: return ret; } diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 8d6a81fe1e2..84f99ad8945 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -1221,38 +1221,6 @@ getactivelkinfo_rsp_cleanup_v2 (gfx_getactivelk_rsp *rsp) } int -replace_old_iatt_in_dict (dict_t *xdata) -{ - int ret; - struct old_iatt *o_iatt; /* old iatt structure */ - struct iatt *c_iatt; /* current iatt */ - int32_t len = sizeof(struct old_iatt); - - if (!xdata) { - return 0; - } - - ret = dict_get_bin (xdata, DHT_IATT_IN_XDATA_KEY, (void **)&c_iatt); - if (ret < 0) { - return 0; - } - - o_iatt = GF_CALLOC (1, len, gf_common_mt_char); - if (!o_iatt) { - return -1; - } - - oldiatt_from_iatt (o_iatt, c_iatt); - - ret = dict_set_bin (xdata, DHT_IATT_IN_XDATA_KEY, o_iatt, len); - if (ret) { - GF_FREE (o_iatt); - } - - return ret; -} - -int gf_server_check_getxattr_cmd (call_frame_t *frame, const char *key) { @@ -2494,7 +2462,7 @@ server_populate_compound_response (xlator_t *this, gfs3_compound_rsp *rsp, rsp_args = &this_rsp->compound_rsp_u.compound_unlink_rsp; - if (replace_old_iatt_in_dict (this_args_cbk->xdata)) { + if (gf_replace_old_iatt_in_dict (this_args_cbk->xdata)) { rsp_args->op_errno = errno; rsp_args->op_ret = -1; goto out; @@ -2762,7 +2730,7 @@ server_populate_compound_response (xlator_t *this, gfs3_compound_rsp *rsp, rsp_args = &this_rsp->compound_rsp_u.compound_setxattr_rsp; - if (replace_old_iatt_in_dict (this_args_cbk->xdata)) { + if (gf_replace_old_iatt_in_dict (this_args_cbk->xdata)) { rsp_args->op_errno = errno; rsp_args->op_ret = -1; goto out; @@ -2806,7 +2774,7 @@ server_populate_compound_response (xlator_t *this, gfs3_compound_rsp *rsp, rsp_args = &this_rsp->compound_rsp_u.compound_removexattr_rsp; - if (replace_old_iatt_in_dict (this_args_cbk->xdata)) { + if (gf_replace_old_iatt_in_dict (this_args_cbk->xdata)) { rsp_args->op_errno = errno; rsp_args->op_ret = -1; goto out; @@ -3143,7 +3111,7 @@ server_populate_compound_response (xlator_t *this, gfs3_compound_rsp *rsp, rsp_args = &this_rsp->compound_rsp_u.compound_setxattr_rsp; - if (replace_old_iatt_in_dict (this_args_cbk->xdata)) { + if (gf_replace_old_iatt_in_dict (this_args_cbk->xdata)) { rsp_args->op_errno = errno; rsp_args->op_ret = -1; goto out; @@ -3253,7 +3221,7 @@ server_populate_compound_response (xlator_t *this, gfs3_compound_rsp *rsp, rsp_args = &this_rsp->compound_rsp_u.compound_fremovexattr_rsp; - if (replace_old_iatt_in_dict (this_args_cbk->xdata)) { + if (gf_replace_old_iatt_in_dict (this_args_cbk->xdata)) { rsp_args->op_errno = errno; rsp_args->op_ret = -1; goto out; diff --git a/xlators/protocol/server/src/server-helpers.h b/xlators/protocol/server/src/server-helpers.h index 73e2b89b21f..b89105a355f 100644 --- a/xlators/protocol/server/src/server-helpers.h +++ b/xlators/protocol/server/src/server-helpers.h @@ -74,8 +74,6 @@ getactivelkinfo_rsp_cleanup (gfs3_getactivelk_rsp *rsp); int getactivelkinfo_rsp_cleanup_v2 (gfx_getactivelk_rsp *rsp); -int replace_old_iatt_in_dict (dict_t *); - int server_populate_compound_response (xlator_t *this, gfs3_compound_rsp *rsp, call_frame_t *frame, diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c index 690e1ebf890..7554984f80e 100644 --- a/xlators/protocol/server/src/server-rpc-fops.c +++ b/xlators/protocol/server/src/server-rpc-fops.c @@ -724,7 +724,7 @@ server_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, server_state_t *state = NULL; gf_loglevel_t loglevel = GF_LOG_NONE; - if (replace_old_iatt_in_dict (xdata)) { + if (gf_replace_old_iatt_in_dict (xdata)) { op_errno = errno; op_ret = -1; goto out; @@ -772,7 +772,7 @@ server_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, rpcsvc_request_t *req = NULL; server_state_t *state = NULL; - if (replace_old_iatt_in_dict (xdata)) { + if (gf_replace_old_iatt_in_dict (xdata)) { op_errno = errno; op_ret = -1; goto out; @@ -921,7 +921,7 @@ server_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, rpcsvc_request_t *req = NULL; server_state_t *state = NULL; - if (replace_old_iatt_in_dict (xdata)) { + if (gf_replace_old_iatt_in_dict (xdata)) { op_errno = errno; op_ret = -1; goto out; @@ -992,7 +992,7 @@ server_fsetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, rpcsvc_request_t *req = NULL; server_state_t *state = NULL; - if (replace_old_iatt_in_dict (xdata)) { + if (gf_replace_old_iatt_in_dict (xdata)) { op_errno = errno; op_ret = -1; goto out; @@ -1090,7 +1090,7 @@ server_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, server_state_t *state = NULL; rpcsvc_request_t *req = NULL; - if (replace_old_iatt_in_dict (xdata)) { + if (gf_replace_old_iatt_in_dict (xdata)) { op_errno = errno; op_ret = -1; goto out; |