diff options
author | Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | 2009-12-07 06:51:31 -0500 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2009-12-07 06:51:31 -0500 |
commit | 52ef0608e3ee4a511725e443c4b572fece22b353 (patch) | |
tree | 08a2d1f3a3015ec4026f229a1994a31d1b7d50e2 /drivers/s390/cio/device_fsm.c | |
parent | 454e1fa1ebae7cff707b2e3f12b775c263c8408b (diff) |
[S390] cio: use sense-pgid operation for path verification
Set-pgid operations fail for some device types under z/VM for which
the hypervisor has already set the pgid. Also reserved devices or
changed pgids are not correctly recognized. Fix these problems by
using a combination of sense-pgid and set-pgid and by also accepting
pre-defined pgid settings.
Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/device_fsm.c')
-rw-r--r-- | drivers/s390/cio/device_fsm.c | 41 |
1 files changed, 4 insertions, 37 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index d6e315dc0f98..8d565ff85e43 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -395,33 +395,6 @@ ccw_device_done(struct ccw_device *cdev, int state) | |||
395 | } | 395 | } |
396 | 396 | ||
397 | /* | 397 | /* |
398 | * Function called from device_pgid.c after sense path ground has completed. | ||
399 | */ | ||
400 | void | ||
401 | ccw_device_sense_pgid_done(struct ccw_device *cdev, int err) | ||
402 | { | ||
403 | struct subchannel *sch; | ||
404 | |||
405 | sch = to_subchannel(cdev->dev.parent); | ||
406 | switch (err) { | ||
407 | case -EOPNOTSUPP: /* path grouping not supported, use nop instead. */ | ||
408 | case 0: /* success */ | ||
409 | case -EACCES: /* partial success, some paths not operational */ | ||
410 | break; | ||
411 | case -ETIME: /* Sense path group id stopped by timeout. */ | ||
412 | case -EUSERS: /* device is reserved for someone else. */ | ||
413 | ccw_device_done(cdev, DEV_STATE_BOXED); | ||
414 | return; | ||
415 | default: | ||
416 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); | ||
417 | return; | ||
418 | } | ||
419 | /* Start Path Group verification. */ | ||
420 | cdev->private->state = DEV_STATE_VERIFY; | ||
421 | ccw_device_verify_start(cdev); | ||
422 | } | ||
423 | |||
424 | /* | ||
425 | * Start device recognition. | 398 | * Start device recognition. |
426 | */ | 399 | */ |
427 | void ccw_device_recognition(struct ccw_device *cdev) | 400 | void ccw_device_recognition(struct ccw_device *cdev) |
@@ -503,6 +476,7 @@ callback: | |||
503 | } | 476 | } |
504 | break; | 477 | break; |
505 | case -ETIME: | 478 | case -ETIME: |
479 | case -EUSERS: | ||
506 | /* Reset oper notify indication after verify error. */ | 480 | /* Reset oper notify indication after verify error. */ |
507 | cdev->private->flags.donotify = 0; | 481 | cdev->private->flags.donotify = 0; |
508 | ccw_device_done(cdev, DEV_STATE_BOXED); | 482 | ccw_device_done(cdev, DEV_STATE_BOXED); |
@@ -540,16 +514,9 @@ ccw_device_online(struct ccw_device *cdev) | |||
540 | dev_fsm_event(cdev, DEV_EVENT_NOTOPER); | 514 | dev_fsm_event(cdev, DEV_EVENT_NOTOPER); |
541 | return ret; | 515 | return ret; |
542 | } | 516 | } |
543 | /* Do we want to do path grouping? */ | 517 | /* Start initial path verification. */ |
544 | if (!cdev->private->options.pgroup) { | 518 | cdev->private->state = DEV_STATE_VERIFY; |
545 | /* Start initial path verification. */ | 519 | ccw_device_verify_start(cdev); |
546 | cdev->private->state = DEV_STATE_VERIFY; | ||
547 | ccw_device_verify_start(cdev); | ||
548 | return 0; | ||
549 | } | ||
550 | /* Do a SensePGID first. */ | ||
551 | cdev->private->state = DEV_STATE_SENSE_PGID; | ||
552 | ccw_device_sense_pgid_start(cdev); | ||
553 | return 0; | 520 | return 0; |
554 | } | 521 | } |
555 | 522 | ||