mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
rsxx: enable error return of rsxx_eeh_save_issued_dmas()
Commit d8d595df
introduced a bug where we did not check for a NULL
return from kmalloc(). Make rsxx_eeh_save_issued_dmas() return an
error for that case, and make the callers handle that.
Signed-off-by: Philip J Kelleher <pjk1939@linux.vnet.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
d8d595dfce
commit
4dcaf47258
@ -323,10 +323,11 @@ static int card_shutdown(struct rsxx_cardinfo *card)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rsxx_eeh_frozen(struct pci_dev *dev)
|
||||
static int rsxx_eeh_frozen(struct pci_dev *dev)
|
||||
{
|
||||
struct rsxx_cardinfo *card = pci_get_drvdata(dev);
|
||||
int i;
|
||||
int st;
|
||||
|
||||
dev_warn(&dev->dev, "IBM FlashSystem PCI: preparing for slot reset.\n");
|
||||
|
||||
@ -342,7 +343,9 @@ static void rsxx_eeh_frozen(struct pci_dev *dev)
|
||||
|
||||
pci_disable_device(dev);
|
||||
|
||||
rsxx_eeh_save_issued_dmas(card);
|
||||
st = rsxx_eeh_save_issued_dmas(card);
|
||||
if (st)
|
||||
return st;
|
||||
|
||||
rsxx_eeh_save_issued_creg(card);
|
||||
|
||||
@ -356,6 +359,8 @@ static void rsxx_eeh_frozen(struct pci_dev *dev)
|
||||
card->ctrl[i].cmd.buf,
|
||||
card->ctrl[i].cmd.dma_addr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rsxx_eeh_failure(struct pci_dev *dev)
|
||||
@ -399,6 +404,8 @@ static int rsxx_eeh_fifo_flush_poll(struct rsxx_cardinfo *card)
|
||||
static pci_ers_result_t rsxx_error_detected(struct pci_dev *dev,
|
||||
enum pci_channel_state error)
|
||||
{
|
||||
int st;
|
||||
|
||||
if (dev->revision < RSXX_EEH_SUPPORT)
|
||||
return PCI_ERS_RESULT_NONE;
|
||||
|
||||
@ -407,7 +414,13 @@ static pci_ers_result_t rsxx_error_detected(struct pci_dev *dev,
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
}
|
||||
|
||||
rsxx_eeh_frozen(dev);
|
||||
st = rsxx_eeh_frozen(dev);
|
||||
if (st) {
|
||||
dev_err(&dev->dev, "Slot reset setup failed\n");
|
||||
rsxx_eeh_failure(dev);
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
}
|
||||
|
||||
return PCI_ERS_RESULT_NEED_RESET;
|
||||
}
|
||||
|
||||
|
@ -980,7 +980,7 @@ void rsxx_dma_destroy(struct rsxx_cardinfo *card)
|
||||
}
|
||||
}
|
||||
|
||||
void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
|
||||
int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
@ -990,6 +990,8 @@ void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
|
||||
|
||||
issued_dmas = kzalloc(sizeof(*issued_dmas) * card->n_targets,
|
||||
GFP_KERNEL);
|
||||
if (!issued_dmas)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < card->n_targets; i++) {
|
||||
INIT_LIST_HEAD(&issued_dmas[i]);
|
||||
@ -1030,6 +1032,8 @@ void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
|
||||
}
|
||||
|
||||
kfree(issued_dmas);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card)
|
||||
|
@ -381,7 +381,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card,
|
||||
rsxx_dma_cb cb,
|
||||
void *cb_data);
|
||||
int rsxx_hw_buffers_init(struct pci_dev *dev, struct rsxx_dma_ctrl *ctrl);
|
||||
void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card);
|
||||
int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card);
|
||||
void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card);
|
||||
int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user