Merge tag 'keystone-dts' of git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh...
[cascardo/linux.git] / drivers / s390 / block / dasd.c
index 1eef0f5..5df05f2 100644 (file)
  * SECTION: exported variables of dasd.c
  */
 debug_info_t *dasd_debug_area;
+EXPORT_SYMBOL(dasd_debug_area);
 static struct dentry *dasd_debugfs_root_entry;
 struct dasd_discipline *dasd_diag_discipline_pointer;
+EXPORT_SYMBOL(dasd_diag_discipline_pointer);
 void dasd_int_handler(struct ccw_device *, unsigned long, struct irb *);
 
 MODULE_AUTHOR("Holger Smolinski <Holger.Smolinski@de.ibm.com>");
@@ -164,6 +166,7 @@ struct dasd_block *dasd_alloc_block(void)
 
        return block;
 }
+EXPORT_SYMBOL_GPL(dasd_alloc_block);
 
 /*
  * Free memory of a device structure.
@@ -172,6 +175,7 @@ void dasd_free_block(struct dasd_block *block)
 {
        kfree(block);
 }
+EXPORT_SYMBOL_GPL(dasd_free_block);
 
 /*
  * Make a new device known to the system.
@@ -281,10 +285,15 @@ static int dasd_state_basic_to_known(struct dasd_device *device)
 {
        int rc;
 
+       if (device->discipline->basic_to_known) {
+               rc = device->discipline->basic_to_known(device);
+               if (rc)
+                       return rc;
+       }
+
        if (device->block) {
                dasd_profile_exit(&device->block->profile);
-               if (device->block->debugfs_dentry)
-                       debugfs_remove(device->block->debugfs_dentry);
+               debugfs_remove(device->block->debugfs_dentry);
                dasd_gendisk_free(device->block);
                dasd_block_clear_timer(device->block);
        }
@@ -293,9 +302,7 @@ static int dasd_state_basic_to_known(struct dasd_device *device)
                return rc;
        dasd_device_clear_timer(device);
        dasd_profile_exit(&device->profile);
-       if (device->debugfs_dentry)
-               debugfs_remove(device->debugfs_dentry);
-
+       debugfs_remove(device->debugfs_dentry);
        DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device);
        if (device->debug_area != NULL) {
                debug_unregister(device->debug_area);
@@ -374,11 +381,6 @@ static int dasd_state_ready_to_basic(struct dasd_device *device)
 {
        int rc;
 
-       if (device->discipline->ready_to_basic) {
-               rc = device->discipline->ready_to_basic(device);
-               if (rc)
-                       return rc;
-       }
        device->state = DASD_STATE_BASIC;
        if (device->block) {
                struct dasd_block *block = device->block;
@@ -579,6 +581,7 @@ void dasd_kick_device(struct dasd_device *device)
        /* queue call to dasd_kick_device to the kernel event daemon. */
        schedule_work(&device->kick_work);
 }
