ata: fix sleep-while-holding-spinlock in sata_nv
PATCH 1/1 ata: fix sleep-while-holding-spinlock in sata_nv
From: Arjan van de Ven <[email protected]>
Subject: [PATCH] ata: fix sleep-while-holding-spinlock in sata_nv
blk_queue_bounce_limit() is a sleeping function, so reorganize the code a little to not call it while holding a spinlock.
Signed-off-by Arjan van de Ven <[email protected]>
--- drivers/ata/sata_nv.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-)
drivers/ata/sata_nv.c +5 -3
@@ -671,6 +671,11 @@ static int nv_adma_slave_config(struct scsi_device *sdev) port1 = ap->host->ports[1 ]->private_data; sdev0 = ap->host->ports[0 ]->link.device[0 ].sdev; sdev1 = ap->host->ports[1 ]->link.device[0 ].sdev; + +blk_queue_segment_boundary (sdev->request_queue, segment_boundary); +blk_queue_max_hw_segments (sdev->request_queue, sg_tablesize); +spin_unlock_irqrestore (ap->lock, flags); +if ((port0->flags &NV_ADMA_ATAPI_SETUP_COMPLETE ) || (port1->flags &NV_ADMA_ATAPI_SETUP_COMPLETE )) {/** We have to set the DMA mask to 32-bit if either port is in
@@ -701,14 +706,11 @@ static int nv_adma_slave_config(struct scsi_device *sdev) pp->adma_dma_mask); } -blk_queue_segment_boundary (sdev->request_queue, segment_boundary); -blk_queue_max_hw_segments (sdev->request_queue, sg_tablesize);ata_port_printk (ap,KERN_INFO ,"DMA mask 0x%llX, segment boundary 0x%lX, hw segs %hu\n" , (unsigned long long )*ap->host->dev->dma_mask, segment_boundary, sg_tablesize); -spin_unlock_irqrestore (ap->lock, flags);return rc; }
Signature · 1 line
1.5.4.5