aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_eckd.c
diff options
context:
space:
mode:
authorStefan Haberland <stefan.haberland@de.ibm.com>2012-01-18 12:03:41 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-01-18 12:03:42 -0500
commitf16330316321d1c388d13096f6858f5d2dac29dc (patch)
tree0dda4b86553b3e5881c8a53391f24210b17a2eb6 /drivers/s390/block/dasd_eckd.c
parentf9f8d02fae0dc47d8868fd069bb88d12f8d1d71f (diff)
[S390] dasd: revalidate server for new pathgroup
If a pathgroup is established we get an event and have to revalidate the server to propagate supported features like PAV and enable them. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd_eckd.c')
-rw-r--r--drivers/s390/block/dasd_eckd.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index 1b6e7ea9347f..70880be26015 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -1550,6 +1550,24 @@ static void dasd_eckd_validate_server(struct dasd_device *device)
1550 "returned rc=%d", private->uid.ssid, rc); 1550 "returned rc=%d", private->uid.ssid, rc);
1551} 1551}
1552 1552
1553/*
1554 * worker to do a validate server in case of a lost pathgroup
1555 */
1556static void dasd_eckd_do_validate_server(struct work_struct *work)
1557{
1558 struct dasd_device *device = container_of(work, struct dasd_device,
1559 kick_validate);
1560 dasd_eckd_validate_server(device);
1561 dasd_put_device(device);
1562}
1563
1564static void dasd_eckd_kick_validate_server(struct dasd_device *device)
1565{
1566 dasd_get_device(device);
1567 /* queue call to do_validate_server to the kernel event daemon. */
1568 schedule_work(&device->kick_validate);
1569}
1570
1553static u32 get_fcx_max_data(struct dasd_device *device) 1571static u32 get_fcx_max_data(struct dasd_device *device)
1554{ 1572{
1555#if defined(CONFIG_64BIT) 1573#if defined(CONFIG_64BIT)
@@ -1595,6 +1613,9 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
1595 int readonly; 1613 int readonly;
1596 unsigned long value; 1614 unsigned long value;
1597 1615
1616 /* setup work queue for validate server*/
1617 INIT_WORK(&device->kick_validate, dasd_eckd_do_validate_server);
1618
1598 if (!ccw_device_is_pathgroup(device->cdev)) { 1619 if (!ccw_device_is_pathgroup(device->cdev)) {
1599 dev_warn(&device->cdev->dev, 1620 dev_warn(&device->cdev->dev,
1600 "A channel path group could not be established\n"); 1621 "A channel path group could not be established\n");
@@ -4259,6 +4280,7 @@ static struct dasd_discipline dasd_eckd_discipline = {
4259 .restore = dasd_eckd_restore_device, 4280 .restore = dasd_eckd_restore_device,
4260 .reload = dasd_eckd_reload_device, 4281 .reload = dasd_eckd_reload_device,
4261 .get_uid = dasd_eckd_get_uid, 4282 .get_uid = dasd_eckd_get_uid,
4283 .kick_validate = dasd_eckd_kick_validate_server,
4262}; 4284};
4263 4285
4264static int __init 4286static int __init