diff options
| author | Xavier Hernandez <xhernandez@datalab.es> | 2017-04-05 09:52:39 +0200 | 
|---|---|---|
| committer | Niels de Vos <ndevos@redhat.com> | 2017-05-11 08:36:04 +0000 | 
| commit | 60a320c5167944027cc7f1d2da6b9ff27e45ec30 (patch) | |
| tree | 83a696ac1d23e6b7894c64b09ba691e4a1b50720 | |
| parent | 5dbe4fa649b8c486b2abdba660a53f7ae1198ef0 (diff) | |
cluster/ec: fix incorrect answer check in seek fop
A bad check in the answer of a seek request caused a segmentation
fault when seek reported an error.
> Change-Id: Ifb25ae8bf7cc4019d46171c431f7b09b376960e8
> BUG: 1439068
> Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
> Reviewed-on: https://review.gluster.org/16998
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Amar Tumballi <amarts@redhat.com>
> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Change-Id: Ifb25ae8bf7cc4019d46171c431f7b09b376960e8
BUG: 1442933
Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-on: https://review.gluster.org/17231
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-read.c | 23 | 
1 files changed, 8 insertions, 15 deletions
diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index c3d9c879eb7..fc121bcceb2 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -1577,23 +1577,16 @@ int32_t ec_manager_seek(ec_fop_data_t *fop, int32_t state)          return EC_STATE_PREPARE_ANSWER;      case EC_STATE_PREPARE_ANSWER: -        cbk = fop->answer; -        if (cbk != NULL) { -            if (ec_dispatch_one_retry(fop, &cbk)) { -                return EC_STATE_DISPATCH; -            } -            if (cbk->op_ret >= 0) { -                ec_t *ec = fop->xl->private; +        if (ec_dispatch_one_retry(fop, &cbk)) { +            return EC_STATE_DISPATCH; +        } +        if ((cbk != NULL) && (cbk->op_ret >= 0)) { +            ec_t *ec = fop->xl->private; -                cbk->offset *= ec->fragments; -                if (cbk->offset < fop->user_size) { -                    cbk->offset = fop->user_size; -                } -            } else { -                ec_fop_set_error(fop, cbk->op_errno); +            cbk->offset *= ec->fragments; +            if (cbk->offset < fop->user_size) { +                cbk->offset = fop->user_size;              } -        } else { -            ec_fop_set_error(fop, EIO);          }          return EC_STATE_REPORT;  | 
