From 2a1450ad06dc5cd1e8b819a01b32a8f669191183 Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Thu, 17 Apr 2008 07:45:59 +0200 Subject: [PATCH] --- yaml --- r: 88406 b: refs/heads/master c: 22806dc1a8ffd88a7c7bdd070879e6e323db496a h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/s390/cio/chsc.c | 12 ++++++++++-- trunk/drivers/s390/cio/css.c | 6 ++++++ trunk/drivers/s390/cio/css.h | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 23eae403d522..52aa9a18ab04 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 374b8f45f1d5cb17f45ba1d7c74ce8cc9e2f1407 +refs/heads/master: 22806dc1a8ffd88a7c7bdd070879e6e323db496a diff --git a/trunk/drivers/s390/cio/chsc.c b/trunk/drivers/s390/cio/chsc.c index 007aaeb4f532..b6a40c20780d 100644 --- a/trunk/drivers/s390/cio/chsc.c +++ b/trunk/drivers/s390/cio/chsc.c @@ -217,6 +217,8 @@ void chsc_chp_offline(struct chp_id chpid) if (chp_get_status(chpid) <= 0) return; + /* Wait until previous actions have settled. */ + css_wait_for_slow_path(); for_each_subchannel_staged(s390_subchannel_remove_chpid, NULL, &chpid); } @@ -303,7 +305,8 @@ static void s390_process_res_acc (struct res_acc_data *res_data) sprintf(dbf_txt, "fla%x", res_data->fla); CIO_TRACE_EVENT( 2, dbf_txt); } - + /* Wait until previous actions have settled. */ + css_wait_for_slow_path(); /* * I/O resources may have become accessible. * Scan through all subchannels that may be concerned and @@ -561,9 +564,12 @@ void chsc_chp_online(struct chp_id chpid) sprintf(dbf_txt, "cadd%x.%02x", chpid.cssid, chpid.id); CIO_TRACE_EVENT(2, dbf_txt); - if (chp_get_status(chpid) != 0) + if (chp_get_status(chpid) != 0) { + /* Wait until previous actions have settled. */ + css_wait_for_slow_path(); for_each_subchannel_staged(__chp_add, __chp_add_new_sch, &chpid); + } } static void __s390_subchannel_vary_chpid(struct subchannel *sch, @@ -650,6 +656,8 @@ __s390_vary_chpid_on(struct subchannel_id schid, void *data) */ int chsc_chp_vary(struct chp_id chpid, int on) { + /* Wait until previous actions have settled. */ + css_wait_for_slow_path(); /* * Redo PathVerification on the devices the chpid connects to */ diff --git a/trunk/drivers/s390/cio/css.c b/trunk/drivers/s390/cio/css.c index 3b45bbe6cce0..3e829c827493 100644 --- a/trunk/drivers/s390/cio/css.c +++ b/trunk/drivers/s390/cio/css.c @@ -533,6 +533,12 @@ void css_schedule_eval_all(void) spin_unlock_irqrestore(&slow_subchannel_lock, flags); } +void css_wait_for_slow_path(void) +{ + flush_workqueue(ccw_device_notify_work); + flush_workqueue(slow_path_wq); +} + /* Reprobe subchannel if unregistered. */ static int reprobe_subchannel(struct subchannel_id schid, void *data) { diff --git a/trunk/drivers/s390/cio/css.h b/trunk/drivers/s390/cio/css.h index b70554523552..e1913518f354 100644 --- a/trunk/drivers/s390/cio/css.h +++ b/trunk/drivers/s390/cio/css.h @@ -144,6 +144,7 @@ struct schib; int css_sch_is_valid(struct schib *); extern struct workqueue_struct *slow_path_wq; +void css_wait_for_slow_path(void); extern struct attribute_group *subch_attr_groups[]; #endif