+EXPORT_SYMBOL(dasd_kick_device);
 
 /*
  * dasd_reload_device will schedule a call do do_reload_device to the kernel
@@ -639,6 +642,7 @@ void dasd_set_target_state(struct dasd_device *device, int target)
        mutex_unlock(&device->state_mutex);
        dasd_put_device(device);
 }
+EXPORT_SYMBOL(dasd_set_target_state);
 
 /*
  * Enable devices with device numbers in [from..to].
@@ -661,6 +665,7 @@ void dasd_enable_device(struct dasd_device *device)
        if (device->discipline->kick_validate)
                device->discipline->kick_validate(device);
 }
+EXPORT_SYMBOL(dasd_enable_device);
 
 /*
  * SECTION: device operation (interrupt handler, start i/o, term i/o ...)
@@ -972,37 +977,37 @@ static void dasd_stats_seq_print(struct seq_file *m,
        seq_printf(m, "total_sectors %u\n", data->dasd_io_sects);
        seq_printf(m, "total_pav %u\n", data->dasd_io_alias);
        seq_printf(m, "total_hpf %u\n", data->dasd_io_tpm);
-       seq_printf(m, "histogram_sectors ");
+       seq_puts(m, "histogram_sectors ");
        dasd_stats_array(m, data->dasd_io_secs);
-       seq_printf(m, "histogram_io_times ");
+       seq_puts(m, "histogram_io_times ");
        dasd_stats_array(m, data->dasd_io_times);
-       seq_printf(m, "histogram_io_times_weighted ");
+       seq_puts(m, "histogram_io_times_weighted ");
        dasd_stats_array(m, data->dasd_io_timps);
-       seq_printf(m, "histogram_time_build_to_ssch ");
+       seq_puts(m, "histogram_time_build_to_ssch ");
        dasd_stats_array(m, data->dasd_io_time1);
-       seq_printf(m, "histogram_time_ssch_to_irq ");
+       seq_puts(m, "histogram_time_ssch_to_irq ");
        dasd_stats_array(m, data->dasd_io_time2);
-       seq_printf(m, "histogram_time_ssch_to_irq_weighted ");
+       seq_puts(m, "histogram_time_ssch_to_irq_weighted ");
        dasd_stats_array(m, data->dasd_io_time2ps);
-       seq_printf(m, "histogram_time_irq_to_end ");
+       seq_puts(m, "histogram_time_irq_to_end ");
        dasd_stats_array(m, data->dasd_io_time3);
-       seq_printf(m, "histogram_ccw_queue_length ");
+       seq_puts(m, "histogram_ccw_queue_length ");
        dasd_stats_array(m, data->dasd_io_nr_req);
        seq_printf(m, "total_read_requests %u\n", data->dasd_read_reqs);
        seq_printf(m, "total_read_sectors %u\n", data->dasd_read_sects);
        seq_printf(m, "total_read_pav %u\n", data->dasd_read_alias);
        seq_printf(m, "total_read_hpf %u\n", data->dasd_read_tpm);
-       seq_printf(m, "histogram_read_sectors ");
+       seq_puts(m, "histogram_read_sectors ");
        dasd_stats_array(m, data->dasd_read_secs);
-       seq_printf(m, "histogram_read_times ");
+       seq_puts(m, "histogram_read_times ");
        dasd_stats_array(m, data->dasd_read_times);
-       seq_printf(m, "histogram_read_time_build_to_ssch ");
+       seq_puts(m, "histogram_read_time_build_to_ssch ");
        dasd_stats_array(m, data->dasd_read_time1);
-       seq_printf(m, "histogram_read_time_ssch_to_irq ");
+       seq_puts(m, "histogram_read_time_ssch_to_irq ");
        dasd_stats_array(m, data->dasd_read_time2);
-       seq_printf(m, "histogram_read_time_irq_to_end ");
+       seq_puts(m, "histogram_read_time_irq_to_end ");
        dasd_stats_array(m, data->dasd_read_time3);
-       seq_printf(m, "histogram_read_ccw_queue_length ");
+       seq_puts(m, "histogram_read_ccw_queue_length ");
        dasd_stats_array(m, data->dasd_read_nr_req);
 }
 
@@ -1016,7 +1021,7 @@ static int dasd_stats_show(struct seq_file *m, void *v)
        data = profile->data;
        if (!data) {
                spin_unlock_bh(&profile->lock);
-               seq_printf(m, "disabled\n");
+               seq_puts(m, "disabled\n");
                return 0;
        }
        dasd_stats_seq_print(m, data);
@@ -1069,7 +1074,7 @@ static ssize_t dasd_stats_global_write(struct file *file,
 static int dasd_stats_global_show(struct seq_file *m, void *v)
 {
        if (!dasd_global_profile_level) {
-               seq_printf(m, "disabled\n");
+               seq_puts(m, "disabled\n");
                return 0;
        }
        dasd_stats_seq_print(m, &dasd_global_profile_data);
@@ -1111,23 +1116,17 @@ static void dasd_profile_init(struct dasd_profile *profile,
 static void dasd_profile_exit(struct dasd_profile *profile)
 {
        dasd_profile_off(profile);
-       if (profile->dentry) {
-               debugfs_remove(profile->dentry);
-               profile->dentry = NULL;
-       }
+       debugfs_remove(profile->dentry);
+       profile->dentry = NULL;
 }
 
 static void dasd_statistics_removeroot(void)
 {
        dasd_global_profile_level = DASD_PROFILE_OFF;
-       if (dasd_global_profile_dentry) {
-               debugfs_remove(dasd_global_profile_dentry);
-               dasd_global_profile_dentry = NULL;
-       }
-       if (dasd_debugfs_global_entry)
-               debugfs_remove(dasd_debugfs_global_entry);
-       if (dasd_debugfs_root_entry)
-               debugfs_remove(dasd_debugfs_root_entry);
+       debugfs_remove(dasd_global_profile_dentry);
+       dasd_global_profile_dentry = NULL;
+       debugfs_remove(dasd_debugfs_global_entry);
+       debugfs_remove(dasd_debugfs_root_entry);
 }
 
 static void dasd_statistics_createroot(void)
@@ -1178,7 +1177,7 @@ static void dasd_statistics_removeroot(void)
 
 int dasd_stats_generic_show(struct seq_file *m, void *v)
 {
-       seq_printf(m, "Statistics are not activated in this kernel\n");
+       seq_puts(m, "Statistics are not activated in this kernel\n");
        return 0;
 }
 
@@ -1243,6 +1242,7 @@ struct dasd_ccw_req *dasd_kmalloc_request(int magic, int cplength,
        dasd_get_device(device);
        return cqr;
 }
+EXPORT_SYMBOL(dasd_kmalloc_request);
 
 struct dasd_ccw_req *dasd_smalloc_request(int magic, int cplength,
                                          int datasize,
@@ -1282,6 +1282,7 @@ struct dasd_ccw_req *dasd_smalloc_request(int magic, int cplength,
        dasd_get_device(device);
        return cqr;
 }
+EXPORT_SYMBOL(dasd_smalloc_request);
 
 /*
  * Free memory of a channel program. This function needs to free all the
@@ -1304,6 +1305,7 @@ void dasd_kfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device)
        kfree(cqr);
        dasd_put_device(device);
 }
+EXPORT_SYMBOL(dasd_kfree_request);
 
 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device)
 {
@@ -1314,6 +1316,7 @@ void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device)
        spin_unlock_irqrestore(&device->mem_lock, flags);
        dasd_put_device(device);
 }
+EXPORT_SYMBOL(dasd_sfree_request);
 
 /*
  * Check discipline magic in cqr.
@@ -1391,6 +1394,7 @@ int dasd_term_IO(struct dasd_ccw_req *cqr)
        dasd_schedule_device_bh(device);
        return rc;
 }
+EXPORT_SYMBOL(dasd_term_IO);
 
 /*
  * Start the i/o. This start_IO can fail if the channel is really busy.
@@ -1509,6 +1513,7 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
        cqr->intrc = rc;
        return rc;
 }
+EXPORT_SYMBOL(dasd_start_IO);
 
 /*
  * Timeout function for dasd devices. This is used for different purposes
@@ -1541,6 +1546,7 @@ void dasd_device_set_timer(struct dasd_device *device, int expires)
        else
                mod_timer(&device->timer, jiffies + expires);
 }
+EXPORT_SYMBOL(dasd_device_set_timer);
 
 /*
  * Clear timeout for a device.
@@ -1549,6 +1555,7 @@ void dasd_device_clear_timer(struct dasd_device *device)
 {
        del_timer(&device->timer);
 }
+EXPORT_SYMBOL(dasd_device_clear_timer);
 
 static void dasd_handle_killed_request(struct ccw_device *cdev,
                                       unsigned long intparm)
@@ -1601,6 +1608,7 @@ void dasd_generic_handle_state_change(struct dasd_device *device)
        if (device->block)
                dasd_schedule_block_bh(device->block);
 }
+EXPORT_SYMBOL_GPL(dasd_generic_handle_state_change);
 
 /*
  * Interrupt handler for "normal" ssch-io based dasd devices.
@@ -1667,8 +1675,11 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
        if (cqr->status == DASD_CQR_CLEAR_PENDING &&
            scsw_fctl(&irb->scsw) & SCSW_FCTL_CLEAR_FUNC) {
                cqr->status = DASD_CQR_CLEARED;
+               if (cqr->callback_data == DASD_SLEEPON_START_TAG)
+                       cqr->callback_data = DASD_SLEEPON_END_TAG;
                dasd_device_clear_timer(device);
                wake_up(&dasd_flush_wq);
+               wake_up(&generic_waitq);
                dasd_schedule_device_bh(device);
                return;
        }
@@ -1722,6 +1733,7 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
                dasd_device_clear_timer(device);
        dasd_schedule_device_bh(device);
 }
+EXPORT_SYMBOL(dasd_int_handler);
 
 enum uc_todo dasd_generic_uc_handler(struct ccw_device *cdev, struct irb *irb)
 {
@@ -1995,6 +2007,7 @@ finished:
        __dasd_device_process_final_queue(device, &flush_queue);
        return rc;
 }
+EXPORT_SYMBOL_GPL(dasd_flush_device_queue);
 
 /*
  * Acquire the device lock and process queues for the device.
@@ -2034,6 +2047,7 @@ void dasd_schedule_device_bh(struct dasd_device *device)
        dasd_get_device(device);
        tasklet_hi_schedule(&device->tasklet);
 }
+EXPORT_SYMBOL(dasd_schedule_device_bh);
 
 void dasd_device_set_stop_bits(struct dasd_device *device, int bits)
 {
@@ -2066,6 +2080,7 @@ void dasd_add_request_head(struct dasd_ccw_req *cqr)
        dasd_schedule_device_bh(device);
        spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
 }
+EXPORT_SYMBOL(dasd_add_request_head);
 
 /*
  * Queue a request to the tail of the device ccw_queue.
@@ -2084,6 +2099,7 @@ void dasd_add_request_tail(struct dasd_ccw_req *cqr)
        dasd_schedule_device_bh(device);
        spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
 }
+EXPORT_SYMBOL(dasd_add_request_tail);
 
 /*
  * Wakeup helper for the 'sleep_on' functions.
@@ -2291,13 +2307,27 @@ retry:
 
        rc = 0;
        list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) {
-               if (__dasd_sleep_on_erp(cqr))
-                       rc = 1;
+               /*
+                * for alias devices simplify error recovery and
+                * return to upper layer
+                */
+               if (cqr->startdev != cqr->basedev &&
+                   (cqr->status == DASD_CQR_TERMINATED ||
+                    cqr->status == DASD_CQR_NEED_ERP))
+                       return -EAGAIN;
+               else {
+                       /* normal recovery for basedev IO */
+                       if (__dasd_sleep_on_erp(cqr)) {
+                               if (!cqr->status == DASD_CQR_TERMINATED &&
+                                   !cqr->status == DASD_CQR_NEED_ERP)
+                                       break;
+                               rc = 1;
+                       }
+               }
        }
        if (rc)
                goto retry;
 
