Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Philip J Kelleher and committed by
Jens Axboe
4dcaf472 d8d595df

+22 -5
+16 -3
drivers/block/rsxx/core.c
··· 323 323 return 0; 324 324 } 325 325 326 - static void rsxx_eeh_frozen(struct pci_dev *dev) 326 + static int rsxx_eeh_frozen(struct pci_dev *dev) 327 327 { 328 328 struct rsxx_cardinfo *card = pci_get_drvdata(dev); 329 329 int i; 330 + int st; 330 331 331 332 dev_warn(&dev->dev, "IBM FlashSystem PCI: preparing for slot reset.\n"); 332 333 ··· 343 342 344 343 pci_disable_device(dev); 345 344 346 - rsxx_eeh_save_issued_dmas(card); 345 + st = rsxx_eeh_save_issued_dmas(card); 346 + if (st) 347 + return st; 347 348 348 349 rsxx_eeh_save_issued_creg(card); 349 350 ··· 359 356 card->ctrl[i].cmd.buf, 360 357 card->ctrl[i].cmd.dma_addr); 361 358 } 359 + 360 + return 0; 362 361 } 363 362 364 363 static void rsxx_eeh_failure(struct pci_dev *dev) ··· 404 399 static pci_ers_result_t rsxx_error_detected(struct pci_dev *dev, 405 400 enum pci_channel_state error) 406 401 { 402 + int st; 403 + 407 404 if (dev->revision < RSXX_EEH_SUPPORT) 408 405 return PCI_ERS_RESULT_NONE; 409 406 ··· 414 407 return PCI_ERS_RESULT_DISCONNECT; 415 408 } 416 409 417 - rsxx_eeh_frozen(dev); 410 + st = rsxx_eeh_frozen(dev); 411 + if (st) { 412 + dev_err(&dev->dev, "Slot reset setup failed\n"); 413 + rsxx_eeh_failure(dev); 414 + return PCI_ERS_RESULT_DISCONNECT; 415 + } 416 + 418 417 return PCI_ERS_RESULT_NEED_RESET; 419 418 } 420 419
+5 -1
drivers/block/rsxx/dma.c
··· 980 980 } 981 981 } 982 982 983 - void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card) 983 + int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card) 984 984 { 985 985 int i; 986 986 int j; ··· 990 990 991 991 issued_dmas = kzalloc(sizeof(*issued_dmas) * card->n_targets, 992 992 GFP_KERNEL); 993 + if (!issued_dmas) 994 + return -ENOMEM; 993 995 994 996 for (i = 0; i < card->n_targets; i++) { 995 997 INIT_LIST_HEAD(&issued_dmas[i]); ··· 1032 1030 } 1033 1031 1034 1032 kfree(issued_dmas); 1033 + 1034 + return 0; 1035 1035 } 1036 1036 1037 1037 void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card)
+1 -1
drivers/block/rsxx/rsxx_priv.h
··· 381 381 rsxx_dma_cb cb, 382 382 void *cb_data); 383 383 int rsxx_hw_buffers_init(struct pci_dev *dev, struct rsxx_dma_ctrl *ctrl); 384 - void rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card); 384 + int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card); 385 385 void rsxx_eeh_cancel_dmas(struct rsxx_cardinfo *card); 386 386 int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card); 387 387