[PATCH] s390: fix locking in __chp_add() and s390_subchannel_remove_chpid()

Fix locking in __chp_add() and s390_subchannel_remove_chpid(): Need to
disable/enable because they are always called from a thread (and not
directly from a machine check...)

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Cornelia Huck and committed by Linus Torvalds c48d865c c0cdf193

+5 -5
+5 -5
drivers/s390/cio/chsc.c
··· 232 return 0; 233 234 mask = 0x80 >> j; 235 - spin_lock(&sch->lock); 236 237 stsch(sch->schid, &schib); 238 if (!schib.pmcw.dnv) ··· 281 if (sch->driver && sch->driver->verify) 282 sch->driver->verify(&sch->dev); 283 out_unlock: 284 - spin_unlock(&sch->lock); 285 return 0; 286 out_unreg: 287 - spin_unlock(&sch->lock); 288 sch->lpm = 0; 289 if (css_enqueue_subchannel_slow(sch->schid)) { 290 css_clear_subchannel_slow_list(); ··· 652 if (!sch) 653 /* Check if the subchannel is now available. */ 654 return __chp_add_new_sch(schid); 655 - spin_lock(&sch->lock); 656 for (i=0; i<8; i++) 657 if (sch->schib.pmcw.chpid[i] == chp->id) { 658 if (stsch(sch->schid, &sch->schib) != 0) { ··· 674 if (sch->driver && sch->driver->verify) 675 sch->driver->verify(&sch->dev); 676 677 - spin_unlock(&sch->lock); 678 put_device(&sch->dev); 679 return 0; 680 }
··· 232 return 0; 233 234 mask = 0x80 >> j; 235 + spin_lock_irq(&sch->lock); 236 237 stsch(sch->schid, &schib); 238 if (!schib.pmcw.dnv) ··· 281 if (sch->driver && sch->driver->verify) 282 sch->driver->verify(&sch->dev); 283 out_unlock: 284 + spin_unlock_irq(&sch->lock); 285 return 0; 286 out_unreg: 287 + spin_unlock_irq(&sch->lock); 288 sch->lpm = 0; 289 if (css_enqueue_subchannel_slow(sch->schid)) { 290 css_clear_subchannel_slow_list(); ··· 652 if (!sch) 653 /* Check if the subchannel is now available. */ 654 return __chp_add_new_sch(schid); 655 + spin_lock_irq(&sch->lock); 656 for (i=0; i<8; i++) 657 if (sch->schib.pmcw.chpid[i] == chp->id) { 658 if (stsch(sch->schid, &sch->schib) != 0) { ··· 674 if (sch->driver && sch->driver->verify) 675 sch->driver->verify(&sch->dev); 676 677 + spin_unlock_irq(&sch->lock); 678 put_device(&sch->dev); 679 return 0; 680 }