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