[S390] cio: ccw device online store - report rc from ccw driver.
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Thu, 26 Mar 2009 14:24:08 +0000 (15:24 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 26 Mar 2009 14:24:13 +0000 (15:24 +0100)
In case the ccw driver refuses to set a device offline, we should
transmit the return code to the caller.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/device.c

index 71b3b73e8ebe77e822c6d3da6c0ad3449d2349cc..9be6dd5a56649f9b9c0fbca514a48a48a4c8b62c 100644 (file)
@@ -457,12 +457,13 @@ int ccw_device_set_online(struct ccw_device *cdev)
        return (ret == 0) ? -ENODEV : ret;
 }
 
-static void online_store_handle_offline(struct ccw_device *cdev)
+static int online_store_handle_offline(struct ccw_device *cdev)
 {
        if (cdev->private->state == DEV_STATE_DISCONNECTED)
                ccw_device_remove_disconnected(cdev);
-       else if (cdev->drv && cdev->drv->set_offline)
-               ccw_device_set_offline(cdev);
+       else if (cdev->online && cdev->drv && cdev->drv->set_offline)
+               return ccw_device_set_offline(cdev);
+       return 0;
 }
 
 static int online_store_recog_and_online(struct ccw_device *cdev)
@@ -530,13 +531,10 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
                goto out;
        switch (i) {
        case 0:
-               online_store_handle_offline(cdev);
-               ret = count;
+               ret = online_store_handle_offline(cdev);
                break;
        case 1:
                ret = online_store_handle_online(cdev, force);
-               if (!ret)
-                       ret = count;
                break;
        default:
                ret = -EINVAL;
@@ -545,7 +543,7 @@ out:
        if (cdev->drv)
                module_put(cdev->drv->owner);
        atomic_set(&cdev->private->onoff, 0);
-       return ret;
+       return (ret < 0) ? ret : count;
 }
 
 static ssize_t