Skip to content

Commit

Permalink
crypto: caam - Handle errors in dma_map_sg_chained
Browse files Browse the repository at this point in the history
Currently dma_map_sg_chained does not handle errors from the
underlying dma_map_sg calls.  This patch adds rollback in case
of an error by simply calling dma_unmap_sg_chained for the ones
that we've already mapped.

All current callers ignore the return value so this should have
no impact on them.

Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Jun 17, 2015
1 parent 201f28f commit 6c94711
Showing 1 changed file with 21 additions and 14 deletions.
35 changes: 21 additions & 14 deletions drivers/crypto/caam/sg_sw_sec4.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,34 +100,41 @@ static inline int sg_count(struct scatterlist *sg_list, int nbytes,
return sg_nents;
}

static int dma_map_sg_chained(struct device *dev, struct scatterlist *sg,
unsigned int nents, enum dma_data_direction dir,
bool chained)
static inline void dma_unmap_sg_chained(
struct device *dev, struct scatterlist *sg, unsigned int nents,
enum dma_data_direction dir, bool chained)
{
if (unlikely(chained)) {
int i;
for (i = 0; i < nents; i++) {
dma_map_sg(dev, sg, 1, dir);
dma_unmap_sg(dev, sg, 1, dir);
sg = sg_next(sg);
}
} else {
dma_map_sg(dev, sg, nents, dir);
} else if (nents) {
dma_unmap_sg(dev, sg, nents, dir);
}
return nents;
}

static int dma_unmap_sg_chained(struct device *dev, struct scatterlist *sg,
unsigned int nents, enum dma_data_direction dir,
bool chained)
static inline int dma_map_sg_chained(
struct device *dev, struct scatterlist *sg, unsigned int nents,
enum dma_data_direction dir, bool chained)
{
struct scatterlist *first = sg;

if (unlikely(chained)) {
int i;
for (i = 0; i < nents; i++) {
dma_unmap_sg(dev, sg, 1, dir);
if (!dma_map_sg(dev, sg, 1, dir)) {
dma_unmap_sg_chained(dev, first, i, dir,
chained);
nents = 0;
break;
}

sg = sg_next(sg);
}
} else {
dma_unmap_sg(dev, sg, nents, dir);
}
} else
nents = dma_map_sg(dev, sg, nents, dir);

return nents;
}

0 comments on commit 6c94711

Please sign in to comment.