linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / s390 / char / tape_std.c
index 7a76ec4..2f9fe30 100644 (file)
@@ -11,6 +11,7 @@
  *              Stefan Bader <shbader@de.ibm.com>
  */
 
+#include <linux/config.h>
 #include <linux/stddef.h>
 #include <linux/kernel.h>
 #include <linux/bio.h>
@@ -36,19 +37,20 @@ tape_std_assign_timeout(unsigned long data)
 {
        struct tape_request *   request;
        struct tape_device *    device;
-       int rc;
 
        request = (struct tape_request *) data;
        if ((device = request->device) == NULL)
                BUG();
 
-       DBF_EVENT(3, "%08x: Assignment timeout. Device busy.\n",
+       spin_lock_irq(get_ccwdev_lock(device->cdev));
+       if (request->callback != NULL) {
+               DBF_EVENT(3, "%08x: Assignment timeout. Device busy.\n",
                        device->cdev_id);
-       rc = tape_cancel_io(device, request);
-       if(rc)
-               PRINT_ERR("(%s): Assign timeout: Cancel failed with rc = %i\n",
-                       device->cdev->dev.bus_id, rc);
-
+               PRINT_ERR("%s: Assignment timeout. Device busy.\n",
+                       device->cdev->dev.bus_id);
+               ccw_device_clear(device->cdev, (long) request);
+       }
+       spin_unlock_irq(get_ccwdev_lock(device->cdev));
 }
 
 int