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

[SCSI] mptfc: abort of board reset leaves port dead requiring reboot

The driver uses msleep_interruptible() in the code path responsible
for resetting the card's ports via the lsiutil command. If a
<ctrl-c> is received during the reset it can leave a port in such
a state that the only way to regain its use is to reboot the system.
Changing from msleep_interruptible() to msleep() corrects the problem.

Signed-off-by: Michael Reed <mdr@sgi.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by

Michael Reed and committed by
James Bottomley
d6be06c8 419835e2

+17 -17
+15 -15
drivers/message/fusion/mptbase.c
··· 2291 2291 } 2292 2292 2293 2293 if (sleepFlag == CAN_SLEEP) { 2294 - msleep_interruptible(1); 2294 + msleep(1); 2295 2295 } else { 2296 2296 mdelay (1); /* 1 msec delay */ 2297 2297 } ··· 2679 2679 state = mpt_GetIocState(ioc, 1); 2680 2680 while (state != MPI_IOC_STATE_OPERATIONAL && --cntdn) { 2681 2681 if (sleepFlag == CAN_SLEEP) { 2682 - msleep_interruptible(1); 2682 + msleep(1); 2683 2683 } else { 2684 2684 mdelay(1); 2685 2685 } ··· 2931 2931 2932 2932 /* wait 1 msec */ 2933 2933 if (sleepFlag == CAN_SLEEP) { 2934 - msleep_interruptible(1); 2934 + msleep(1); 2935 2935 } else { 2936 2936 mdelay (1); 2937 2937 } ··· 2948 2948 } 2949 2949 /* wait .1 sec */ 2950 2950 if (sleepFlag == CAN_SLEEP) { 2951 - msleep_interruptible (100); 2951 + msleep (100); 2952 2952 } else { 2953 2953 mdelay (100); 2954 2954 } ··· 3038 3038 3039 3039 /* wait 1 msec */ 3040 3040 if (sleepFlag == CAN_SLEEP) { 3041 - msleep_interruptible (1); 3041 + msleep (1); 3042 3042 } else { 3043 3043 mdelay (1); 3044 3044 } ··· 3086 3086 return 0; 3087 3087 } 3088 3088 if (sleepFlag == CAN_SLEEP) { 3089 - msleep_interruptible (10); 3089 + msleep (10); 3090 3090 } else { 3091 3091 mdelay (10); 3092 3092 } ··· 3137 3137 SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag); 3138 3138 3139 3139 if (sleepFlag == CAN_SLEEP) { 3140 - msleep_interruptible (1000); 3140 + msleep (1000); 3141 3141 } else { 3142 3142 mdelay (1000); 3143 3143 } ··· 3159 3159 return hard_reset_done; 3160 3160 } 3161 3161 if (sleepFlag == CAN_SLEEP) { 3162 - msleep_interruptible (10); 3162 + msleep (10); 3163 3163 } else { 3164 3164 mdelay (10); 3165 3165 } ··· 3230 3230 3231 3231 /* wait 100 msec */ 3232 3232 if (sleepFlag == CAN_SLEEP) { 3233 - msleep_interruptible (100); 3233 + msleep (100); 3234 3234 } else { 3235 3235 mdelay (100); 3236 3236 } ··· 3309 3309 3310 3310 /* wait 1 sec */ 3311 3311 if (sleepFlag == CAN_SLEEP) { 3312 - msleep_interruptible (1000); 3312 + msleep (1000); 3313 3313 } else { 3314 3314 mdelay (1000); 3315 3315 } ··· 3337 3337 3338 3338 /* wait 1 sec */ 3339 3339 if (sleepFlag == CAN_SLEEP) { 3340 - msleep_interruptible (1000); 3340 + msleep (1000); 3341 3341 } else { 3342 3342 mdelay (1000); 3343 3343 } ··· 3371 3371 3372 3372 /* wait 100 msec */ 3373 3373 if (sleepFlag == CAN_SLEEP) { 3374 - msleep_interruptible (100); 3374 + msleep (100); 3375 3375 } else { 3376 3376 mdelay (100); 3377 3377 } ··· 3465 3465 } 3466 3466 3467 3467 if (sleepFlag == CAN_SLEEP) { 3468 - msleep_interruptible(1); 3468 + msleep(1); 3469 3469 } else { 3470 3470 mdelay (1); /* 1 msec delay */ 3471 3471 } ··· 3905 3905 intstat = CHIPREG_READ32(&ioc->chip->IntStatus); 3906 3906 if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS)) 3907 3907 break; 3908 - msleep_interruptible (1); 3908 + msleep (1); 3909 3909 count++; 3910 3910 } 3911 3911 } else { ··· 3954 3954 intstat = CHIPREG_READ32(&ioc->chip->IntStatus); 3955 3955 if (intstat & MPI_HIS_DOORBELL_INTERRUPT) 3956 3956 break; 3957 - msleep_interruptible(1); 3957 + msleep(1); 3958 3958 count++; 3959 3959 } 3960 3960 } else {
+1 -1
drivers/message/fusion/mptfc.c
··· 678 678 */ 679 679 if (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) { 680 680 if (count-- > 0) { 681 - msleep_interruptible(100); 681 + msleep(100); 682 682 goto try_again; 683 683 } 684 684 printk(MYIOC_s_INFO_FMT "Firmware discovery not"
+1 -1
drivers/message/fusion/mptscsih.c
··· 1922 1922 break; 1923 1923 } 1924 1924 spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags); 1925 - msleep_interruptible(250); 1925 + msleep(250); 1926 1926 } while (--loop_count); 1927 1927 1928 1928 return status;