disk->major = tapeblock_major;
        disk->first_minor = device->first_minor;
        disk->fops = &tapeblock_fops;
-       disk->private_data = tape_get_device_reference(device);
+       disk->private_data = tape_get_device(device);
        disk->queue = blkdat->request_queue;
        set_capacity(disk, 0);
        sprintf(disk->disk_name, "btibm%d",
 
        blkdat->disk = disk;
        blkdat->medium_changed = 1;
-       blkdat->request_queue->queuedata = tape_get_device_reference(device);
+       blkdat->request_queue->queuedata = tape_get_device(device);
 
        add_disk(disk);
 
-       tape_get_device_reference(device);
+       tape_get_device(device);
        INIT_WORK(&blkdat->requeue_task, tapeblock_requeue);
 
        return 0;
        }
 
        del_gendisk(device->blk_data.disk);
-       device->blk_data.disk->private_data =
-               tape_put_device(device->blk_data.disk->private_data);
+       device->blk_data.disk->private_data = NULL;
+       tape_put_device(device);
        put_disk(device->blk_data.disk);
 
        device->blk_data.disk = NULL;
 cleanup_queue:
-       device->blk_data.request_queue->queuedata = tape_put_device(device);
+       device->blk_data.request_queue->queuedata = NULL;
+       tape_put_device(device);
 
        blk_cleanup_queue(device->blk_data.request_queue);
        device->blk_data.request_queue = NULL;
        struct tape_device *    device;
        int                     rc;
 
-       device = tape_get_device_reference(disk->private_data);
+       device = tape_get_device(disk->private_data);
 
        if (device->required_tapemarks) {
                DBF_EVENT(2, "TBLOCK: missing tapemarks\n");
 
  * increment the reference count.
  */
 struct tape_device *
-tape_get_device_reference(struct tape_device *device)
+tape_get_device(struct tape_device *device)
 {
-       DBF_EVENT(4, "tape_get_device_reference(%p) = %i\n", device,
-               atomic_inc_return(&device->ref_count));
+       int count;
 
+       count = atomic_inc_return(&device->ref_count);
+       DBF_EVENT(4, "tape_get_device(%p) = %i\n", device, count);
        return device;
 }
 
  * The function returns a NULL pointer to be used by the caller
  * for clearing reference pointers.
  */
-struct tape_device *
+void
 tape_put_device(struct tape_device *device)
 {
-       int remain;
+       int count;
 
-       remain = atomic_dec_return(&device->ref_count);
-       if (remain > 0) {
-               DBF_EVENT(4, "tape_put_device(%p) -> %i\n", device, remain);
-       } else {
-               if (remain < 0) {
-                       DBF_EVENT(4, "put device without reference\n");
-               } else {
-                       DBF_EVENT(4, "tape_free_device(%p)\n", device);
-                       kfree(device->modeset_byte);
-                       kfree(device);
-               }
+       count = atomic_dec_return(&device->ref_count);
+       DBF_EVENT(4, "tape_put_device(%p) -> %i\n", device, count);
+       BUG_ON(count < 0);
+       if (count == 0) {
+               kfree(device->modeset_byte);
+               kfree(device);
        }
-
-       return NULL;                    
 }
 
 /*
  * Find tape device by a device index.
  */
 struct tape_device *
-tape_get_device(int devindex)
+tape_find_device(int devindex)
 {
        struct tape_device *device, *tmp;
 
        read_lock(&tape_device_lock);
        list_for_each_entry(tmp, &tape_device_list, node) {
                if (tmp->first_minor / TAPE_MINORS_PER_DEV == devindex) {
-                       device = tape_get_device_reference(tmp);
+                       device = tape_get_device(tmp);
                        break;
                }
        }
                list_del(&request->list);
 
                /* Decrease ref_count for removed request. */
-               request->device = tape_put_device(device);
+               request->device = NULL;
+               tape_put_device(device);
                request->rc = -EIO;
                if (request->callback != NULL)
                        request->callback(request, request->callback_data);
                        tape_cleanup_device(device);
        }
 
-       if (dev_get_drvdata(&cdev->dev)) {
+       device = dev_get_drvdata(&cdev->dev);
+       if (device) {
                sysfs_remove_group(&cdev->dev.kobj, &tape_attr_group);
-               dev_set_drvdata(&cdev->dev, tape_put_device(dev_get_drvdata(&cdev->dev)));
+               dev_set_drvdata(&cdev->dev, NULL);
+               tape_put_device(device);
        }
 }
 
 {
        DBF_LH(6, "Free request %p\n", request);
 
-       if (request->device != NULL) {
-               request->device = tape_put_device(request->device);
-       }
+       if (request->device)
+               tape_put_device(request->device);
        kfree(request->cpdata);
        kfree(request->cpaddr);
        kfree(request);
        BUG_ON(request->status != TAPE_REQUEST_LONG_BUSY);
        DBF_LH(6, "%08x: Long busy timeout.\n", device->cdev_id);
        __tape_start_next_request(device);
-       device->lb_timeout.data = (unsigned long) tape_put_device(device);
+       device->lb_timeout.data = 0UL;
+       tape_put_device(device);
        spin_unlock_irq(get_ccwdev_lock(device->cdev));
 }
 
        }
 
        /* Increase use count of device for the added request. */
-       request->device = tape_get_device_reference(device);
+       request->device = tape_get_device(device);
 
        if (list_empty(&device->req_queue)) {
                /* No other requests are on the queue. Start this one. */
                if (req->status == TAPE_REQUEST_LONG_BUSY) {
                        DBF_EVENT(3, "(%08x): del timer\n", device->cdev_id);
                        if (del_timer(&device->lb_timeout)) {
-                               device->lb_timeout.data = (unsigned long)
-                                       tape_put_device(device);
+                               device->lb_timeout.data = 0UL;
+                               tape_put_device(device);
                                __tape_start_next_request(device);
                        }
                        return;
                        break;
                case TAPE_IO_LONG_BUSY:
                        device->lb_timeout.data =
-                               (unsigned long)tape_get_device_reference(device);
+                               (unsigned long) tape_get_device(device);
                        device->lb_timeout.expires = jiffies +
                                LONG_BUSY_TIMEOUT * HZ;
                        DBF_EVENT(3, "(%08x): add timer\n", device->cdev_id);
 EXPORT_SYMBOL(tape_generic_offline);
 EXPORT_SYMBOL(tape_generic_pm_suspend);
 EXPORT_SYMBOL(tape_put_device);
-EXPORT_SYMBOL(tape_get_device_reference);
+EXPORT_SYMBOL(tape_get_device);
 EXPORT_SYMBOL(tape_state_verbose);
 EXPORT_SYMBOL(tape_op_verbose);
 EXPORT_SYMBOL(tape_state_set);