-
        return 0;
 }
 
@@ -2309,6 +2339,7 @@ int dasd_sleep_on(struct dasd_ccw_req *cqr)
 {
        return _dasd_sleep_on(cqr, 0);
 }
+EXPORT_SYMBOL(dasd_sleep_on);
 
 /*
  * Start requests from a ccw_queue and wait for their completion.
@@ -2327,6 +2358,7 @@ int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr)
 {
        return _dasd_sleep_on(cqr, 1);
 }
+EXPORT_SYMBOL(dasd_sleep_on_interruptible);
 
 /*
  * Whoa nelly now it gets really hairy. For some functions (e.g. steal lock
@@ -2401,6 +2433,7 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)
 
        return rc;
 }
+EXPORT_SYMBOL(dasd_sleep_on_immediatly);
 
 /*
  * Cancels a request that was started with dasd_sleep_on_req.
@@ -2423,6 +2456,8 @@ int dasd_cancel_req(struct dasd_ccw_req *cqr)
        case DASD_CQR_QUEUED:
                /* request was not started - just set to cleared */
                cqr->status = DASD_CQR_CLEARED;
+               if (cqr->callback_data == DASD_SLEEPON_START_TAG)
+                       cqr->callback_data = DASD_SLEEPON_END_TAG;
                break;
        case DASD_CQR_IN_IO:
                /* request in IO - terminate IO and release again */
