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:
Родитель
78335a30e0
Коммит
7c53fcb39f
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче