s390/dasd: Enable automatic loading of dasd_diag_mod

Enabling a DASD that was configured to use the DIAG250 access method
while the corresponding kernel module dasd_diag_mod has not been loaded
fails with an error message. To fix this, users need to manually load
the dasd_diag_mod module.

This procedure can be simplified by automatically loading the
dasd_diag_mod from within the kernel when a DASD configured for DIAG250
is set online.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Peter Oberparleiter 2015-05-11 13:08:05 +02:00 коммит произвёл Martin Schwidefsky
Родитель 78335a30e0
Коммит 7c53fcb39f
1 изменённых файлов: 17 добавлений и 0 удалений

Просмотреть файл

@ -38,6 +38,8 @@
*/ */
#define DASD_CHANQ_MAX_SIZE 4 #define DASD_CHANQ_MAX_SIZE 4
#define DASD_DIAG_MOD "dasd_diag_mod"
/* /*
* SECTION: exported variables of dasd.c * SECTION: exported variables of dasd.c
*/ */
@ -3300,6 +3302,21 @@ int dasd_generic_set_online(struct ccw_device *cdev,
discipline = base_discipline; discipline = base_discipline;
if (device->features & DASD_FEATURE_USEDIAG) { if (device->features & DASD_FEATURE_USEDIAG) {
if (!dasd_diag_discipline_pointer) { if (!dasd_diag_discipline_pointer) {
/* Try to load the required module. */
rc = request_module(DASD_DIAG_MOD);
if (rc) {
pr_warn("%s Setting the DASD online failed "
"because the required module %s "
"could not be loaded (rc=%d)\n",
dev_name(&cdev->dev), DASD_DIAG_MOD,
rc);
dasd_delete_device(device);
return -ENODEV;
}
}
/* Module init could have failed, so check again here after
* request_module(). */
if (!dasd_diag_discipline_pointer) {
pr_warn("%s Setting the DASD online failed because of missing DIAG discipline\n", pr_warn("%s Setting the DASD online failed because of missing DIAG discipline\n",
dev_name(&cdev->dev)); dev_name(&cdev->dev));
dasd_delete_device(device); dasd_delete_device(device);