aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/s390/block/dcssblk.c9
-rw-r--r--drivers/s390/cio/cmf.c4
-rw-r--r--drivers/s390/cio/device.c2
-rw-r--r--drivers/s390/net/smsgiucv.c4
4 files changed, 14 insertions, 5 deletions
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index 859f870552..5e083d1f57 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -193,6 +193,12 @@ dcssblk_segment_warn(int rc, char* seg_name)
193 } 193 }
194} 194}
195 195
196static void dcssblk_unregister_callback(struct device *dev)
197{
198 device_unregister(dev);
199 put_device(dev);
200}
201
196/* 202/*
197 * device attribute for switching shared/nonshared (exclusive) 203 * device attribute for switching shared/nonshared (exclusive)
198 * operation (show + store) 204 * operation (show + store)
@@ -276,8 +282,7 @@ removeseg:
276 blk_cleanup_queue(dev_info->dcssblk_queue); 282 blk_cleanup_queue(dev_info->dcssblk_queue);
277 dev_info->gd->queue = NULL; 283 dev_info->gd->queue = NULL;
278 put_disk(dev_info->gd); 284 put_disk(dev_info->gd);
279 device_unregister(dev); 285 rc = device_schedule_callback(dev, dcssblk_unregister_callback);
280 put_device(dev);
281out: 286out:
282 up_write(&dcssblk_devices_sem); 287 up_write(&dcssblk_devices_sem);
283 return rc; 288 return rc;
diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c
index 725b0dd142..f4c132ab39 100644
--- a/drivers/s390/cio/cmf.c
+++ b/drivers/s390/cio/cmf.c
@@ -343,10 +343,10 @@ static int cmf_copy_block(struct ccw_device *cdev)
343 343
344 if (sch->schib.scsw.fctl & SCSW_FCTL_START_FUNC) { 344 if (sch->schib.scsw.fctl & SCSW_FCTL_START_FUNC) {
345 /* Don't copy if a start function is in progress. */ 345 /* Don't copy if a start function is in progress. */
346 if ((!sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED) && 346 if ((!(sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED)) &&
347 (sch->schib.scsw.actl & 347 (sch->schib.scsw.actl &
348 (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)) && 348 (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)) &&
349 (!sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)) 349 (!(sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)))
350 return -EBUSY; 350 return -EBUSY;
351 } 351 }
352 cmb_data = cdev->private->cmb; 352 cmb_data = cdev->private->cmb;
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index 7ee57f084a..74f6b53997 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -738,7 +738,7 @@ static int io_subchannel_initialize_dev(struct subchannel *sch,
738 atomic_set(&cdev->private->onoff, 0); 738 atomic_set(&cdev->private->onoff, 0);
739 cdev->dev.parent = &sch->dev; 739 cdev->dev.parent = &sch->dev;
740 cdev->dev.release = ccw_device_release; 740 cdev->dev.release = ccw_device_release;
741 INIT_LIST_HEAD(&cdev->private->kick_work.entry); 741 INIT_WORK(&cdev->private->kick_work, NULL);
742 cdev->dev.groups = ccwdev_attr_groups; 742 cdev->dev.groups = ccwdev_attr_groups;
743 /* Do first half of device_register. */ 743 /* Do first half of device_register. */
744 device_initialize(&cdev->dev); 744 device_initialize(&cdev->dev);
diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c
index 3ccca5871f..47bb47b485 100644
--- a/drivers/s390/net/smsgiucv.c
+++ b/drivers/s390/net/smsgiucv.c
@@ -148,6 +148,10 @@ static int __init smsg_init(void)
148{ 148{
149 int rc; 149 int rc;
150 150
151 if (!MACHINE_IS_VM) {
152 rc = -EPROTONOSUPPORT;
153 goto out;
154 }
151 rc = driver_register(&smsg_driver); 155 rc = driver_register(&smsg_driver);
152 if (rc != 0) 156 if (rc != 0)
153 goto out; 157 goto out;