[S390] cio: handle error during path verification consistently
authorPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Mon, 7 Dec 2009 11:51:22 +0000 (12:51 +0100)
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>
Mon, 7 Dec 2009 11:51:30 +0000 (12:51 +0100)
Handle verification errors consistently through the existing
callback ccw_device_done to reduce cleanup code duplication.

Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/device_fsm.c
drivers/s390/cio/device_pgid.c

index 83adb919648fc20f988b418cc5123f3dbd0cb2a6..a70c46c8b4bcd9d2fe2ae9d33148d885f976887b 100644 (file)
@@ -549,9 +549,8 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
        sch = to_subchannel(cdev->dev.parent);
        /* Update schib - pom may have changed. */
        if (cio_update_schib(sch)) {
-               cdev->private->flags.donotify = 0;
-               ccw_device_done(cdev, DEV_STATE_NOT_OPER);
-               return;
+               err = -ENODEV;
+               goto callback;
        }
        /* Update lpm with verified path mask. */
        sch->lpm = sch->vpm;
@@ -561,9 +560,8 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
                ccw_device_verify_start(cdev);
                return;
        }
+callback:
        switch (err) {
-       case -EOPNOTSUPP: /* path grouping not supported, just set online. */
-               cdev->private->options.pgroup = 0;
        case 0:
                ccw_device_done(cdev, DEV_STATE_ONLINE);
                /* Deliver fake irb to device driver, if needed. */
@@ -586,14 +584,15 @@ ccw_device_verify_done(struct ccw_device *cdev, int err)
                cdev->private->flags.donotify = 0;
                ccw_device_done(cdev, DEV_STATE_BOXED);
                break;
+       case -EACCES:
+               /* Reset oper notify indication after verify error. */
+               cdev->private->flags.donotify = 0;
+               ccw_device_done(cdev, DEV_STATE_DISCONNECTED);
+               break;
        default:
                /* Reset oper notify indication after verify error. */
                cdev->private->flags.donotify = 0;
-               if (cdev->online) {
-                       ccw_device_set_timeout(cdev, 0);
-                       dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
-               } else
-                       ccw_device_done(cdev, DEV_STATE_NOT_OPER);
+               ccw_device_done(cdev, DEV_STATE_NOT_OPER);
                break;
        }
 }
index fc5ca1dd52b39dfd4fd3727e40598228479c7ec9..cb27bd4cc231242f16c23c7cc4e2eb4485aa4a89 100644 (file)
@@ -423,7 +423,7 @@ __ccw_device_verify_start(struct ccw_device *cdev)
                /* Permanent path failure, try next. */
        }
        /* Done with all paths. */
-       ccw_device_verify_done(cdev, (sch->vpm != 0) ? 0 : -ENODEV);
+       ccw_device_verify_done(cdev, (sch->vpm != 0) ? 0 : -EACCES);
 }
                
 /*