hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/s390/block/dasd_eckd.c
....@@ -103,7 +103,7 @@
103103 };
104104
105105 /* definitions for the path verification worker */
106
-struct path_verification_work_data {
106
+struct pe_handler_work_data {
107107 struct work_struct worker;
108108 struct dasd_device *device;
109109 struct dasd_ccw_req cqr;
....@@ -112,8 +112,8 @@
112112 int isglobal;
113113 __u8 tbvpm;
114114 };
115
-static struct path_verification_work_data *path_verification_worker;
116
-static DEFINE_MUTEX(dasd_path_verification_mutex);
115
+static struct pe_handler_work_data *pe_handler_worker;
116
+static DEFINE_MUTEX(dasd_pe_handler_mutex);
117117
118118 struct check_attention_work_data {
119119 struct work_struct worker;
....@@ -1219,7 +1219,7 @@
12191219 }
12201220
12211221 static int rebuild_device_uid(struct dasd_device *device,
1222
- struct path_verification_work_data *data)
1222
+ struct pe_handler_work_data *data)
12231223 {
12241224 struct dasd_eckd_private *private = device->private;
12251225 __u8 lpm, opm = dasd_path_get_opm(device);
....@@ -1257,10 +1257,9 @@
12571257 return rc;
12581258 }
12591259
1260
-static void do_path_verification_work(struct work_struct *work)
1260
+static void dasd_eckd_path_available_action(struct dasd_device *device,
1261
+ struct pe_handler_work_data *data)
12611262 {
1262
- struct path_verification_work_data *data;
1263
- struct dasd_device *device;
12641263 struct dasd_eckd_private path_private;
12651264 struct dasd_uid *uid;
12661265 __u8 path_rcd_buf[DASD_ECKD_RCD_DATA_SIZE];
....@@ -1269,19 +1268,6 @@
12691268 char print_uid[60];
12701269 int rc;
12711270
1272
- data = container_of(work, struct path_verification_work_data, worker);
1273
- device = data->device;
1274
-
1275
- /* delay path verification until device was resumed */
1276
- if (test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
1277
- schedule_work(work);
1278
- return;
1279
- }
1280
- /* check if path verification already running and delay if so */
1281
- if (test_and_set_bit(DASD_FLAG_PATH_VERIFY, &device->flags)) {
1282
- schedule_work(work);
1283
- return;
1284
- }
12851271 opm = 0;
12861272 npm = 0;
12871273 ppm = 0;
....@@ -1418,30 +1404,54 @@
14181404 dasd_path_add_nohpfpm(device, hpfpm);
14191405 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
14201406 }
1407
+}
1408
+
1409
+static void do_pe_handler_work(struct work_struct *work)
1410
+{
1411
+ struct pe_handler_work_data *data;
1412
+ struct dasd_device *device;
1413
+
1414
+ data = container_of(work, struct pe_handler_work_data, worker);
1415
+ device = data->device;
1416
+
1417
+ /* delay path verification until device was resumed */
1418
+ if (test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
1419
+ schedule_work(work);
1420
+ return;
1421
+ }
1422
+ /* check if path verification already running and delay if so */
1423
+ if (test_and_set_bit(DASD_FLAG_PATH_VERIFY, &device->flags)) {
1424
+ schedule_work(work);
1425
+ return;
1426
+ }
1427
+
1428
+ dasd_eckd_path_available_action(device, data);
1429
+
14211430 clear_bit(DASD_FLAG_PATH_VERIFY, &device->flags);
14221431 dasd_put_device(device);
14231432 if (data->isglobal)
1424
- mutex_unlock(&dasd_path_verification_mutex);
1433
+ mutex_unlock(&dasd_pe_handler_mutex);
14251434 else
14261435 kfree(data);
14271436 }
14281437
1429
-static int dasd_eckd_verify_path(struct dasd_device *device, __u8 lpm)
1438
+static int dasd_eckd_pe_handler(struct dasd_device *device, __u8 lpm)
14301439 {
1431
- struct path_verification_work_data *data;
1440
+ struct pe_handler_work_data *data;
14321441
14331442 data = kmalloc(sizeof(*data), GFP_ATOMIC | GFP_DMA);
14341443 if (!data) {
1435
- if (mutex_trylock(&dasd_path_verification_mutex)) {
1436
- data = path_verification_worker;
1444
+ if (mutex_trylock(&dasd_pe_handler_mutex)) {
1445
+ data = pe_handler_worker;
14371446 data->isglobal = 1;
1438
- } else
1447
+ } else {
14391448 return -ENOMEM;
1449
+ }
14401450 } else {
14411451 memset(data, 0, sizeof(*data));
14421452 data->isglobal = 0;
14431453 }
1444
- INIT_WORK(&data->worker, do_path_verification_work);
1454
+ INIT_WORK(&data->worker, do_pe_handler_work);
14451455 dasd_get_device(device);
14461456 data->device = device;
14471457 data->tbvpm = lpm;
....@@ -6694,7 +6704,7 @@
66946704 .check_device = dasd_eckd_check_characteristics,
66956705 .uncheck_device = dasd_eckd_uncheck_device,
66966706 .do_analysis = dasd_eckd_do_analysis,
6697
- .verify_path = dasd_eckd_verify_path,
6707
+ .pe_handler = dasd_eckd_pe_handler,
66986708 .basic_to_ready = dasd_eckd_basic_to_ready,
66996709 .online_to_ready = dasd_eckd_online_to_ready,
67006710 .basic_to_known = dasd_eckd_basic_to_known,
....@@ -6753,18 +6763,20 @@
67536763 return -ENOMEM;
67546764 dasd_vol_info_req = kmalloc(sizeof(*dasd_vol_info_req),
67556765 GFP_KERNEL | GFP_DMA);
6756
- if (!dasd_vol_info_req)
6766
+ if (!dasd_vol_info_req) {
6767
+ kfree(dasd_reserve_req);
67576768 return -ENOMEM;
6758
- path_verification_worker = kmalloc(sizeof(*path_verification_worker),
6759
- GFP_KERNEL | GFP_DMA);
6760
- if (!path_verification_worker) {
6769
+ }
6770
+ pe_handler_worker = kmalloc(sizeof(*pe_handler_worker),
6771
+ GFP_KERNEL | GFP_DMA);
6772
+ if (!pe_handler_worker) {
67616773 kfree(dasd_reserve_req);
67626774 kfree(dasd_vol_info_req);
67636775 return -ENOMEM;
67646776 }
67656777 rawpadpage = (void *)__get_free_page(GFP_KERNEL);
67666778 if (!rawpadpage) {
6767
- kfree(path_verification_worker);
6779
+ kfree(pe_handler_worker);
67686780 kfree(dasd_reserve_req);
67696781 kfree(dasd_vol_info_req);
67706782 return -ENOMEM;
....@@ -6773,7 +6785,7 @@
67736785 if (!ret)
67746786 wait_for_device_probe();
67756787 else {
6776
- kfree(path_verification_worker);
6788
+ kfree(pe_handler_worker);
67776789 kfree(dasd_reserve_req);
67786790 kfree(dasd_vol_info_req);
67796791 free_page((unsigned long)rawpadpage);
....@@ -6785,7 +6797,7 @@
67856797 dasd_eckd_cleanup(void)
67866798 {
67876799 ccw_driver_unregister(&dasd_eckd_driver);
6788
- kfree(path_verification_worker);
6800
+ kfree(pe_handler_worker);
67896801 kfree(dasd_reserve_req);
67906802 free_page((unsigned long)rawpadpage);
67916803 }