diff --git a/[refs] b/[refs] index 85e4c012f6d2..25c92b358eae 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 20c644680af1ef9a6b36c0873f59498c98b07ab1 +refs/heads/master: 842d3fba94ed94cc5de7b712e0f4218ce6e4fd73 diff --git a/trunk/drivers/s390/char/tape_core.c b/trunk/drivers/s390/char/tape_core.c index 4ea438c749c9..c42f5e25024e 100644 --- a/trunk/drivers/s390/char/tape_core.c +++ b/trunk/drivers/s390/char/tape_core.c @@ -1064,15 +1064,16 @@ __tape_do_irq (struct ccw_device *cdev, unsigned long intparm, struct irb *irb) /* * If the condition code is not zero and the start function bit is * still set, this is an deferred error and the last start I/O did - * not succeed. Restart the request now. + * not succeed. At this point the condition that caused the deferred + * error might still apply. So we just schedule the request to be + * started later. */ if (irb->scsw.cc != 0 && (irb->scsw.fctl & SCSW_FCTL_START_FUNC)) { PRINT_WARN("(%s): deferred cc=%i. restaring\n", cdev->dev.bus_id, irb->scsw.cc); - rc = __tape_start_io(device, request); - if (rc) - __tape_end_request(device, request, rc); + request->status = TAPE_REQUEST_QUEUED; + schedule_work(&device->tape_dnr); return; }