diff options
-rw-r--r-- | drivers/s390/char/tape_core.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 4ea438c749c9..c42f5e25024e 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
@@ -1064,15 +1064,16 @@ __tape_do_irq (struct ccw_device *cdev, unsigned long intparm, struct irb *irb) | |||
1064 | /* | 1064 | /* |
1065 | * If the condition code is not zero and the start function bit is | 1065 | * If the condition code is not zero and the start function bit is |
1066 | * still set, this is an deferred error and the last start I/O did | 1066 | * still set, this is an deferred error and the last start I/O did |
1067 | * not succeed. Restart the request now. | 1067 | * not succeed. At this point the condition that caused the deferred |
1068 | * error might still apply. So we just schedule the request to be | ||
1069 | * started later. | ||
1068 | */ | 1070 | */ |
1069 | if (irb->scsw.cc != 0 && (irb->scsw.fctl & SCSW_FCTL_START_FUNC)) { | 1071 | if (irb->scsw.cc != 0 && (irb->scsw.fctl & SCSW_FCTL_START_FUNC)) { |
1070 | PRINT_WARN("(%s): deferred cc=%i. restaring\n", | 1072 | PRINT_WARN("(%s): deferred cc=%i. restaring\n", |
1071 | cdev->dev.bus_id, | 1073 | cdev->dev.bus_id, |
1072 | irb->scsw.cc); | 1074 | irb->scsw.cc); |
1073 | rc = __tape_start_io(device, request); | 1075 | request->status = TAPE_REQUEST_QUEUED; |
1074 | if (rc) | 1076 | schedule_work(&device->tape_dnr); |
1075 | __tape_end_request(device, request, rc); | ||
1076 | return; | 1077 | return; |
1077 | } | 1078 | } |
1078 | 1079 | ||