diff options
author | Peter Oberparleiter | 2015-05-11 13:08:05 +0200 |
---|---|---|
committer | Martin Schwidefsky | 2015-05-13 09:58:19 +0200 |
commit | 7c53fcb39fddb59a9e32c10e96133049ed90930b (patch) | |
tree | b5d457aae291f0596e6e13d485796ad032cd30d2 /drivers/s390 | |
parent | 78335a30e0ea2ac79db5a9915fdf6edd9e8ded9b (diff) |
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>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 57fd66357b95..1aec8ff0b587 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -38,6 +38,8 @@ */ #define DASD_CHANQ_MAX_SIZE 4 +#define DASD_DIAG_MOD "dasd_diag_mod" + /* * SECTION: exported variables of dasd.c */ @@ -3300,6 +3302,21 @@ int dasd_generic_set_online(struct ccw_device *cdev, discipline = base_discipline; if (device->features & DASD_FEATURE_USEDIAG) { 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", dev_name(&cdev->dev)); dasd_delete_device(device); |