Commit 4dcaf472 authored by Philip J Kelleher's avatar Philip J Kelleher Committed by Jens Axboe

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: default avatarPhilip J Kelleher <pjk1939@linux.vnet.ibm.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent d8d595df
...@@ -323,10 +323,11 @@ static int card_shutdown(struct rsxx_cardinfo *card) ...@@ -323,10 +323,11 @@ static int card_shutdown(struct rsxx_cardinfo *card)
return 0; 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); struct rsxx_cardinfo *card = pci_get_drvdata(dev);
int i; int i;
int st;
dev_warn(&dev->dev, "IBM FlashSystem PCI: preparing for slot reset.\n"); 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) ...@@ -342,7 +343,9 @@ static void rsxx_eeh_frozen(struct pci_dev *dev)
pci_disable_device(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); rsxx_eeh_save_issued_creg(card);
...@@ -356,6 +359,8 @@ static void rsxx_eeh_frozen(struct pci_dev *dev) ...@@ -356,6 +359,8 @@ static void rsxx_eeh_frozen(struct pci_dev *dev)
card->ctrl[i].cmd.buf, card->ctrl[i].cmd.buf,
card->ctrl[i].cmd.dma_addr); card->ctrl[i].cmd.dma_addr);
} }
return 0;
} }
static void rsxx_eeh_failure(struct pci_dev *dev) static void rsxx_eeh_failure(struct pci_dev *dev)
...@@ -399,6 +404,8 @@ static int rsxx_eeh_fifo_flush_poll(struct rsxx_cardinfo *card) ...@@ -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, static pci_ers_result_t rsxx_error_detected(struct pci_dev *dev,
enum pci_channel_state error) enum pci_channel_state error)
{ {
int st;
if (dev->revision < RSXX_EEH_SUPPORT) if (dev->revision < RSXX_EEH_SUPPORT)
return PCI_ERS_RESULT_NONE; return PCI_ERS_RESULT_NONE;
...@@ -407,7 +414,13 @@ static pci_ers_result_t rsxx_error_detected(struct pci_dev *dev, ...@@ -407,7 +414,13 @@ static pci_ers_result_t rsxx_error_detected(struct pci_dev *dev,
return PCI_ERS_RESULT_DISCONNECT; 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; return PCI_ERS_RESULT_NEED_RESET;
} }
......
...@@ -980,7 +980,7 @@ void rsxx_dma_destroy(struct rsxx_cardinfo *card) ...@@ -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 i;
int j; int j;
...@@ -990,6 +990,8 @@ void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card) ...@@ -990,6 +990,8 @@ void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
issued_dmas = kzalloc(sizeof(*issued_dmas) * card->n_targets, issued_dmas = kzalloc(sizeof(*issued_dmas) * card->n_targets,
GFP_KERNEL); GFP_KERNEL);
if (!issued_dmas)
return -ENOMEM;
for (i = 0; i < card->n_targets; i++) { for (i = 0; i < card->n_targets; i++) {
INIT_LIST_HEAD(&issued_dmas[i]); INIT_LIST_HEAD(&issued_dmas[i]);
...@@ -1030,6 +1032,8 @@ void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card) ...@@ -1030,6 +1032,8 @@ void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card)
} }
kfree(issued_dmas); kfree(issued_dmas);
return 0;
} }
void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card) void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card)
......
...@@ -381,7 +381,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card, ...@@ -381,7 +381,7 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card,
rsxx_dma_cb cb, rsxx_dma_cb cb,
void *cb_data); void *cb_data);
int rsxx_hw_buffers_init(struct pci_dev *dev, struct rsxx_dma_ctrl *ctrl); 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); void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card);
int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card); int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment