crypto: caam - Handle errors in dma_map_sg_chained
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 <herbert@gondor.apana.org.au>
This commit is contained in:
Родитель
201f28f055
Коммит
6c94711cbd
|
@ -100,25 +100,9 @@ static inline int sg_count(struct scatterlist *sg_list, int nbytes,
|
||||||
return sg_nents;
|
return sg_nents;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dma_map_sg_chained(struct device *dev, struct scatterlist *sg,
|
static inline void dma_unmap_sg_chained(
|
||||||
unsigned int nents, enum dma_data_direction dir,
|
struct device *dev, struct scatterlist *sg, unsigned int nents,
|
||||||
bool chained)
|
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);
|
|
||||||
sg = sg_next(sg);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
dma_map_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)
|
|
||||||
{
|
{
|
||||||
if (unlikely(chained)) {
|
if (unlikely(chained)) {
|
||||||
int i;
|
int i;
|
||||||
|
@ -126,8 +110,31 @@ static int dma_unmap_sg_chained(struct device *dev, struct scatterlist *sg,
|
||||||
dma_unmap_sg(dev, sg, 1, dir);
|
dma_unmap_sg(dev, sg, 1, dir);
|
||||||
sg = sg_next(sg);
|
sg = sg_next(sg);
|
||||||
}
|
}
|
||||||
} else {
|
} else if (nents) {
|
||||||
dma_unmap_sg(dev, sg, nents, dir);
|
dma_unmap_sg(dev, sg, nents, dir);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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++) {
|
||||||
|
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
|
||||||
|
nents = dma_map_sg(dev, sg, nents, dir);
|
||||||
|
|
||||||
return nents;
|
return nents;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче