Merge tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI updates from James Bottomley: "This patch consists of the usual driver updates (qla2xxx, qla4xxx, lpfc, be2iscsi, fnic, ufs, NCR5380) The NCR5380 is the addition to maintained status of a long neglected driver for older hardware. In addition there are a lot of minor fixes and cleanups and some more updates to make scsi mq ready" * tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (130 commits) include/scsi/osd_protocol.h: remove unnecessary __constant mvsas: Recognise device/subsystem 9485/9485 as 88SE9485 Revert "be2iscsi: Fix processing cqe for cxn whose endpoint is freed" mptfusion: fix msgContext in mptctl_hp_hostinfo acornscsi: remove linked command support scsi/NCR5380: dprintk macro fusion: Remove use of DEF_SCSI_QCMD fusion: Add free msg frames to the head, not tail of list mpt2sas: Add free smids to the head, not tail of list mpt2sas: Remove use of DEF_SCSI_QCMD mpt2sas: Remove uses of serial_number mpt3sas: Remove use of DEF_SCSI_QCMD mpt3sas: Remove uses of serial_number qla2xxx: Use kmemdup instead of kmalloc + memcpy qla4xxx: Use kmemdup instead of kmalloc + memcpy qla2xxx: fix incorrect debug printk be2iscsi: Bump the driver version be2iscsi: Fix processing cqe for cxn whose endpoint is freed be2iscsi: Fix destroy MCC-CQ before MCC-EQ is destroyed be2iscsi: Fix memory corruption in MBX path ...
This commit is contained in:
@@ -1966,26 +1966,29 @@ static void bnx2fc_free_hash_table(struct bnx2fc_hba *hba)
|
||||
{
|
||||
int i;
|
||||
int segment_count;
|
||||
int hash_table_size;
|
||||
u32 *pbl;
|
||||
|
||||
segment_count = hba->hash_tbl_segment_count;
|
||||
hash_table_size = BNX2FC_NUM_MAX_SESS * BNX2FC_MAX_ROWS_IN_HASH_TBL *
|
||||
sizeof(struct fcoe_hash_table_entry);
|
||||
if (hba->hash_tbl_segments) {
|
||||
|
||||
pbl = hba->hash_tbl_pbl;
|
||||
for (i = 0; i < segment_count; ++i) {
|
||||
dma_addr_t dma_address;
|
||||
pbl = hba->hash_tbl_pbl;
|
||||
if (pbl) {
|
||||
segment_count = hba->hash_tbl_segment_count;
|
||||
for (i = 0; i < segment_count; ++i) {
|
||||
dma_addr_t dma_address;
|
||||
|
||||
dma_address = le32_to_cpu(*pbl);
|
||||
++pbl;
|
||||
dma_address += ((u64)le32_to_cpu(*pbl)) << 32;
|
||||
++pbl;
|
||||
dma_free_coherent(&hba->pcidev->dev,
|
||||
BNX2FC_HASH_TBL_CHUNK_SIZE,
|
||||
hba->hash_tbl_segments[i],
|
||||
dma_address);
|
||||
dma_address = le32_to_cpu(*pbl);
|
||||
++pbl;
|
||||
dma_address += ((u64)le32_to_cpu(*pbl)) << 32;
|
||||
++pbl;
|
||||
dma_free_coherent(&hba->pcidev->dev,
|
||||
BNX2FC_HASH_TBL_CHUNK_SIZE,
|
||||
hba->hash_tbl_segments[i],
|
||||
dma_address);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(hba->hash_tbl_segments);
|
||||
hba->hash_tbl_segments = NULL;
|
||||
}
|
||||
|
||||
if (hba->hash_tbl_pbl) {
|
||||
@@ -2023,7 +2026,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
|
||||
dma_segment_array = kzalloc(dma_segment_array_size, GFP_KERNEL);
|
||||
if (!dma_segment_array) {
|
||||
printk(KERN_ERR PFX "hash table pointers (dma) alloc failed\n");
|
||||
return -ENOMEM;
|
||||
goto cleanup_ht;
|
||||
}
|
||||
|
||||
for (i = 0; i < segment_count; ++i) {
|
||||
@@ -2034,15 +2037,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
|
||||
GFP_KERNEL);
|
||||
if (!hba->hash_tbl_segments[i]) {
|
||||
printk(KERN_ERR PFX "hash segment alloc failed\n");
|
||||
while (--i >= 0) {
|
||||
dma_free_coherent(&hba->pcidev->dev,
|
||||
BNX2FC_HASH_TBL_CHUNK_SIZE,
|
||||
hba->hash_tbl_segments[i],
|
||||
dma_segment_array[i]);
|
||||
hba->hash_tbl_segments[i] = NULL;
|
||||
}
|
||||
kfree(dma_segment_array);
|
||||
return -ENOMEM;
|
||||
goto cleanup_dma;
|
||||
}
|
||||
memset(hba->hash_tbl_segments[i], 0,
|
||||
BNX2FC_HASH_TBL_CHUNK_SIZE);
|
||||
@@ -2054,8 +2049,7 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
|
||||
GFP_KERNEL);
|
||||
if (!hba->hash_tbl_pbl) {
|
||||
printk(KERN_ERR PFX "hash table pbl alloc failed\n");
|
||||
kfree(dma_segment_array);
|
||||
return -ENOMEM;
|
||||
goto cleanup_dma;
|
||||
}
|
||||
memset(hba->hash_tbl_pbl, 0, PAGE_SIZE);
|
||||
|
||||
@@ -2080,6 +2074,22 @@ static int bnx2fc_allocate_hash_table(struct bnx2fc_hba *hba)
|
||||
}
|
||||
kfree(dma_segment_array);
|
||||
return 0;
|
||||
|
||||
cleanup_dma:
|
||||
for (i = 0; i < segment_count; ++i) {
|
||||
if (hba->hash_tbl_segments[i])
|
||||
dma_free_coherent(&hba->pcidev->dev,
|
||||
BNX2FC_HASH_TBL_CHUNK_SIZE,
|
||||
hba->hash_tbl_segments[i],
|
||||
dma_segment_array[i]);
|
||||
}
|
||||
|
||||
kfree(dma_segment_array);
|
||||
|
||||
cleanup_ht:
|
||||
kfree(hba->hash_tbl_segments);
|
||||
hba->hash_tbl_segments = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user