aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_eckd.c
diff options
context:
space:
mode:
authorJan Höppner <hoeppner@linux.ibm.com>2020-10-08 15:13:36 +0200
committerJens Axboe <axboe@kernel.dk>2020-11-16 08:14:38 -0700
commit4d063e646b4bfe8e74c0b4b78bf11c3a7b5d962a (patch)
tree3799c1d219b80daceb3f7dafbe1e0598db2974b4 /drivers/s390/block/dasd_eckd.c
parents390/dasd: Prepare for additional path event handling (diff)
downloadlinux-dev-4d063e646b4bfe8e74c0b4b78bf11c3a7b5d962a.tar.xz
linux-dev-4d063e646b4bfe8e74c0b4b78bf11c3a7b5d962a.zip
s390/dasd: Process FCES path event notification
If the Fibre Channel Endpoint-Security status of a path changes, a corresponding path event is received from the CIO layer. Process this event by re-reading the FCES information. As the information is retrieved for all paths on a single CU in one call, the internal status can also be updated for all paths and no processing per path is necessary. Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com> Signed-off-by: Stefan Haberland <sth@linux.ibm.com> Reviewed-by: Stefan Haberland <sth@linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/s390/block/dasd_eckd.c')
-rw-r--r--drivers/s390/block/dasd_eckd.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index 2e1cfacbf4d8..0d319c21c287 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -111,6 +111,7 @@ struct pe_handler_work_data {
__u8 rcd_buffer[DASD_ECKD_RCD_DATA_SIZE];
int isglobal;
__u8 tbvpm;
+ __u8 fcsecpm;
};
static struct pe_handler_work_data *pe_handler_worker;
static DEFINE_MUTEX(dasd_pe_handler_mutex);
@@ -1466,7 +1467,10 @@ static void do_pe_handler_work(struct work_struct *work)
return;
}
- dasd_eckd_path_available_action(device, data);
+ if (data->tbvpm)
+ dasd_eckd_path_available_action(device, data);
+ if (data->fcsecpm)
+ dasd_eckd_read_fc_security(device);
clear_bit(DASD_FLAG_PATH_VERIFY, &device->flags);
dasd_put_device(device);
@@ -1476,7 +1480,8 @@ static void do_pe_handler_work(struct work_struct *work)
kfree(data);
}
-static int dasd_eckd_pe_handler(struct dasd_device *device, __u8 lpm)
+static int dasd_eckd_pe_handler(struct dasd_device *device,
+ __u8 tbvpm, __u8 fcsecpm)
{
struct pe_handler_work_data *data;
@@ -1495,7 +1500,8 @@ static int dasd_eckd_pe_handler(struct dasd_device *device, __u8 lpm)
INIT_WORK(&data->worker, do_pe_handler_work);
dasd_get_device(device);
data->device = device;
- data->tbvpm = lpm;
+ data->tbvpm = tbvpm;
+ data->fcsecpm = fcsecpm;
schedule_work(&data->worker);
return 0;
}