cluster/ec: coverity, fix for BAD_SHIFT

This is how I would like to see this fixed.

passes (eliminates the warning in) coverity.

The use of uintptr_t as a bitmask is a problem IMO, especially on
32-bit clients.

Change-Id: I86e15d12939c610c99f5f96c551bb870df20f4b4
Signed-off-by: Kaleb S. KEITHLEY <kkeithle@redhat.com>
Reviewed-on: https://review.gluster.org/18067
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
This commit is contained in:
Kaleb S. KEITHLEY 2017-08-18 11:24:44 -04:00 committed by Jeff Darcy
parent 2645e730b7
commit 553ac4cc6d
3 changed files with 16 additions and 13 deletions

View File

@ -42,10 +42,11 @@ ec_select_first_by_read_policy (ec_t *ec, ec_fop_data_t *fop)
int32_t ec_child_valid(ec_t * ec, ec_fop_data_t * fop, int32_t idx)
{
return (idx < ec->nodes) && (((fop->remaining >> idx) & 1) == 1);
return (idx >= 0 && idx < ec->nodes) &&
(((fop->remaining >> idx) & 1) == 1);
}
int32_t ec_child_next(ec_t * ec, ec_fop_data_t * fop, int32_t idx)
int32_t ec_child_next(ec_t * ec, ec_fop_data_t * fop, uint32_t idx)
{
while (!ec_child_valid(ec, fop, idx))
{
@ -512,15 +513,17 @@ int32_t ec_child_select(ec_fop_data_t * fop)
return 1;
}
int32_t ec_dispatch_next(ec_fop_data_t * fop, int32_t idx)
void ec_dispatch_next(ec_fop_data_t * fop, uint32_t idx)
{
int32_t i = -1;
ec_t * ec = fop->xl->private;
LOCK(&fop->lock);
idx = ec_child_next(ec, fop, idx);
if (idx >= 0)
{
i = ec_child_next(ec, fop, idx);
if (i >= 0 && i < 64) {
idx = i;
fop->remaining ^= 1ULL << idx;
ec_trace("EXECUTE", fop, "idx=%d", idx);
@ -531,12 +534,10 @@ int32_t ec_dispatch_next(ec_fop_data_t * fop, int32_t idx)
UNLOCK(&fop->lock);
if (idx >= 0)
if (i >= 0 && i < 64)
{
fop->wind(ec, fop, idx);
}
return idx;
}
void ec_dispatch_mask(ec_fop_data_t * fop, uintptr_t mask)
@ -646,7 +647,8 @@ void ec_dispatch_min(ec_fop_data_t * fop)
{
ec_t * ec = fop->xl->private;
uintptr_t mask;
int32_t idx, count;
int32_t idx;
int count;
ec_dispatch_start(fop);
@ -659,7 +661,8 @@ void ec_dispatch_min(ec_fop_data_t * fop)
while (count-- > 0)
{
idx = ec_child_next(ec, fop, idx + 1);
mask |= 1ULL << idx;
if (idx >= 0 && idx < 64)
mask |= 1ULL << idx;
}
ec_dispatch_mask(fop, mask);

View File

@ -75,7 +75,7 @@ typedef enum {
#define EC_STATE_HEAL_DISPATCH 218
gf_boolean_t ec_dispatch_one_retry (ec_fop_data_t *fop, ec_cbk_data_t **cbk);
int32_t ec_dispatch_next(ec_fop_data_t * fop, int32_t idx);
void ec_dispatch_next(ec_fop_data_t * fop, uint32_t idx);
void ec_complete(ec_fop_data_t *fop);

View File

@ -328,7 +328,7 @@ struct _ec_cbk_data {
struct list_head answer_list; /* item in the list of answers */
ec_fop_data_t *fop;
ec_cbk_data_t *next; /* next answer in the same group */
int32_t idx;
uint32_t idx;
int32_t op_ret;
int32_t op_errno;
int32_t count;