diff options
Diffstat (limited to 'drivers/s390/cio/chsc.c')
-rw-r--r-- | drivers/s390/cio/chsc.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 07c7f19339d2..2d78f0f4a40f 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -370,7 +370,7 @@ __s390_process_res_acc(struct subchannel_id schid, void *data) | |||
370 | struct res_acc_data *res_data; | 370 | struct res_acc_data *res_data; |
371 | struct subchannel *sch; | 371 | struct subchannel *sch; |
372 | 372 | ||
373 | res_data = (struct res_acc_data *)data; | 373 | res_data = data; |
374 | sch = get_subchannel_by_schid(schid); | 374 | sch = get_subchannel_by_schid(schid); |
375 | if (!sch) | 375 | if (!sch) |
376 | /* Check if a subchannel is newly available. */ | 376 | /* Check if a subchannel is newly available. */ |
@@ -444,7 +444,7 @@ __get_chpid_from_lir(void *data) | |||
444 | u32 isinfo[28]; | 444 | u32 isinfo[28]; |
445 | } *lir; | 445 | } *lir; |
446 | 446 | ||
447 | lir = (struct lir*) data; | 447 | lir = data; |
448 | if (!(lir->iq&0x80)) | 448 | if (!(lir->iq&0x80)) |
449 | /* NULL link incident record */ | 449 | /* NULL link incident record */ |
450 | return -EINVAL; | 450 | return -EINVAL; |
@@ -628,7 +628,7 @@ __chp_add(struct subchannel_id schid, void *data) | |||
628 | struct channel_path *chp; | 628 | struct channel_path *chp; |
629 | struct subchannel *sch; | 629 | struct subchannel *sch; |
630 | 630 | ||
631 | chp = (struct channel_path *)data; | 631 | chp = data; |
632 | sch = get_subchannel_by_schid(schid); | 632 | sch = get_subchannel_by_schid(schid); |
633 | if (!sch) | 633 | if (!sch) |
634 | /* Check if the subchannel is now available. */ | 634 | /* Check if the subchannel is now available. */ |
@@ -707,8 +707,7 @@ chp_process_crw(int chpid, int on) | |||
707 | return chp_add(chpid); | 707 | return chp_add(chpid); |
708 | } | 708 | } |
709 | 709 | ||
710 | static inline int | 710 | static inline int check_for_io_on_path(struct subchannel *sch, int index) |
711 | __check_for_io_and_kill(struct subchannel *sch, int index) | ||
712 | { | 711 | { |
713 | int cc; | 712 | int cc; |
714 | 713 | ||
@@ -718,10 +717,8 @@ __check_for_io_and_kill(struct subchannel *sch, int index) | |||
718 | cc = stsch(sch->schid, &sch->schib); | 717 | cc = stsch(sch->schid, &sch->schib); |
719 | if (cc) | 718 | if (cc) |
720 | return 0; | 719 | return 0; |
721 | if (sch->schib.scsw.actl && sch->schib.pmcw.lpum == (0x80 >> index)) { | 720 | if (sch->schib.scsw.actl && sch->schib.pmcw.lpum == (0x80 >> index)) |
722 | device_set_waiting(sch); | ||
723 | return 1; | 721 | return 1; |
724 | } | ||
725 | return 0; | 722 | return 0; |
726 | } | 723 | } |
727 | 724 | ||
@@ -750,12 +747,10 @@ __s390_subchannel_vary_chpid(struct subchannel *sch, __u8 chpid, int on) | |||
750 | } else { | 747 | } else { |
751 | sch->opm &= ~(0x80 >> chp); | 748 | sch->opm &= ~(0x80 >> chp); |
752 | sch->lpm &= ~(0x80 >> chp); | 749 | sch->lpm &= ~(0x80 >> chp); |
753 | /* | 750 | if (check_for_io_on_path(sch, chp)) |
754 | * Give running I/O a grace period in which it | 751 | /* Path verification is done after killing. */ |
755 | * can successfully terminate, even using the | 752 | device_kill_io(sch); |
756 | * just varied off path. Then kill it. | 753 | else if (!sch->lpm) { |
757 | */ | ||
758 | if (!__check_for_io_and_kill(sch, chp) && !sch->lpm) { | ||
759 | if (css_enqueue_subchannel_slow(sch->schid)) { | 754 | if (css_enqueue_subchannel_slow(sch->schid)) { |
760 | css_clear_subchannel_slow_list(); | 755 | css_clear_subchannel_slow_list(); |
761 | need_rescan = 1; | 756 | need_rescan = 1; |