|
@@ -324,6 +324,7 @@ struct dma_async_tx_descriptor *
|
|
|
async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
|
|
|
struct page **blocks, struct async_submit_ctl *submit)
|
|
|
{
|
|
|
+ void *scribble = submit->scribble;
|
|
|
int non_zero_srcs, i;
|
|
|
|
|
|
BUG_ON(faila == failb);
|
|
@@ -332,11 +333,13 @@ async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
|
|
|
|
|
|
pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes);
|
|
|
|
|
|
- /* we need to preserve the contents of 'blocks' for the async
|
|
|
- * case, so punt to synchronous if a scribble buffer is not available
|
|
|
+ /* if a dma resource is not available or a scribble buffer is not
|
|
|
+ * available punt to the synchronous path. In the 'dma not
|
|
|
+ * available' case be sure to use the scribble buffer to
|
|
|
+ * preserve the content of 'blocks' as the caller intended.
|
|
|
*/
|
|
|
- if (!submit->scribble) {
|
|
|
- void **ptrs = (void **) blocks;
|
|
|
+ if (!async_dma_find_channel(DMA_PQ) || !scribble) {
|
|
|
+ void **ptrs = scribble ? scribble : (void **) blocks;
|
|
|
|
|
|
async_tx_quiesce(&submit->depend_tx);
|
|
|
for (i = 0; i < disks; i++)
|
|
@@ -406,11 +409,13 @@ async_raid6_datap_recov(int disks, size_t bytes, int faila,
|
|
|
|
|
|
pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes);
|
|
|
|
|
|
- /* we need to preserve the contents of 'blocks' for the async
|
|
|
- * case, so punt to synchronous if a scribble buffer is not available
|
|
|
+ /* if a dma resource is not available or a scribble buffer is not
|
|
|
+ * available punt to the synchronous path. In the 'dma not
|
|
|
+ * available' case be sure to use the scribble buffer to
|
|
|
+ * preserve the content of 'blocks' as the caller intended.
|
|
|
*/
|
|
|
- if (!scribble) {
|
|
|
- void **ptrs = (void **) blocks;
|
|
|
+ if (!async_dma_find_channel(DMA_PQ) || !scribble) {
|
|
|
+ void **ptrs = scribble ? scribble : (void **) blocks;
|
|
|
|
|
|
async_tx_quiesce(&submit->depend_tx);
|
|
|
for (i = 0; i < disks; i++)
|