Linux-libre 5.0.14-gnu
[librecmc/linux-libre.git] / drivers / s390 / block / dasd_alias.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * PAV alias management for the DASD ECKD discipline
4  *
5  * Copyright IBM Corp. 2007
6  * Author(s): Stefan Weinhuber <wein@de.ibm.com>
7  */
8
9 #define KMSG_COMPONENT "dasd-eckd"
10
11 #include <linux/list.h>
12 #include <linux/slab.h>
13 #include <asm/ebcdic.h>
14 #include "dasd_int.h"
15 #include "dasd_eckd.h"
16
17 #ifdef PRINTK_HEADER
18 #undef PRINTK_HEADER
19 #endif                          /* PRINTK_HEADER */
20 #define PRINTK_HEADER "dasd(eckd):"
21
22
23 /*
24  * General concept of alias management:
25  * - PAV and DASD alias management is specific to the eckd discipline.
26  * - A device is connected to an lcu as long as the device exists.
27  *   dasd_alias_make_device_known_to_lcu will be called wenn the
28  *   device is checked by the eckd discipline and
29  *   dasd_alias_disconnect_device_from_lcu will be called
30  *   before the device is deleted.
31  * - The dasd_alias_add_device / dasd_alias_remove_device
32  *   functions mark the point when a device is 'ready for service'.
33  * - A summary unit check is a rare occasion, but it is mandatory to
34  *   support it. It requires some complex recovery actions before the
35  *   devices can be used again (see dasd_alias_handle_summary_unit_check).
36  * - dasd_alias_get_start_dev will find an alias device that can be used
37  *   instead of the base device and does some (very simple) load balancing.
38  *   This is the function that gets called for each I/O, so when improving
39  *   something, this function should get faster or better, the rest has just
40  *   to be correct.
41  */
42
43
44 static void summary_unit_check_handling_work(struct work_struct *);
45 static void lcu_update_work(struct work_struct *);
46 static int _schedule_lcu_update(struct alias_lcu *, struct dasd_device *);
47
48 static struct alias_root aliastree = {
49         .serverlist = LIST_HEAD_INIT(aliastree.serverlist),
50         .lock = __SPIN_LOCK_UNLOCKED(aliastree.lock),
51 };
52
53 static struct alias_server *_find_server(struct dasd_uid *uid)
54 {
55         struct alias_server *pos;
56         list_for_each_entry(pos, &aliastree.serverlist, server) {
57                 if (!strncmp(pos->uid.vendor, uid->vendor,
58                              sizeof(uid->vendor))
59                     && !strncmp(pos->uid.serial, uid->serial,
60                                 sizeof(uid->serial)))
61                         return pos;
62         }
63         return NULL;
64 }
65
66 static struct alias_lcu *_find_lcu(struct alias_server *server,
67                                    struct dasd_uid *uid)
68 {
69         struct alias_lcu *pos;
70         list_for_each_entry(pos, &server->lculist, lcu) {
71                 if (pos->uid.ssid == uid->ssid)
72                         return pos;
73         }
74         return NULL;
75 }
76
77 static struct alias_pav_group *_find_group(struct alias_lcu *lcu,
78                                            struct dasd_uid *uid)
79 {
80         struct alias_pav_group *pos;
81         __u8 search_unit_addr;
82
83         /* for hyper pav there is only one group */
84         if (lcu->pav == HYPER_PAV) {
85                 if (list_empty(&lcu->grouplist))
86                         return NULL;
87                 else
88                         return list_first_entry(&lcu->grouplist,
89                                                 struct alias_pav_group, group);
90         }
91
92         /* for base pav we have to find the group that matches the base */
93         if (uid->type == UA_BASE_DEVICE)
94                 search_unit_addr = uid->real_unit_addr;
95         else
96                 search_unit_addr = uid->base_unit_addr;
97         list_for_each_entry(pos, &lcu->grouplist, group) {
98                 if (pos->uid.base_unit_addr == search_unit_addr &&
99                     !strncmp(pos->uid.vduit, uid->vduit, sizeof(uid->vduit)))
100                         return pos;
101         }
102         return NULL;
103 }
104
105 static struct alias_server *_allocate_server(struct dasd_uid *uid)
106 {
107         struct alias_server *server;
108
109         server = kzalloc(sizeof(*server), GFP_KERNEL);
110         if (!server)
111                 return ERR_PTR(-ENOMEM);
112         memcpy(server->uid.vendor, uid->vendor, sizeof(uid->vendor));
113         memcpy(server->uid.serial, uid->serial, sizeof(uid->serial));
114         INIT_LIST_HEAD(&server->server);
115         INIT_LIST_HEAD(&server->lculist);
116         return server;
117 }
118
119 static void _free_server(struct alias_server *server)
120 {
121         kfree(server);
122 }
123
124 static struct alias_lcu *_allocate_lcu(struct dasd_uid *uid)
125 {
126         struct alias_lcu *lcu;
127
128         lcu = kzalloc(sizeof(*lcu), GFP_KERNEL);
129         if (!lcu)
130                 return ERR_PTR(-ENOMEM);
131         lcu->uac = kzalloc(sizeof(*(lcu->uac)), GFP_KERNEL | GFP_DMA);
132         if (!lcu->uac)
133                 goto out_err1;
134         lcu->rsu_cqr = kzalloc(sizeof(*lcu->rsu_cqr), GFP_KERNEL | GFP_DMA);
135         if (!lcu->rsu_cqr)
136                 goto out_err2;
137         lcu->rsu_cqr->cpaddr = kzalloc(sizeof(struct ccw1),
138                                        GFP_KERNEL | GFP_DMA);
139         if (!lcu->rsu_cqr->cpaddr)
140                 goto out_err3;
141         lcu->rsu_cqr->data = kzalloc(16, GFP_KERNEL | GFP_DMA);
142         if (!lcu->rsu_cqr->data)
143                 goto out_err4;
144
145         memcpy(lcu->uid.vendor, uid->vendor, sizeof(uid->vendor));
146         memcpy(lcu->uid.serial, uid->serial, sizeof(uid->serial));
147         lcu->uid.ssid = uid->ssid;
148         lcu->pav = NO_PAV;
149         lcu->flags = NEED_UAC_UPDATE | UPDATE_PENDING;
150         INIT_LIST_HEAD(&lcu->lcu);
151         INIT_LIST_HEAD(&lcu->inactive_devices);
152         INIT_LIST_HEAD(&lcu->active_devices);
153         INIT_LIST_HEAD(&lcu->grouplist);
154         INIT_WORK(&lcu->suc_data.worker, summary_unit_check_handling_work);
155         INIT_DELAYED_WORK(&lcu->ruac_data.dwork, lcu_update_work);
156         spin_lock_init(&lcu->lock);
157         init_completion(&lcu->lcu_setup);
158         return lcu;
159
160 out_err4:
161         kfree(lcu->rsu_cqr->cpaddr);
162 out_err3:
163         kfree(lcu->rsu_cqr);
164 out_err2:
165         kfree(lcu->uac);
166 out_err1:
167         kfree(lcu);
168         return ERR_PTR(-ENOMEM);
169 }
170
171 static void _free_lcu(struct alias_lcu *lcu)
172 {
173         kfree(lcu->rsu_cqr->data);
174         kfree(lcu->rsu_cqr->cpaddr);
175         kfree(lcu->rsu_cqr);
176         kfree(lcu->uac);
177         kfree(lcu);
178 }
179
180 /*
181  * This is the function that will allocate all the server and lcu data,
182  * so this function must be called first for a new device.
183  * If the return value is 1, the lcu was already known before, if it
184  * is 0, this is a new lcu.
185  * Negative return code indicates that something went wrong (e.g. -ENOMEM)
186  */
187 int dasd_alias_make_device_known_to_lcu(struct dasd_device *device)
188 {
189         struct dasd_eckd_private *private = device->private;
190         unsigned long flags;
191         struct alias_server *server, *newserver;
192         struct alias_lcu *lcu, *newlcu;
193         struct dasd_uid uid;
194
195         device->discipline->get_uid(device, &uid);
196         spin_lock_irqsave(&aliastree.lock, flags);
197         server = _find_server(&uid);
198         if (!server) {
199                 spin_unlock_irqrestore(&aliastree.lock, flags);
200                 newserver = _allocate_server(&uid);
201                 if (IS_ERR(newserver))
202                         return PTR_ERR(newserver);
203                 spin_lock_irqsave(&aliastree.lock, flags);
204                 server = _find_server(&uid);
205                 if (!server) {
206                         list_add(&newserver->server, &aliastree.serverlist);
207                         server = newserver;
208                 } else {
209                         /* someone was faster */
210                         _free_server(newserver);
211                 }
212         }
213
214         lcu = _find_lcu(server, &uid);
215         if (!lcu) {
216                 spin_unlock_irqrestore(&aliastree.lock, flags);
217                 newlcu = _allocate_lcu(&uid);
218                 if (IS_ERR(newlcu))
219                         return PTR_ERR(newlcu);
220                 spin_lock_irqsave(&aliastree.lock, flags);
221                 lcu = _find_lcu(server, &uid);
222                 if (!lcu) {
223                         list_add(&newlcu->lcu, &server->lculist);
224                         lcu = newlcu;
225                 } else {
226                         /* someone was faster */
227                         _free_lcu(newlcu);
228                 }
229         }
230         spin_lock(&lcu->lock);
231         list_add(&device->alias_list, &lcu->inactive_devices);
232         private->lcu = lcu;
233         spin_unlock(&lcu->lock);
234         spin_unlock_irqrestore(&aliastree.lock, flags);
235
236         return 0;
237 }
238
239 /*
240  * This function removes a device from the scope of alias management.
241  * The complicated part is to make sure that it is not in use by
242  * any of the workers. If necessary cancel the work.
243  */
244 void dasd_alias_disconnect_device_from_lcu(struct dasd_device *device)
245 {
246         struct dasd_eckd_private *private = device->private;
247         unsigned long flags;
248         struct alias_lcu *lcu;
249         struct alias_server *server;
250         int was_pending;
251         struct dasd_uid uid;
252
253         lcu = private->lcu;
254         /* nothing to do if already disconnected */
255         if (!lcu)
256                 return;
257         device->discipline->get_uid(device, &uid);
258         spin_lock_irqsave(&lcu->lock, flags);
259         list_del_init(&device->alias_list);
260         /* make sure that the workers don't use this device */
261         if (device == lcu->suc_data.device) {
262                 spin_unlock_irqrestore(&lcu->lock, flags);
263                 cancel_work_sync(&lcu->suc_data.worker);
264                 spin_lock_irqsave(&lcu->lock, flags);
265                 if (device == lcu->suc_data.device) {
266                         dasd_put_device(device);
267                         lcu->suc_data.device = NULL;
268                 }
269         }
270         was_pending = 0;
271         if (device == lcu->ruac_data.device) {
272                 spin_unlock_irqrestore(&lcu->lock, flags);
273                 was_pending = 1;
274                 cancel_delayed_work_sync(&lcu->ruac_data.dwork);
275                 spin_lock_irqsave(&lcu->lock, flags);
276                 if (device == lcu->ruac_data.device) {
277                         dasd_put_device(device);
278                         lcu->ruac_data.device = NULL;
279                 }
280         }
281         private->lcu = NULL;
282         spin_unlock_irqrestore(&lcu->lock, flags);
283
284         spin_lock_irqsave(&aliastree.lock, flags);
285         spin_lock(&lcu->lock);
286         if (list_empty(&lcu->grouplist) &&
287             list_empty(&lcu->active_devices) &&
288             list_empty(&lcu->inactive_devices)) {
289                 list_del(&lcu->lcu);
290                 spin_unlock(&lcu->lock);
291                 _free_lcu(lcu);
292                 lcu = NULL;
293         } else {
294                 if (was_pending)
295                         _schedule_lcu_update(lcu, NULL);
296                 spin_unlock(&lcu->lock);
297         }
298         server = _find_server(&uid);
299         if (server && list_empty(&server->lculist)) {
300                 list_del(&server->server);
301                 _free_server(server);
302         }
303         spin_unlock_irqrestore(&aliastree.lock, flags);
304 }
305
306 /*
307  * This function assumes that the unit address configuration stored
308  * in the lcu is up to date and will update the device uid before
309  * adding it to a pav group.
310  */
311
312 static int _add_device_to_lcu(struct alias_lcu *lcu,
313                               struct dasd_device *device,
314                               struct dasd_device *pos)
315 {
316
317         struct dasd_eckd_private *private = device->private;
318         struct alias_pav_group *group;
319         struct dasd_uid uid;
320
321         spin_lock(get_ccwdev_lock(device->cdev));
322         private->uid.type = lcu->uac->unit[private->uid.real_unit_addr].ua_type;
323         private->uid.base_unit_addr =
324                 lcu->uac->unit[private->uid.real_unit_addr].base_ua;
325         uid = private->uid;
326         spin_unlock(get_ccwdev_lock(device->cdev));
327         /* if we have no PAV anyway, we don't need to bother with PAV groups */
328         if (lcu->pav == NO_PAV) {
329                 list_move(&device->alias_list, &lcu->active_devices);
330                 return 0;
331         }
332         group = _find_group(lcu, &uid);
333         if (!group) {
334                 group = kzalloc(sizeof(*group), GFP_ATOMIC);
335                 if (!group)
336                         return -ENOMEM;
337                 memcpy(group->uid.vendor, uid.vendor, sizeof(uid.vendor));
338                 memcpy(group->uid.serial, uid.serial, sizeof(uid.serial));
339                 group->uid.ssid = uid.ssid;
340                 if (uid.type == UA_BASE_DEVICE)
341                         group->uid.base_unit_addr = uid.real_unit_addr;
342                 else
343                         group->uid.base_unit_addr = uid.base_unit_addr;
344                 memcpy(group->uid.vduit, uid.vduit, sizeof(uid.vduit));
345                 INIT_LIST_HEAD(&group->group);
346                 INIT_LIST_HEAD(&group->baselist);
347                 INIT_LIST_HEAD(&group->aliaslist);
348                 list_add(&group->group, &lcu->grouplist);
349         }
350         if (uid.type == UA_BASE_DEVICE)
351                 list_move(&device->alias_list, &group->baselist);
352         else
353                 list_move(&device->alias_list, &group->aliaslist);
354         private->pavgroup = group;
355         return 0;
356 };
357
358 static void _remove_device_from_lcu(struct alias_lcu *lcu,
359                                     struct dasd_device *device)
360 {
361         struct dasd_eckd_private *private = device->private;
362         struct alias_pav_group *group;
363
364         list_move(&device->alias_list, &lcu->inactive_devices);
365         group = private->pavgroup;
366         if (!group)
367                 return;
368         private->pavgroup = NULL;
369         if (list_empty(&group->baselist) && list_empty(&group->aliaslist)) {
370                 list_del(&group->group);
371                 kfree(group);
372                 return;
373         }
374         if (group->next == device)
375                 group->next = NULL;
376 };
377
378 static int
379 suborder_not_supported(struct dasd_ccw_req *cqr)
380 {
381         char *sense;
382         char reason;
383         char msg_format;
384         char msg_no;
385
386         sense = dasd_get_sense(&cqr->irb);
387         if (!sense)
388                 return 0;
389
390         reason = sense[0];
391         msg_format = (sense[7] & 0xF0);
392         msg_no = (sense[7] & 0x0F);
393
394         /* command reject, Format 0 MSG 4 - invalid parameter */
395         if ((reason == 0x80) && (msg_format == 0x00) && (msg_no == 0x04))
396                 return 1;
397
398         return 0;
399 }
400
401 static int read_unit_address_configuration(struct dasd_device *device,
402                                            struct alias_lcu *lcu)
403 {
404         struct dasd_psf_prssd_data *prssdp;
405         struct dasd_ccw_req *cqr;
406         struct ccw1 *ccw;
407         int rc;
408         unsigned long flags;
409
410         cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ + 1 /* RSSD */,
411                                    (sizeof(struct dasd_psf_prssd_data)),
412                                    device, NULL);
413         if (IS_ERR(cqr))
414                 return PTR_ERR(cqr);
415         cqr->startdev = device;
416         cqr->memdev = device;
417         clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
418         cqr->retries = 10;
419         cqr->expires = 20 * HZ;
420
421         /* Prepare for Read Subsystem Data */
422         prssdp = (struct dasd_psf_prssd_data *) cqr->data;
423         memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data));
424         prssdp->order = PSF_ORDER_PRSSD;
425         prssdp->suborder = 0x0e;        /* Read unit address configuration */
426         /* all other bytes of prssdp must be zero */
427
428         ccw = cqr->cpaddr;
429         ccw->cmd_code = DASD_ECKD_CCW_PSF;
430         ccw->count = sizeof(struct dasd_psf_prssd_data);
431         ccw->flags |= CCW_FLAG_CC;
432         ccw->cda = (__u32)(addr_t) prssdp;
433
434         /* Read Subsystem Data - feature codes */
435         memset(lcu->uac, 0, sizeof(*(lcu->uac)));
436
437         ccw++;
438         ccw->cmd_code = DASD_ECKD_CCW_RSSD;
439         ccw->count = sizeof(*(lcu->uac));
440         ccw->cda = (__u32)(addr_t) lcu->uac;
441
442         cqr->buildclk = get_tod_clock();
443         cqr->status = DASD_CQR_FILLED;
444
445         /* need to unset flag here to detect race with summary unit check */
446         spin_lock_irqsave(&lcu->lock, flags);
447         lcu->flags &= ~NEED_UAC_UPDATE;
448         spin_unlock_irqrestore(&lcu->lock, flags);
449
450         do {
451                 rc = dasd_sleep_on(cqr);
452                 if (rc && suborder_not_supported(cqr))
453                         return -EOPNOTSUPP;
454         } while (rc && (cqr->retries > 0));
455         if (rc) {
456                 spin_lock_irqsave(&lcu->lock, flags);
457                 lcu->flags |= NEED_UAC_UPDATE;
458                 spin_unlock_irqrestore(&lcu->lock, flags);
459         }
460         dasd_sfree_request(cqr, cqr->memdev);
461         return rc;
462 }
463
464 static int _lcu_update(struct dasd_device *refdev, struct alias_lcu *lcu)
465 {
466         unsigned long flags;
467         struct alias_pav_group *pavgroup, *tempgroup;
468         struct dasd_device *device, *tempdev;
469         int i, rc;
470         struct dasd_eckd_private *private;
471
472         spin_lock_irqsave(&lcu->lock, flags);
473         list_for_each_entry_safe(pavgroup, tempgroup, &lcu->grouplist, group) {
474                 list_for_each_entry_safe(device, tempdev, &pavgroup->baselist,
475                                          alias_list) {
476                         list_move(&device->alias_list, &lcu->active_devices);
477                         private = device->private;
478                         private->pavgroup = NULL;
479                 }
480                 list_for_each_entry_safe(device, tempdev, &pavgroup->aliaslist,
481                                          alias_list) {
482                         list_move(&device->alias_list, &lcu->active_devices);
483                         private = device->private;
484                         private->pavgroup = NULL;
485                 }
486                 list_del(&pavgroup->group);
487                 kfree(pavgroup);
488         }
489         spin_unlock_irqrestore(&lcu->lock, flags);
490
491         rc = read_unit_address_configuration(refdev, lcu);
492         if (rc)
493                 return rc;
494
495         spin_lock_irqsave(&lcu->lock, flags);
496         lcu->pav = NO_PAV;
497         for (i = 0; i < MAX_DEVICES_PER_LCU; ++i) {
498                 switch (lcu->uac->unit[i].ua_type) {
499                 case UA_BASE_PAV_ALIAS:
500                         lcu->pav = BASE_PAV;
501                         break;
502                 case UA_HYPER_PAV_ALIAS:
503                         lcu->pav = HYPER_PAV;
504                         break;
505                 }
506                 if (lcu->pav != NO_PAV)
507                         break;
508         }
509
510         list_for_each_entry_safe(device, tempdev, &lcu->active_devices,
511                                  alias_list) {
512                 _add_device_to_lcu(lcu, device, refdev);
513         }
514         spin_unlock_irqrestore(&lcu->lock, flags);
515         return 0;
516 }
517
518 static void lcu_update_work(struct work_struct *work)
519 {
520         struct alias_lcu *lcu;
521         struct read_uac_work_data *ruac_data;
522         struct dasd_device *device;
523         unsigned long flags;
524         int rc;
525
526         ruac_data = container_of(work, struct read_uac_work_data, dwork.work);
527         lcu = container_of(ruac_data, struct alias_lcu, ruac_data);
528         device = ruac_data->device;
529         rc = _lcu_update(device, lcu);
530         /*
531          * Need to check flags again, as there could have been another
532          * prepare_update or a new device a new device while we were still
533          * processing the data
534          */
535         spin_lock_irqsave(&lcu->lock, flags);
536         if ((rc && (rc != -EOPNOTSUPP)) || (lcu->flags & NEED_UAC_UPDATE)) {
537                 DBF_DEV_EVENT(DBF_WARNING, device, "could not update"
538                             " alias data in lcu (rc = %d), retry later", rc);
539                 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ))
540                         dasd_put_device(device);
541         } else {
542                 dasd_put_device(device);
543                 lcu->ruac_data.device = NULL;
544                 lcu->flags &= ~UPDATE_PENDING;
545         }
546         spin_unlock_irqrestore(&lcu->lock, flags);
547 }
548
549 static int _schedule_lcu_update(struct alias_lcu *lcu,
550                                 struct dasd_device *device)
551 {
552         struct dasd_device *usedev = NULL;
553         struct alias_pav_group *group;
554
555         lcu->flags |= NEED_UAC_UPDATE;
556         if (lcu->ruac_data.device) {
557                 /* already scheduled or running */
558                 return 0;
559         }
560         if (device && !list_empty(&device->alias_list))
561                 usedev = device;
562
563         if (!usedev && !list_empty(&lcu->grouplist)) {
564                 group = list_first_entry(&lcu->grouplist,
565                                          struct alias_pav_group, group);
566                 if (!list_empty(&group->baselist))
567                         usedev = list_first_entry(&group->baselist,
568                                                   struct dasd_device,
569                                                   alias_list);
570                 else if (!list_empty(&group->aliaslist))
571                         usedev = list_first_entry(&group->aliaslist,
572                                                   struct dasd_device,
573                                                   alias_list);
574         }
575         if (!usedev && !list_empty(&lcu->active_devices)) {
576                 usedev = list_first_entry(&lcu->active_devices,
577                                           struct dasd_device, alias_list);
578         }
579         /*
580          * if we haven't found a proper device yet, give up for now, the next
581          * device that will be set active will trigger an lcu update
582          */
583         if (!usedev)
584                 return -EINVAL;
585         dasd_get_device(usedev);
586         lcu->ruac_data.device = usedev;
587         if (!schedule_delayed_work(&lcu->ruac_data.dwork, 0))
588                 dasd_put_device(usedev);
589         return 0;
590 }
591
592 int dasd_alias_add_device(struct dasd_device *device)
593 {
594         struct dasd_eckd_private *private = device->private;
595         __u8 uaddr = private->uid.real_unit_addr;
596         struct alias_lcu *lcu = private->lcu;
597         unsigned long flags;
598         int rc;
599
600         rc = 0;
601         spin_lock_irqsave(&lcu->lock, flags);
602         /*
603          * Check if device and lcu type differ. If so, the uac data may be
604          * outdated and needs to be updated.
605          */
606         if (private->uid.type !=  lcu->uac->unit[uaddr].ua_type) {
607                 lcu->flags |= UPDATE_PENDING;
608                 DBF_DEV_EVENT(DBF_WARNING, device, "%s",
609                               "uid type mismatch - trigger rescan");
610         }
611         if (!(lcu->flags & UPDATE_PENDING)) {
612                 rc = _add_device_to_lcu(lcu, device, device);
613                 if (rc)
614                         lcu->flags |= UPDATE_PENDING;
615         }
616         if (lcu->flags & UPDATE_PENDING) {
617                 list_move(&device->alias_list, &lcu->active_devices);
618                 _schedule_lcu_update(lcu, device);
619         }
620         spin_unlock_irqrestore(&lcu->lock, flags);
621         return rc;
622 }
623
624 int dasd_alias_update_add_device(struct dasd_device *device)
625 {
626         struct dasd_eckd_private *private = device->private;
627
628         private->lcu->flags |= UPDATE_PENDING;
629         return dasd_alias_add_device(device);
630 }
631
632 int dasd_alias_remove_device(struct dasd_device *device)
633 {
634         struct dasd_eckd_private *private = device->private;
635         struct alias_lcu *lcu = private->lcu;
636         unsigned long flags;
637
638         /* nothing to do if already removed */
639         if (!lcu)
640                 return 0;
641         spin_lock_irqsave(&lcu->lock, flags);
642         _remove_device_from_lcu(lcu, device);
643         spin_unlock_irqrestore(&lcu->lock, flags);
644         return 0;
645 }
646
647 struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
648 {
649         struct dasd_eckd_private *alias_priv, *private = base_device->private;
650         struct alias_pav_group *group = private->pavgroup;
651         struct alias_lcu *lcu = private->lcu;
652         struct dasd_device *alias_device;
653         unsigned long flags;
654
655         if (!group || !lcu)
656                 return NULL;
657         if (lcu->pav == NO_PAV ||
658             lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING))
659                 return NULL;
660         if (unlikely(!(private->features.feature[8] & 0x01))) {
661                 /*
662                  * PAV enabled but prefix not, very unlikely
663                  * seems to be a lost pathgroup
664                  * use base device to do IO
665                  */
666                 DBF_DEV_EVENT(DBF_ERR, base_device, "%s",
667                               "Prefix not enabled with PAV enabled\n");
668                 return NULL;
669         }
670
671         spin_lock_irqsave(&lcu->lock, flags);
672         alias_device = group->next;
673         if (!alias_device) {
674                 if (list_empty(&group->aliaslist)) {
675                         spin_unlock_irqrestore(&lcu->lock, flags);
676                         return NULL;
677                 } else {
678                         alias_device = list_first_entry(&group->aliaslist,
679                                                         struct dasd_device,
680                                                         alias_list);
681                 }
682         }
683         if (list_is_last(&alias_device->alias_list, &group->aliaslist))
684                 group->next = list_first_entry(&group->aliaslist,
685                                                struct dasd_device, alias_list);
686         else
687                 group->next = list_first_entry(&alias_device->alias_list,
688                                                struct dasd_device, alias_list);
689         spin_unlock_irqrestore(&lcu->lock, flags);
690         alias_priv = alias_device->private;
691         if ((alias_priv->count < private->count) && !alias_device->stopped &&
692             !test_bit(DASD_FLAG_OFFLINE, &alias_device->flags))
693                 return alias_device;
694         else
695                 return NULL;
696 }
697
698 /*
699  * Summary unit check handling depends on the way alias devices
700  * are handled so it is done here rather then in dasd_eckd.c
701  */
702 static int reset_summary_unit_check(struct alias_lcu *lcu,
703                                     struct dasd_device *device,
704                                     char reason)
705 {
706         struct dasd_ccw_req *cqr;
707         int rc = 0;
708         struct ccw1 *ccw;
709
710         cqr = lcu->rsu_cqr;
711         memcpy((char *) &cqr->magic, "ECKD", 4);
712         ASCEBC((char *) &cqr->magic, 4);
713         ccw = cqr->cpaddr;
714         ccw->cmd_code = DASD_ECKD_CCW_RSCK;
715         ccw->flags = CCW_FLAG_SLI;
716         ccw->count = 16;
717         ccw->cda = (__u32)(addr_t) cqr->data;
718         ((char *)cqr->data)[0] = reason;
719
720         clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
721         cqr->retries = 255;     /* set retry counter to enable basic ERP */
722         cqr->startdev = device;
723         cqr->memdev = device;
724         cqr->block = NULL;
725         cqr->expires = 5 * HZ;
726         cqr->buildclk = get_tod_clock();
727         cqr->status = DASD_CQR_FILLED;
728
729         rc = dasd_sleep_on_immediatly(cqr);
730         return rc;
731 }
732
733 static void _restart_all_base_devices_on_lcu(struct alias_lcu *lcu)
734 {
735         struct alias_pav_group *pavgroup;
736         struct dasd_device *device;
737         struct dasd_eckd_private *private;
738
739         /* active and inactive list can contain alias as well as base devices */
740         list_for_each_entry(device, &lcu->active_devices, alias_list) {
741                 private = device->private;
742                 if (private->uid.type != UA_BASE_DEVICE)
743                         continue;
744                 dasd_schedule_block_bh(device->block);
745                 dasd_schedule_device_bh(device);
746         }
747         list_for_each_entry(device, &lcu->inactive_devices, alias_list) {
748                 private = device->private;
749                 if (private->uid.type != UA_BASE_DEVICE)
750                         continue;
751                 dasd_schedule_block_bh(device->block);
752                 dasd_schedule_device_bh(device);
753         }
754         list_for_each_entry(pavgroup, &lcu->grouplist, group) {
755                 list_for_each_entry(device, &pavgroup->baselist, alias_list) {
756                         dasd_schedule_block_bh(device->block);
757                         dasd_schedule_device_bh(device);
758                 }
759         }
760 }
761
762 static void flush_all_alias_devices_on_lcu(struct alias_lcu *lcu)
763 {
764         struct alias_pav_group *pavgroup;
765         struct dasd_device *device, *temp;
766         struct dasd_eckd_private *private;
767         unsigned long flags;
768         LIST_HEAD(active);
769
770         /*
771          * Problem here ist that dasd_flush_device_queue may wait
772          * for termination of a request to complete. We can't keep
773          * the lcu lock during that time, so we must assume that
774          * the lists may have changed.
775          * Idea: first gather all active alias devices in a separate list,
776          * then flush the first element of this list unlocked, and afterwards
777          * check if it is still on the list before moving it to the
778          * active_devices list.
779          */
780
781         spin_lock_irqsave(&lcu->lock, flags);
782         list_for_each_entry_safe(device, temp, &lcu->active_devices,
783                                  alias_list) {
784                 private = device->private;
785                 if (private->uid.type == UA_BASE_DEVICE)
786                         continue;
787                 list_move(&device->alias_list, &active);
788         }
789
790         list_for_each_entry(pavgroup, &lcu->grouplist, group) {
791                 list_splice_init(&pavgroup->aliaslist, &active);
792         }
793         while (!list_empty(&active)) {
794                 device = list_first_entry(&active, struct dasd_device,
795                                           alias_list);
796                 spin_unlock_irqrestore(&lcu->lock, flags);
797                 dasd_flush_device_queue(device);
798                 spin_lock_irqsave(&lcu->lock, flags);
799                 /*
800                  * only move device around if it wasn't moved away while we
801                  * were waiting for the flush
802                  */
803                 if (device == list_first_entry(&active,
804                                                struct dasd_device, alias_list)) {
805                         list_move(&device->alias_list, &lcu->active_devices);
806                         private = device->private;
807                         private->pavgroup = NULL;
808                 }
809         }
810         spin_unlock_irqrestore(&lcu->lock, flags);
811 }
812
813 static void _stop_all_devices_on_lcu(struct alias_lcu *lcu)
814 {
815         struct alias_pav_group *pavgroup;
816         struct dasd_device *device;
817
818         list_for_each_entry(device, &lcu->active_devices, alias_list) {
819                 spin_lock(get_ccwdev_lock(device->cdev));
820                 dasd_device_set_stop_bits(device, DASD_STOPPED_SU);
821                 spin_unlock(get_ccwdev_lock(device->cdev));
822         }
823         list_for_each_entry(device, &lcu->inactive_devices, alias_list) {
824                 spin_lock(get_ccwdev_lock(device->cdev));
825                 dasd_device_set_stop_bits(device, DASD_STOPPED_SU);
826                 spin_unlock(get_ccwdev_lock(device->cdev));
827         }
828         list_for_each_entry(pavgroup, &lcu->grouplist, group) {
829                 list_for_each_entry(device, &pavgroup->baselist, alias_list) {
830                         spin_lock(get_ccwdev_lock(device->cdev));
831                         dasd_device_set_stop_bits(device, DASD_STOPPED_SU);
832                         spin_unlock(get_ccwdev_lock(device->cdev));
833                 }
834                 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) {
835                         spin_lock(get_ccwdev_lock(device->cdev));
836                         dasd_device_set_stop_bits(device, DASD_STOPPED_SU);
837                         spin_unlock(get_ccwdev_lock(device->cdev));
838                 }
839         }
840 }
841
842 static void _unstop_all_devices_on_lcu(struct alias_lcu *lcu)
843 {
844         struct alias_pav_group *pavgroup;
845         struct dasd_device *device;
846
847         list_for_each_entry(device, &lcu->active_devices, alias_list) {
848                 spin_lock(get_ccwdev_lock(device->cdev));
849                 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU);
850                 spin_unlock(get_ccwdev_lock(device->cdev));
851         }
852         list_for_each_entry(device, &lcu->inactive_devices, alias_list) {
853                 spin_lock(get_ccwdev_lock(device->cdev));
854                 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU);
855                 spin_unlock(get_ccwdev_lock(device->cdev));
856         }
857         list_for_each_entry(pavgroup, &lcu->grouplist, group) {
858                 list_for_each_entry(device, &pavgroup->baselist, alias_list) {
859                         spin_lock(get_ccwdev_lock(device->cdev));
860                         dasd_device_remove_stop_bits(device, DASD_STOPPED_SU);
861                         spin_unlock(get_ccwdev_lock(device->cdev));
862                 }
863                 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) {
864                         spin_lock(get_ccwdev_lock(device->cdev));
865                         dasd_device_remove_stop_bits(device, DASD_STOPPED_SU);
866                         spin_unlock(get_ccwdev_lock(device->cdev));
867                 }
868         }
869 }
870
871 static void summary_unit_check_handling_work(struct work_struct *work)
872 {
873         struct alias_lcu *lcu;
874         struct summary_unit_check_work_data *suc_data;
875         unsigned long flags;
876         struct dasd_device *device;
877
878         suc_data = container_of(work, struct summary_unit_check_work_data,
879                                 worker);
880         lcu = container_of(suc_data, struct alias_lcu, suc_data);
881         device = suc_data->device;
882
883         /* 1. flush alias devices */
884         flush_all_alias_devices_on_lcu(lcu);
885
886         /* 2. reset summary unit check */
887         spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
888         dasd_device_remove_stop_bits(device,
889                                      (DASD_STOPPED_SU | DASD_STOPPED_PENDING));
890         spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
891         reset_summary_unit_check(lcu, device, suc_data->reason);
892
893         spin_lock_irqsave(&lcu->lock, flags);
894         _unstop_all_devices_on_lcu(lcu);
895         _restart_all_base_devices_on_lcu(lcu);
896         /* 3. read new alias configuration */
897         _schedule_lcu_update(lcu, device);
898         lcu->suc_data.device = NULL;
899         dasd_put_device(device);
900         spin_unlock_irqrestore(&lcu->lock, flags);
901 }
902
903 void dasd_alias_handle_summary_unit_check(struct work_struct *work)
904 {
905         struct dasd_device *device = container_of(work, struct dasd_device,
906                                                   suc_work);
907         struct dasd_eckd_private *private = device->private;
908         struct alias_lcu *lcu;
909         unsigned long flags;
910
911         lcu = private->lcu;
912         if (!lcu) {
913                 DBF_DEV_EVENT(DBF_WARNING, device, "%s",
914                             "device not ready to handle summary"
915                             " unit check (no lcu structure)");
916                 goto out;
917         }
918         spin_lock_irqsave(&lcu->lock, flags);
919         /* If this device is about to be removed just return and wait for
920          * the next interrupt on a different device
921          */
922         if (list_empty(&device->alias_list)) {
923                 DBF_DEV_EVENT(DBF_WARNING, device, "%s",
924                             "device is in offline processing,"
925                             " don't do summary unit check handling");
926                 goto out_unlock;
927         }
928         if (lcu->suc_data.device) {
929                 /* already scheduled or running */
930                 DBF_DEV_EVENT(DBF_WARNING, device, "%s",
931                             "previous instance of summary unit check worker"
932                             " still pending");
933                 goto out_unlock;
934         }
935         _stop_all_devices_on_lcu(lcu);
936         /* prepare for lcu_update */
937         lcu->flags |= NEED_UAC_UPDATE | UPDATE_PENDING;
938         lcu->suc_data.reason = private->suc_reason;
939         lcu->suc_data.device = device;
940         dasd_get_device(device);
941         if (!schedule_work(&lcu->suc_data.worker))
942                 dasd_put_device(device);
943 out_unlock:
944         spin_unlock_irqrestore(&lcu->lock, flags);
945 out:
946         clear_bit(DASD_FLAG_SUC, &device->flags);
947         dasd_put_device(device);
948 };