@@ -2442,6 +2477,7 @@ int dasd_cancel_req(struct dasd_ccw_req *cqr)
        dasd_schedule_device_bh(device);
        return rc;
 }
+EXPORT_SYMBOL(dasd_cancel_req);
 
 /*
  * SECTION: Operations of the dasd_block layer.
@@ -2475,6 +2511,7 @@ void dasd_block_set_timer(struct dasd_block *block, int expires)
        else
                mod_timer(&block->timer, jiffies + expires);
 }
+EXPORT_SYMBOL(dasd_block_set_timer);
 
 /*
  * Clear timeout for a dasd_block.
@@ -2483,6 +2520,7 @@ void dasd_block_clear_timer(struct dasd_block *block)
 {
        del_timer(&block->timer);
 }
+EXPORT_SYMBOL(dasd_block_clear_timer);
 
 /*
  * Process finished error recovery ccw.
@@ -2864,6 +2902,7 @@ void dasd_schedule_block_bh(struct dasd_block *block)
        dasd_get_device(block->base);
        tasklet_hi_schedule(&block->tasklet);
 }
+EXPORT_SYMBOL(dasd_schedule_block_bh);
 
 
 /*
@@ -3202,8 +3241,8 @@ static void dasd_generic_auto_online(void *data, async_cookie_t cookie)
 
        ret = ccw_device_set_online(cdev);
        if (ret)
-               pr_warning("%s: Setting the DASD online failed with rc=%d\n",
-                          dev_name(&cdev->dev), ret);
+               pr_warn("%s: Setting the DASD online failed with rc=%d\n",
+                       dev_name(&cdev->dev), ret);
 }
 
 /*
@@ -3234,6 +3273,7 @@ int dasd_generic_probe(struct ccw_device *cdev,
                async_schedule(dasd_generic_auto_online, cdev);
        return 0;
 }
+EXPORT_SYMBOL_GPL(dasd_generic_probe);
 
 /*
  * This will one day be called from a global not_oper handler.
@@ -3276,6 +3316,7 @@ void dasd_generic_remove(struct ccw_device *cdev)
 
        dasd_remove_sysfs_files(cdev);
 }
+EXPORT_SYMBOL_GPL(dasd_generic_remove);
 
 /*
  * Activate a device. This is called from dasd_{eckd,fba}_probe() when either
@@ -3298,9 +3339,8 @@ int dasd_generic_set_online(struct ccw_device *cdev,
        discipline = base_discipline;
        if (device->features & DASD_FEATURE_USEDIAG) {
                if (!dasd_diag_discipline_pointer) {
-                       pr_warning("%s Setting the DASD online failed because "
-                                  "of missing DIAG discipline\n",
-                                  dev_name(&cdev->dev));
+                       pr_warn("%s Setting the DASD online failed because of missing DIAG discipline\n",
+                               dev_name(&cdev->dev));
                        dasd_delete_device(device);
                        return -ENODEV;
                }
@@ -3321,9 +3361,8 @@ int dasd_generic_set_online(struct ccw_device *cdev,
        /* check_device will allocate block device if necessary */
        rc = discipline->check_device(device);
        if (rc) {
-               pr_warning("%s Setting the DASD online with discipline %s "
-                          "failed with rc=%i\n",
-                          dev_name(&cdev->dev), discipline->name, rc);
+               pr_warn("%s Setting the DASD online with discipline %s failed with rc=%i\n",
+                       dev_name(&cdev->dev), discipline->name, rc);
                module_put(discipline->owner);
                module_put(base_discipline->owner);
                dasd_delete_device(device);
@@ -3332,8 +3371,8 @@ int dasd_generic_set_online(struct ccw_device *cdev,
 
        dasd_set_target_state(device, DASD_STATE_ONLINE);
        if (device->state <= DASD_STATE_KNOWN) {
-               pr_warning("%s Setting the DASD online failed because of a "
-                          "missing discipline\n", dev_name(&cdev->dev));
+               pr_warn("%s Setting the DASD online failed because of a missing discipline\n",
+                       dev_name(&cdev->dev));
                rc = -ENODEV;
                dasd_set_target_state(device, DASD_STATE_NEW);
                if (device->block)
@@ -3348,6 +3387,7 @@ int dasd_generic_set_online(struct ccw_device *cdev,
        dasd_put_device(device);
        return rc;
 }
+EXPORT_SYMBOL_GPL(dasd_generic_set_online);
 
 int dasd_generic_set_offline(struct ccw_device *cdev)
 {
@@ -3371,13 +3411,11 @@ int dasd_generic_set_offline(struct ccw_device *cdev)
                open_count = atomic_read(&device->block->open_count);
                if (open_count > max_count) {
                        if (open_count > 0)
-                               pr_warning("%s: The DASD cannot be set offline "
-                                          "with open count %i\n",
-                                          dev_name(&cdev->dev), open_count);
+                               pr_warn("%s: The DASD cannot be set offline with open count %i\n",
+                                       dev_name(&cdev->dev), open_count);
                        else
-                               pr_warning("%s: The DASD cannot be set offline "
-                                          "while it is in use\n",
-                                          dev_name(&cdev->dev));
+                               pr_warn("%s: The DASD cannot be set offline while it is in use\n",
+                                       dev_name(&cdev->dev));
                        clear_bit(DASD_FLAG_OFFLINE, &device->flags);
                        dasd_put_device(device);
                        return -EBUSY;
@@ -3451,6 +3489,7 @@ interrupted:
        dasd_put_device(device);
        return rc;
 }
+EXPORT_SYMBOL_GPL(dasd_generic_set_offline);
 
 int dasd_generic_last_path_gone(struct dasd_device *device)
 {
@@ -3492,6 +3531,10 @@ int dasd_generic_path_operational(struct dasd_device *device)
        dasd_schedule_device_bh(device);
        if (device->block)
                dasd_schedule_block_bh(device->block);
+
+       if (!device->stopped)
+               wake_up(&generic_waitq);
+
        return 1;
 }
 EXPORT_SYMBOL_GPL(dasd_generic_path_operational);
@@ -3523,6 +3566,7 @@ int dasd_generic_notify(struct ccw_device *cdev, int event)
        dasd_put_device(device);
        return ret;
 }
+EXPORT_SYMBOL_GPL(dasd_generic_notify);
 
 void dasd_generic_path_event(struct ccw_device *cdev, int *path_event)
 {
@@ -3872,39 +3916,3 @@ failed:
 
 module_init(dasd_init);
 module_exit(dasd_exit);
-
-EXPORT_SYMBOL(dasd_debug_area);
-EXPORT_SYMBOL(dasd_diag_discipline_pointer);
-
-EXPORT_SYMBOL(dasd_add_request_head);
-EXPORT_SYMBOL(dasd_add_request_tail);
-EXPORT_SYMBOL(dasd_cancel_req);
-EXPORT_SYMBOL(dasd_device_clear_timer);
-EXPORT_SYMBOL(dasd_block_clear_timer);
-EXPORT_SYMBOL(dasd_enable_device);
-EXPORT_SYMBOL(dasd_int_handler);
-EXPORT_SYMBOL(dasd_kfree_request);
-EXPORT_SYMBOL(dasd_kick_device);
-EXPORT_SYMBOL(dasd_kmalloc_request);
-EXPORT_SYMBOL(dasd_schedule_device_bh);
-EXPORT_SYMBOL(dasd_schedule_block_bh);
-EXPORT_SYMBOL(dasd_set_target_state);
-EXPORT_SYMBOL(dasd_device_set_timer);
-EXPORT_SYMBOL(dasd_block_set_timer);
-EXPORT_SYMBOL(dasd_sfree_request);
-EXPORT_SYMBOL(dasd_sleep_on);
-EXPORT_SYMBOL(dasd_sleep_on_immediatly);
-EXPORT_SYMBOL(dasd_sleep_on_interruptible);
-EXPORT_SYMBOL(dasd_smalloc_request);
-EXPORT_SYMBOL(dasd_start_IO);
-EXPORT_SYMBOL(dasd_term_IO);
-
-EXPORT_SYMBOL_GPL(dasd_generic_probe);
-EXPORT_SYMBOL_GPL(dasd_generic_remove);
-EXPORT_SYMBOL_GPL(dasd_generic_notify);
-EXPORT_SYMBOL_GPL(dasd_generic_set_online);
-EXPORT_SYMBOL_GPL(dasd_generic_set_offline);
-EXPORT_SYMBOL_GPL(dasd_generic_handle_state_change);
-EXPORT_SYMBOL_GPL(dasd_flush_device_queue);
-EXPORT_SYMBOL_GPL(dasd_alloc_block);
-EXPORT_SYMBOL_GPL(dasd_free_block);