async_xor() has some issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Looks like there is bug in the do_async_xor() function where" dma_addr_t
*dma_src = (dma_addr_t *) src_list;" causing corrupting source
addresses.  And dma_src is being modified in the for loop. This should
be something like dma_addr_t dma_src[src_cnt].
 
/* do_async_xor - dma map the pages and perform the xor with an engine
*/
static __async_inline struct dma_async_tx_descriptor *
do_async_xor(struct dma_chan *chan, struct page *dest, struct page
**src_list,
             unsigned int offset, int src_cnt, size_t len,
             enum async_tx_flags flags,
             struct dma_async_tx_descriptor *depend_tx,
             dma_async_tx_callback cb_fn, void *cb_param)
{
        struct dma_device *dma = chan->device;
        >>>>dma_addr_t *dma_src = (dma_addr_t *) src_list;
        struct dma_async_tx_descriptor *tx = NULL;
        int src_off = 0;
        int i;
        dma_async_tx_callback _cb_fn;
        void *_cb_param;
        enum async_tx_flags async_flags;
        enum dma_ctrl_flags dma_flags;
        int xor_src_cnt;
        dma_addr_t dma_dest;
        /* map the dest bidrectional in case it is re-used as a source
*/
        dma_dest = dma_map_page(dma->dev, dest, offset, len,
DMA_BIDIRECTIONAL);
        printk("dest=0x%x\n",dest);
        for (i = 0; i < src_cnt; i++) {
                /* only map the dest once */
                if (unlikely(src_list[i] == dest)) {
                        dma_src[i] = dma_dest;
                        continue;
                }
                printk("src_list[%d]=0x%x\n",i,src_list[i]);
                dma_src[i] = dma_map_page(dma->dev, src_list[i], offset,
                                          len, DMA_TO_DEVICE);
        }
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux