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

[SCSI] advansys: fix regression with request_firmware change

On newer kernels users of advansys module are reporting system hang when
trying to load it without firmware files present. After looking closely
at description on https://qa.mandriva.com/show_bug.cgi?id=53220, I think
this is related to commit "[SCSI] advansys: use request_firmware". The
problem is that after switch to request_firmware, asc_dvc->err_code
isn't being set when firmware files aren't found or loading fails.

err_code is used by the driver to judge if there was a fatal error or
not, as can be seen for example on advansys_board_found, which will only
return -ENODEV when err_code is set. Because err_code isn't being set
when request_firmware fails, this is a change of behaviour of the code
before request_firmware addition, making it continue to load and it
fails later as the firmware wasn't really loaded.

Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>

authored by

Herton Ronaldo Krzesinski and committed by
James Bottomley
cf747445 89162e9c

+8
+8
drivers/scsi/advansys.c
··· 4781 4781 if (err) { 4782 4782 printk(KERN_ERR "Failed to load image \"%s\" err %d\n", 4783 4783 fwname, err); 4784 + asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; 4784 4785 return err; 4785 4786 } 4786 4787 if (fw->size < 4) { 4787 4788 printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", 4788 4789 fw->size, fwname); 4789 4790 release_firmware(fw); 4791 + asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM; 4790 4792 return -EINVAL; 4791 4793 } 4792 4794 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | ··· 5112 5110 if (err) { 5113 5111 printk(KERN_ERR "Failed to load image \"%s\" err %d\n", 5114 5112 fwname, err); 5113 + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; 5115 5114 return err; 5116 5115 } 5117 5116 if (fw->size < 4) { 5118 5117 printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", 5119 5118 fw->size, fwname); 5120 5119 release_firmware(fw); 5120 + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; 5121 5121 return -EINVAL; 5122 5122 } 5123 5123 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | ··· 5628 5624 if (err) { 5629 5625 printk(KERN_ERR "Failed to load image \"%s\" err %d\n", 5630 5626 fwname, err); 5627 + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; 5631 5628 return err; 5632 5629 } 5633 5630 if (fw->size < 4) { 5634 5631 printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", 5635 5632 fw->size, fwname); 5636 5633 release_firmware(fw); 5634 + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; 5637 5635 return -EINVAL; 5638 5636 } 5639 5637 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) | ··· 6130 6124 if (err) { 6131 6125 printk(KERN_ERR "Failed to load image \"%s\" err %d\n", 6132 6126 fwname, err); 6127 + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; 6133 6128 return err; 6134 6129 } 6135 6130 if (fw->size < 4) { 6136 6131 printk(KERN_ERR "Bogus length %zu in image \"%s\"\n", 6137 6132 fw->size, fwname); 6138 6133 release_firmware(fw); 6134 + asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM; 6139 6135 return -EINVAL; 6140 6136 } 6141 6137 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |