advansys: fix regression with request_firmware change
Subsystems (2)
PATCH 1/1 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.
--- drivers/scsi/advansys.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
Note that I'm still waiting for user on bug report to test this patch, but so far this is safe and should be ok to solve the bug, so I'm sending it already.
drivers/scsi/advansys.c +8 -0
@@ -4781,12 +4781,14 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code |=ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code |=ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
@@ -5110,12 +5112,14 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
@@ -5624,12 +5628,14 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
@@ -6124,12 +6130,14 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
Signature · 1 line
1.7.0.2
Em Sex 19 Mar 2010, às 19:37:26, Herton Ronaldo Krzesinski escreveu:
Quoted 7 lines
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 torequest_firmware,asc_dvc->err_codeisn't being set when firmware files aren't found or loading fails.
Quoted 6 lines
err_codeis used by the driver to judge if there was a fatal error or not, as can be seen for example onadvansys_board_found, which will only return-ENODEVwhenerr_codeis set. Becauseerr_codeisn't being set whenrequest_firmwarefails, this is a change of behaviour of the code beforerequest_firmwareaddition, making it continue to load and it fails later as the firmware wasn't really loaded.
Please disregard this patch, an user tested and found another issue with it, I'll fix it and repost.
Quoted 74 lines
Signed-off-by Herton Ronaldo Krzesinski <[email protected]>--- drivers/scsi/advansys.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)Note that I'm still waiting for user on bug report to test this patch, but so far this is safe and should be ok to solve the bug, so I'm sending it already.
drivers/scsi/advansys.c +8
-0@@ -4781,12 +4781,14 @@ static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code |=ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code |=ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |@@ -5110,12 +5112,14 @@ static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |@@ -5624,12 +5628,14 @@ static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |@@ -6124,12 +6130,14 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , fwname, err); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return err; }if (fw->size <4 ) {printk (KERN_ERR "Bogus length %zu in image \"%s\"\n" , fw->size, fwname);release_firmware (fw); + asc_dvc->err_code =ASC_IERR_MCODE_CHKSUM ;return -EINVAL ; } chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
Signature · 6 lines
[]'s Herton -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html