linux/drivers/s390/block/dasd_devmap.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
   4 *                  Horst Hummel <Horst.Hummel@de.ibm.com>
   5 *                  Carsten Otte <Cotte@de.ibm.com>
   6 *                  Martin Schwidefsky <schwidefsky@de.ibm.com>
   7 * Bugreports.to..: <Linux390@de.ibm.com>
   8 * Copyright IBM Corp. 1999,2001
   9 *
  10 * Device mapping and dasd= parameter parsing functions. All devmap
  11 * functions may not be called from interrupt context. In particular
  12 * dasd_get_device is a no-no from interrupt context.
  13 *
  14 */
  15
  16#define KMSG_COMPONENT "dasd"
  17
  18#include <linux/ctype.h>
  19#include <linux/init.h>
  20#include <linux/module.h>
  21#include <linux/slab.h>
  22
  23#include <asm/debug.h>
  24#include <linux/uaccess.h>
  25#include <asm/ipl.h>
  26
  27/* This is ugly... */
  28#define PRINTK_HEADER "dasd_devmap:"
  29#define DASD_BUS_ID_SIZE 20
  30#define DASD_MAX_PARAMS 256
  31
  32#include "dasd_int.h"
  33
  34struct kmem_cache *dasd_page_cache;
  35EXPORT_SYMBOL_GPL(dasd_page_cache);
  36
  37/*
  38 * dasd_devmap_t is used to store the features and the relation
  39 * between device number and device index. To find a dasd_devmap_t
  40 * that corresponds to a device number of a device index each
  41 * dasd_devmap_t is added to two linked lists, one to search by
  42 * the device number and one to search by the device index. As
  43 * soon as big minor numbers are available the device index list
  44 * can be removed since the device number will then be identical
  45 * to the device index.
  46 */
  47struct dasd_devmap {
  48        struct list_head list;
  49        char bus_id[DASD_BUS_ID_SIZE];
  50        unsigned int devindex;
  51        unsigned short features;
  52        struct dasd_device *device;
  53};
  54
  55/*
  56 * Parameter parsing functions for dasd= parameter. The syntax is:
  57 *   <devno>            : (0x)?[0-9a-fA-F]+
  58 *   <busid>            : [0-0a-f]\.[0-9a-f]\.(0x)?[0-9a-fA-F]+
  59 *   <feature>          : ro
  60 *   <feature_list>     : \(<feature>(:<feature>)*\)
  61 *   <devno-range>      : <devno>(-<devno>)?<feature_list>?
  62 *   <busid-range>      : <busid>(-<busid>)?<feature_list>?
  63 *   <devices>          : <devno-range>|<busid-range>
  64 *   <dasd_module>      : dasd_diag_mod|dasd_eckd_mod|dasd_fba_mod
  65 *
  66 *   <dasd>             : autodetect|probeonly|<devices>(,<devices>)*
  67 */
  68
  69int dasd_probeonly =  0;        /* is true, when probeonly mode is active */
  70int dasd_autodetect = 0;        /* is true, when autodetection is active */
  71int dasd_nopav = 0;             /* is true, when PAV is disabled */
  72EXPORT_SYMBOL_GPL(dasd_nopav);
  73int dasd_nofcx;                 /* disable High Performance Ficon */
  74EXPORT_SYMBOL_GPL(dasd_nofcx);
  75
  76/*
  77 * char *dasd[] is intended to hold the ranges supplied by the dasd= statement
  78 * it is named 'dasd' to directly be filled by insmod with the comma separated
  79 * strings when running as a module.
  80 */
  81static char *dasd[DASD_MAX_PARAMS];
  82module_param_array(dasd, charp, NULL, S_IRUGO);
  83
  84/*
  85 * Single spinlock to protect devmap and servermap structures and lists.
  86 */
  87static DEFINE_SPINLOCK(dasd_devmap_lock);
  88
  89/*
  90 * Hash lists for devmap structures.
  91 */
  92static struct list_head dasd_hashlists[256];
  93int dasd_max_devindex;
  94
  95static struct dasd_devmap *dasd_add_busid(const char *, int);
  96
  97static inline int
  98dasd_hash_busid(const char *bus_id)
  99{
 100        int hash, i;
 101
 102        hash = 0;
 103        for (i = 0; (i < DASD_BUS_ID_SIZE) && *bus_id; i++, bus_id++)
 104                hash += *bus_id;
 105        return hash & 0xff;
 106}
 107
 108#ifndef MODULE
 109static int __init dasd_call_setup(char *opt)
 110{
 111        static int i __initdata;
 112        char *tmp;
 113
 114        while (i < DASD_MAX_PARAMS) {
 115                tmp = strsep(&opt, ",");
 116                if (!tmp)
 117                        break;
 118
 119                dasd[i++] = tmp;
 120        }
 121
 122        return 1;
 123}
 124
 125__setup ("dasd=", dasd_call_setup);
 126#endif  /* #ifndef MODULE */
 127
 128#define DASD_IPLDEV     "ipldev"
 129
 130/*
 131 * Read a device busid/devno from a string.
 132 */
 133static int __init dasd_busid(char *str, int *id0, int *id1, int *devno)
 134{
 135        unsigned int val;
 136        char *tok;
 137
 138        /* Interpret ipldev busid */
 139        if (strncmp(DASD_IPLDEV, str, strlen(DASD_IPLDEV)) == 0) {
 140                if (ipl_info.type != IPL_TYPE_CCW) {
 141                        pr_err("The IPL device is not a CCW device\n");
 142                        return -EINVAL;
 143                }
 144                *id0 = 0;
 145                *id1 = ipl_info.data.ccw.dev_id.ssid;
 146                *devno = ipl_info.data.ccw.dev_id.devno;
 147
 148                return 0;
 149        }
 150
 151        /* Old style 0xXXXX or XXXX */
 152        if (!kstrtouint(str, 16, &val)) {
 153                *id0 = *id1 = 0;
 154                if (val > 0xffff)
 155                        return -EINVAL;
 156                *devno = val;
 157                return 0;
 158        }
 159
 160        /* New style x.y.z busid */
 161        tok = strsep(&str, ".");
 162        if (kstrtouint(tok, 16, &val) || val > 0xff)
 163                return -EINVAL;
 164        *id0 = val;
 165
 166        tok = strsep(&str, ".");
 167        if (kstrtouint(tok, 16, &val) || val > 0xff)
 168                return -EINVAL;
 169        *id1 = val;
 170
 171        tok = strsep(&str, ".");
 172        if (kstrtouint(tok, 16, &val) || val > 0xffff)
 173                return -EINVAL;
 174        *devno = val;
 175
 176        return 0;
 177}
 178
 179/*
 180 * Read colon separated list of dasd features.
 181 */
 182static int __init dasd_feature_list(char *str)
 183{
 184        int features, len, rc;
 185
 186        features = 0;
 187        rc = 0;
 188
 189        if (!str)
 190                return DASD_FEATURE_DEFAULT;
 191
 192        while (1) {
 193                for (len = 0;
 194                     str[len] && str[len] != ':' && str[len] != ')'; len++);
 195                if (len == 2 && !strncmp(str, "ro", 2))
 196                        features |= DASD_FEATURE_READONLY;
 197                else if (len == 4 && !strncmp(str, "diag", 4))
 198                        features |= DASD_FEATURE_USEDIAG;
 199                else if (len == 3 && !strncmp(str, "raw", 3))
 200                        features |= DASD_FEATURE_USERAW;
 201                else if (len == 6 && !strncmp(str, "erplog", 6))
 202                        features |= DASD_FEATURE_ERPLOG;
 203                else if (len == 8 && !strncmp(str, "failfast", 8))
 204                        features |= DASD_FEATURE_FAILFAST;
 205                else {
 206                        pr_warn("%.*s is not a supported device option\n",
 207                                len, str);
 208                        rc = -EINVAL;
 209                }
 210                str += len;
 211                if (*str != ':')
 212                        break;
 213                str++;
 214        }
 215
 216        return rc ? : features;
 217}
 218
 219/*
 220 * Try to match the first element on the comma separated parse string
 221 * with one of the known keywords. If a keyword is found, take the approprate
 222 * action and return a pointer to the residual string. If the first element
 223 * could not be matched to any keyword then return an error code.
 224 */
 225static int __init dasd_parse_keyword(char *keyword)
 226{
 227        int length = strlen(keyword);
 228
 229        if (strncmp("autodetect", keyword, length) == 0) {
 230                dasd_autodetect = 1;
 231                pr_info("The autodetection mode has been activated\n");
 232                return 0;
 233        }
 234        if (strncmp("probeonly", keyword, length) == 0) {
 235                dasd_probeonly = 1;
 236                pr_info("The probeonly mode has been activated\n");
 237                return 0;
 238        }
 239        if (strncmp("nopav", keyword, length) == 0) {
 240                if (MACHINE_IS_VM)
 241                        pr_info("'nopav' is not supported on z/VM\n");
 242                else {
 243                        dasd_nopav = 1;
 244                        pr_info("PAV support has be deactivated\n");
 245                }
 246                return 0;
 247        }
 248        if (strncmp("nofcx", keyword, length) == 0) {
 249                dasd_nofcx = 1;
 250                pr_info("High Performance FICON support has been "
 251                        "deactivated\n");
 252                return 0;
 253        }
 254        if (strncmp("fixedbuffers", keyword, length) == 0) {
 255                if (dasd_page_cache)
 256                        return 0;
 257                dasd_page_cache =
 258                        kmem_cache_create("dasd_page_cache", PAGE_SIZE,
 259                                          PAGE_SIZE, SLAB_CACHE_DMA,
 260                                          NULL);
 261                if (!dasd_page_cache)
 262                        DBF_EVENT(DBF_WARNING, "%s", "Failed to create slab, "
 263                                "fixed buffer mode disabled.");
 264                else
 265                        DBF_EVENT(DBF_INFO, "%s",
 266                                 "turning on fixed buffer mode");
 267                return 0;
 268        }
 269
 270        return -EINVAL;
 271}
 272
 273/*
 274 * Split a string of a device range into its pieces and return the from, to, and
 275 * feature parts separately.
 276 * e.g.:
 277 * 0.0.1234-0.0.5678(ro:erplog) -> from: 0.0.1234 to: 0.0.5678 features: ro:erplog
 278 * 0.0.8765(raw) -> from: 0.0.8765 to: null features: raw
 279 * 0x4321 -> from: 0x4321 to: null features: null
 280 */
 281static int __init dasd_evaluate_range_param(char *range, char **from_str,
 282                                            char **to_str, char **features_str)
 283{
 284        int rc = 0;
 285
 286        /* Do we have a range or a single device? */
 287        if (strchr(range, '-')) {
 288                *from_str = strsep(&range, "-");
 289                *to_str = strsep(&range, "(");
 290                *features_str = strsep(&range, ")");
 291        } else {
 292                *from_str = strsep(&range, "(");
 293                *features_str = strsep(&range, ")");
 294        }
 295
 296        if (*features_str && !range) {
 297                pr_warn("A closing parenthesis ')' is missing in the dasd= parameter\n");
 298                rc = -EINVAL;
 299        }
 300
 301        return rc;
 302}
 303
 304/*
 305 * Try to interprete the range string as a device number or a range of devices.
 306 * If the interpretation is successful, create the matching dasd_devmap entries.
 307 * If interpretation fails or in case of an error, return an error code.
 308 */
 309static int __init dasd_parse_range(const char *range)
 310{
 311        struct dasd_devmap *devmap;
 312        int from, from_id0, from_id1;
 313        int to, to_id0, to_id1;
 314        int features;
 315        char bus_id[DASD_BUS_ID_SIZE + 1];
 316        char *features_str = NULL;
 317        char *from_str = NULL;
 318        char *to_str = NULL;
 319        int rc = 0;
 320        char *tmp;
 321
 322        tmp = kstrdup(range, GFP_KERNEL);
 323        if (!tmp)
 324                return -ENOMEM;
 325
 326        if (dasd_evaluate_range_param(tmp, &from_str, &to_str, &features_str)) {
 327                rc = -EINVAL;
 328                goto out;
 329        }
 330
 331        if (dasd_busid(from_str, &from_id0, &from_id1, &from)) {
 332                rc = -EINVAL;
 333                goto out;
 334        }
 335
 336        to = from;
 337        to_id0 = from_id0;
 338        to_id1 = from_id1;
 339        if (to_str) {
 340                if (dasd_busid(to_str, &to_id0, &to_id1, &to)) {
 341                        rc = -EINVAL;
 342                        goto out;
 343                }
 344                if (from_id0 != to_id0 || from_id1 != to_id1 || from > to) {
 345                        pr_err("%s is not a valid device range\n", range);
 346                        rc = -EINVAL;
 347                        goto out;
 348                }
 349        }
 350
 351        features = dasd_feature_list(features_str);
 352        if (features < 0) {
 353                rc = -EINVAL;
 354                goto out;
 355        }
 356        /* each device in dasd= parameter should be set initially online */
 357        features |= DASD_FEATURE_INITIAL_ONLINE;
 358        while (from <= to) {
 359                sprintf(bus_id, "%01x.%01x.%04x", from_id0, from_id1, from++);
 360                devmap = dasd_add_busid(bus_id, features);
 361                if (IS_ERR(devmap)) {
 362                        rc = PTR_ERR(devmap);
 363                        goto out;
 364                }
 365        }
 366
 367out:
 368        kfree(tmp);
 369
 370        return rc;
 371}
 372
 373/*
 374 * Parse parameters stored in dasd[]
 375 * The 'dasd=...' parameter allows to specify a comma separated list of
 376 * keywords and device ranges. The parameters in that list will be stored as
 377 * separate elementes in dasd[].
 378 */
 379int __init dasd_parse(void)
 380{
 381        int rc, i;
 382        char *cur;
 383
 384        rc = 0;
 385        for (i = 0; i < DASD_MAX_PARAMS; i++) {
 386                cur = dasd[i];
 387                if (!cur)
 388                        break;
 389                if (*cur == '\0')
 390                        continue;
 391
 392                rc = dasd_parse_keyword(cur);
 393                if (rc)
 394                        rc = dasd_parse_range(cur);
 395
 396                if (rc)
 397                        break;
 398        }
 399
 400        return rc;
 401}
 402
 403/*
 404 * Add a devmap for the device specified by busid. It is possible that
 405 * the devmap already exists (dasd= parameter). The order of the devices
 406 * added through this function will define the kdevs for the individual
 407 * devices.
 408 */
 409static struct dasd_devmap *
 410dasd_add_busid(const char *bus_id, int features)
 411{
 412        struct dasd_devmap *devmap, *new, *tmp;
 413        int hash;
 414
 415        new = kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL);
 416        if (!new)
 417                return ERR_PTR(-ENOMEM);
 418        spin_lock(&dasd_devmap_lock);
 419        devmap = NULL;
 420        hash = dasd_hash_busid(bus_id);
 421        list_for_each_entry(tmp, &dasd_hashlists[hash], list)
 422                if (strncmp(tmp->bus_id, bus_id, DASD_BUS_ID_SIZE) == 0) {
 423                        devmap = tmp;
 424                        break;
 425                }
 426        if (!devmap) {
 427                /* This bus_id is new. */
 428                new->devindex = dasd_max_devindex++;
 429                strlcpy(new->bus_id, bus_id, DASD_BUS_ID_SIZE);
 430                new->features = features;
 431                new->device = NULL;
 432                list_add(&new->list, &dasd_hashlists[hash]);
 433                devmap = new;
 434                new = NULL;
 435        }
 436        spin_unlock(&dasd_devmap_lock);
 437        kfree(new);
 438        return devmap;
 439}
 440
 441/*
 442 * Find devmap for device with given bus_id.
 443 */
 444static struct dasd_devmap *
 445dasd_find_busid(const char *bus_id)
 446{
 447        struct dasd_devmap *devmap, *tmp;
 448        int hash;
 449
 450        spin_lock(&dasd_devmap_lock);
 451        devmap = ERR_PTR(-ENODEV);
 452        hash = dasd_hash_busid(bus_id);
 453        list_for_each_entry(tmp, &dasd_hashlists[hash], list) {
 454                if (strncmp(tmp->bus_id, bus_id, DASD_BUS_ID_SIZE) == 0) {
 455                        devmap = tmp;
 456                        break;
 457                }
 458        }
 459        spin_unlock(&dasd_devmap_lock);
 460        return devmap;
 461}
 462
 463/*
 464 * Check if busid has been added to the list of dasd ranges.
 465 */
 466int
 467dasd_busid_known(const char *bus_id)
 468{
 469        return IS_ERR(dasd_find_busid(bus_id)) ? -ENOENT : 0;
 470}
 471
 472/*
 473 * Forget all about the device numbers added so far.
 474 * This may only be called at module unload or system shutdown.
 475 */
 476static void
 477dasd_forget_ranges(void)
 478{
 479        struct dasd_devmap *devmap, *n;
 480        int i;
 481
 482        spin_lock(&dasd_devmap_lock);
 483        for (i = 0; i < 256; i++) {
 484                list_for_each_entry_safe(devmap, n, &dasd_hashlists[i], list) {
 485                        BUG_ON(devmap->device != NULL);
 486                        list_del(&devmap->list);
 487                        kfree(devmap);
 488                }
 489        }
 490        spin_unlock(&dasd_devmap_lock);
 491}
 492
 493/*
 494 * Find the device struct by its device index.
 495 */
 496struct dasd_device *
 497dasd_device_from_devindex(int devindex)
 498{
 499        struct dasd_devmap *devmap, *tmp;
 500        struct dasd_device *device;
 501        int i;
 502
 503        spin_lock(&dasd_devmap_lock);
 504        devmap = NULL;
 505        for (i = 0; (i < 256) && !devmap; i++)
 506                list_for_each_entry(tmp, &dasd_hashlists[i], list)
 507                        if (tmp->devindex == devindex) {
 508                                /* Found the devmap for the device. */
 509                                devmap = tmp;
 510                                break;
 511                        }
 512        if (devmap && devmap->device) {
 513                device = devmap->device;
 514                dasd_get_device(device);
 515        } else
 516                device = ERR_PTR(-ENODEV);
 517        spin_unlock(&dasd_devmap_lock);
 518        return device;
 519}
 520
 521/*
 522 * Return devmap for cdev. If no devmap exists yet, create one and
 523 * connect it to the cdev.
 524 */
 525static struct dasd_devmap *
 526dasd_devmap_from_cdev(struct ccw_device *cdev)
 527{
 528        struct dasd_devmap *devmap;
 529
 530        devmap = dasd_find_busid(dev_name(&cdev->dev));
 531        if (IS_ERR(devmap))
 532                devmap = dasd_add_busid(dev_name(&cdev->dev),
 533                                        DASD_FEATURE_DEFAULT);
 534        return devmap;
 535}
 536
 537/*
 538 * Create a dasd device structure for cdev.
 539 */
 540struct dasd_device *
 541dasd_create_device(struct ccw_device *cdev)
 542{
 543        struct dasd_devmap *devmap;
 544        struct dasd_device *device;
 545        unsigned long flags;
 546        int rc;
 547
 548        devmap = dasd_devmap_from_cdev(cdev);
 549        if (IS_ERR(devmap))
 550                return (void *) devmap;
 551
 552        device = dasd_alloc_device();
 553        if (IS_ERR(device))
 554                return device;
 555        atomic_set(&device->ref_count, 3);
 556
 557        spin_lock(&dasd_devmap_lock);
 558        if (!devmap->device) {
 559                devmap->device = device;
 560                device->devindex = devmap->devindex;
 561                device->features = devmap->features;
 562                get_device(&cdev->dev);
 563                device->cdev = cdev;
 564                rc = 0;
 565        } else
 566                /* Someone else was faster. */
 567                rc = -EBUSY;
 568        spin_unlock(&dasd_devmap_lock);
 569
 570        if (rc) {
 571                dasd_free_device(device);
 572                return ERR_PTR(rc);
 573        }
 574
 575        spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
 576        dev_set_drvdata(&cdev->dev, device);
 577        spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 578
 579        return device;
 580}
 581
 582/*
 583 * Wait queue for dasd_delete_device waits.
 584 */
 585static DECLARE_WAIT_QUEUE_HEAD(dasd_delete_wq);
 586
 587/*
 588 * Remove a dasd device structure. The passed referenced
 589 * is destroyed.
 590 */
 591void
 592dasd_delete_device(struct dasd_device *device)
 593{
 594        struct ccw_device *cdev;
 595        struct dasd_devmap *devmap;
 596        unsigned long flags;
 597
 598        /* First remove device pointer from devmap. */
 599        devmap = dasd_find_busid(dev_name(&device->cdev->dev));
 600        BUG_ON(IS_ERR(devmap));
 601        spin_lock(&dasd_devmap_lock);
 602        if (devmap->device != device) {
 603                spin_unlock(&dasd_devmap_lock);
 604                dasd_put_device(device);
 605                return;
 606        }
 607        devmap->device = NULL;
 608        spin_unlock(&dasd_devmap_lock);
 609
 610        /* Disconnect dasd_device structure from ccw_device structure. */
 611        spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
 612        dev_set_drvdata(&device->cdev->dev, NULL);
 613        spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
 614
 615        /*
 616         * Drop ref_count by 3, one for the devmap reference, one for
 617         * the cdev reference and one for the passed reference.
 618         */
 619        atomic_sub(3, &device->ref_count);
 620
 621        /* Wait for reference counter to drop to zero. */
 622        wait_event(dasd_delete_wq, atomic_read(&device->ref_count) == 0);
 623
 624        dasd_generic_free_discipline(device);
 625        /* Disconnect dasd_device structure from ccw_device structure. */
 626        cdev = device->cdev;
 627        device->cdev = NULL;
 628
 629        /* Put ccw_device structure. */
 630        put_device(&cdev->dev);
 631
 632        /* Now the device structure can be freed. */
 633        dasd_free_device(device);
 634}
 635
 636/*
 637 * Reference counter dropped to zero. Wake up waiter
 638 * in dasd_delete_device.
 639 */
 640void
 641dasd_put_device_wake(struct dasd_device *device)
 642{
 643        wake_up(&dasd_delete_wq);
 644}
 645EXPORT_SYMBOL_GPL(dasd_put_device_wake);
 646
 647/*
 648 * Return dasd_device structure associated with cdev.
 649 * This function needs to be called with the ccw device
 650 * lock held. It can be used from interrupt context.
 651 */
 652struct dasd_device *
 653dasd_device_from_cdev_locked(struct ccw_device *cdev)
 654{
 655        struct dasd_device *device = dev_get_drvdata(&cdev->dev);
 656
 657        if (!device)
 658                return ERR_PTR(-ENODEV);
 659        dasd_get_device(device);
 660        return device;
 661}
 662
 663/*
 664 * Return dasd_device structure associated with cdev.
 665 */
 666struct dasd_device *
 667dasd_device_from_cdev(struct ccw_device *cdev)
 668{
 669        struct dasd_device *device;
 670        unsigned long flags;
 671
 672        spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
 673        device = dasd_device_from_cdev_locked(cdev);
 674        spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 675        return device;
 676}
 677
 678void dasd_add_link_to_gendisk(struct gendisk *gdp, struct dasd_device *device)
 679{
 680        struct dasd_devmap *devmap;
 681
 682        devmap = dasd_find_busid(dev_name(&device->cdev->dev));
 683        if (IS_ERR(devmap))
 684                return;
 685        spin_lock(&dasd_devmap_lock);
 686        gdp->private_data = devmap;
 687        spin_unlock(&dasd_devmap_lock);
 688}
 689
 690struct dasd_device *dasd_device_from_gendisk(struct gendisk *gdp)
 691{
 692        struct dasd_device *device;
 693        struct dasd_devmap *devmap;
 694
 695        if (!gdp->private_data)
 696                return NULL;
 697        device = NULL;
 698        spin_lock(&dasd_devmap_lock);
 699        devmap = gdp->private_data;
 700        if (devmap && devmap->device) {
 701                device = devmap->device;
 702                dasd_get_device(device);
 703        }
 704        spin_unlock(&dasd_devmap_lock);
 705        return device;
 706}
 707
 708/*
 709 * SECTION: files in sysfs
 710 */
 711
 712/*
 713 * failfast controls the behaviour, if no path is available
 714 */
 715static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr,
 716                            char *buf)
 717{
 718        struct dasd_devmap *devmap;
 719        int ff_flag;
 720
 721        devmap = dasd_find_busid(dev_name(dev));
 722        if (!IS_ERR(devmap))
 723                ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
 724        else
 725                ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0;
 726        return snprintf(buf, PAGE_SIZE, ff_flag ? "1\n" : "0\n");
 727}
 728
 729static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr,
 730              const char *buf, size_t count)
 731{
 732        unsigned int val;
 733        int rc;
 734
 735        if (kstrtouint(buf, 0, &val) || val > 1)
 736                return -EINVAL;
 737
 738        rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_FAILFAST, val);
 739
 740        return rc ? : count;
 741}
 742
 743static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store);
 744
 745/*
 746 * readonly controls the readonly status of a dasd
 747 */
 748static ssize_t
 749dasd_ro_show(struct device *dev, struct device_attribute *attr, char *buf)
 750{
 751        struct dasd_devmap *devmap;
 752        struct dasd_device *device;
 753        int ro_flag = 0;
 754
 755        devmap = dasd_find_busid(dev_name(dev));
 756        if (IS_ERR(devmap))
 757                goto out;
 758
 759        ro_flag = !!(devmap->features & DASD_FEATURE_READONLY);
 760
 761        spin_lock(&dasd_devmap_lock);
 762        device = devmap->device;
 763        if (device)
 764                ro_flag |= test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
 765        spin_unlock(&dasd_devmap_lock);
 766
 767out:
 768        return snprintf(buf, PAGE_SIZE, ro_flag ? "1\n" : "0\n");
 769}
 770
 771static ssize_t
 772dasd_ro_store(struct device *dev, struct device_attribute *attr,
 773              const char *buf, size_t count)
 774{
 775        struct ccw_device *cdev = to_ccwdev(dev);
 776        struct dasd_device *device;
 777        unsigned long flags;
 778        unsigned int val;
 779        int rc;
 780
 781        if (kstrtouint(buf, 0, &val) || val > 1)
 782                return -EINVAL;
 783
 784        rc = dasd_set_feature(cdev, DASD_FEATURE_READONLY, val);
 785        if (rc)
 786                return rc;
 787
 788        device = dasd_device_from_cdev(cdev);
 789        if (IS_ERR(device))
 790                return count;
 791
 792        spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
 793        val = val || test_bit(DASD_FLAG_DEVICE_RO, &device->flags);
 794
 795        if (!device->block || !device->block->gdp ||
 796            test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
 797                spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 798                goto out;
 799        }
 800        /* Increase open_count to avoid losing the block device */
 801        atomic_inc(&device->block->open_count);
 802        spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 803
 804        set_disk_ro(device->block->gdp, val);
 805        atomic_dec(&device->block->open_count);
 806
 807out:
 808        dasd_put_device(device);
 809
 810        return count;
 811}
 812
 813static DEVICE_ATTR(readonly, 0644, dasd_ro_show, dasd_ro_store);
 814/*
 815 * erplog controls the logging of ERP related data
 816 * (e.g. failing channel programs).
 817 */
 818static ssize_t
 819dasd_erplog_show(struct device *dev, struct device_attribute *attr, char *buf)
 820{
 821        struct dasd_devmap *devmap;
 822        int erplog;
 823
 824        devmap = dasd_find_busid(dev_name(dev));
 825        if (!IS_ERR(devmap))
 826                erplog = (devmap->features & DASD_FEATURE_ERPLOG) != 0;
 827        else
 828                erplog = (DASD_FEATURE_DEFAULT & DASD_FEATURE_ERPLOG) != 0;
 829        return snprintf(buf, PAGE_SIZE, erplog ? "1\n" : "0\n");
 830}
 831
 832static ssize_t
 833dasd_erplog_store(struct device *dev, struct device_attribute *attr,
 834              const char *buf, size_t count)
 835{
 836        unsigned int val;
 837        int rc;
 838
 839        if (kstrtouint(buf, 0, &val) || val > 1)
 840                return -EINVAL;
 841
 842        rc = dasd_set_feature(to_ccwdev(dev), DASD_FEATURE_ERPLOG, val);
 843
 844        return rc ? : count;
 845}
 846
 847static DEVICE_ATTR(erplog, 0644, dasd_erplog_show, dasd_erplog_store);
 848
 849/*
 850 * use_diag controls whether the driver should use diag rather than ssch
 851 * to talk to the device
 852 */
 853static ssize_t
 854dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf)
 855{
 856        struct dasd_devmap *devmap;
 857        int use_diag;
 858
 859        devmap = dasd_find_busid(dev_name(dev));
 860        if (!IS_ERR(devmap))
 861                use_diag = (devmap->features & DASD_FEATURE_USEDIAG) != 0;
 862        else
 863                use_diag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USEDIAG) != 0;
 864        return sprintf(buf, use_diag ? "1\n" : "0\n");
 865}
 866
 867static ssize_t
 868dasd_use_diag_store(struct device *dev, struct device_attribute *attr,
 869                    const char *buf, size_t count)
 870{
 871        struct dasd_devmap *devmap;
 872        unsigned int val;
 873        ssize_t rc;
 874
 875        devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
 876        if (IS_ERR(devmap))
 877                return PTR_ERR(devmap);
 878
 879        if (kstrtouint(buf, 0, &val) || val > 1)
 880                return -EINVAL;
 881
 882        spin_lock(&dasd_devmap_lock);
 883        /* Changing diag discipline flag is only allowed in offline state. */
 884        rc = count;
 885        if (!devmap->device && !(devmap->features & DASD_FEATURE_USERAW)) {
 886                if (val)
 887                        devmap->features |= DASD_FEATURE_USEDIAG;
 888                else
 889                        devmap->features &= ~DASD_FEATURE_USEDIAG;
 890        } else
 891                rc = -EPERM;
 892        spin_unlock(&dasd_devmap_lock);
 893        return rc;
 894}
 895
 896static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store);
 897
 898/*
 899 * use_raw controls whether the driver should give access to raw eckd data or
 900 * operate in standard mode
 901 */
 902static ssize_t
 903dasd_use_raw_show(struct device *dev, struct device_attribute *attr, char *buf)
 904{
 905        struct dasd_devmap *devmap;
 906        int use_raw;
 907
 908        devmap = dasd_find_busid(dev_name(dev));
 909        if (!IS_ERR(devmap))
 910                use_raw = (devmap->features & DASD_FEATURE_USERAW) != 0;
 911        else
 912                use_raw = (DASD_FEATURE_DEFAULT & DASD_FEATURE_USERAW) != 0;
 913        return sprintf(buf, use_raw ? "1\n" : "0\n");
 914}
 915
 916static ssize_t
 917dasd_use_raw_store(struct device *dev, struct device_attribute *attr,
 918                    const char *buf, size_t count)
 919{
 920        struct dasd_devmap *devmap;
 921        ssize_t rc;
 922        unsigned long val;
 923
 924        devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
 925        if (IS_ERR(devmap))
 926                return PTR_ERR(devmap);
 927
 928        if ((kstrtoul(buf, 10, &val) != 0) || val > 1)
 929                return -EINVAL;
 930
 931        spin_lock(&dasd_devmap_lock);
 932        /* Changing diag discipline flag is only allowed in offline state. */
 933        rc = count;
 934        if (!devmap->device && !(devmap->features & DASD_FEATURE_USEDIAG)) {
 935                if (val)
 936                        devmap->features |= DASD_FEATURE_USERAW;
 937                else
 938                        devmap->features &= ~DASD_FEATURE_USERAW;
 939        } else
 940                rc = -EPERM;
 941        spin_unlock(&dasd_devmap_lock);
 942        return rc;
 943}
 944
 945static DEVICE_ATTR(raw_track_access, 0644, dasd_use_raw_show,
 946                   dasd_use_raw_store);
 947
 948static ssize_t
 949dasd_safe_offline_store(struct device *dev, struct device_attribute *attr,
 950                        const char *buf, size_t count)
 951{
 952        struct ccw_device *cdev = to_ccwdev(dev);
 953        struct dasd_device *device;
 954        unsigned long flags;
 955        int rc;
 956
 957        spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
 958        device = dasd_device_from_cdev_locked(cdev);
 959        if (IS_ERR(device)) {
 960                rc = PTR_ERR(device);
 961                spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 962                goto out;
 963        }
 964
 965        if (test_bit(DASD_FLAG_OFFLINE, &device->flags) ||
 966            test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) {
 967                /* Already doing offline processing */
 968                dasd_put_device(device);
 969                spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 970                rc = -EBUSY;
 971                goto out;
 972        }
 973
 974        set_bit(DASD_FLAG_SAFE_OFFLINE, &device->flags);
 975        dasd_put_device(device);
 976        spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
 977
 978        rc = ccw_device_set_offline(cdev);
 979
 980out:
 981        return rc ? rc : count;
 982}
 983
 984static DEVICE_ATTR(safe_offline, 0200, NULL, dasd_safe_offline_store);
 985
 986static ssize_t
 987dasd_access_show(struct device *dev, struct device_attribute *attr,
 988                 char *buf)
 989{
 990        struct ccw_device *cdev = to_ccwdev(dev);
 991        struct dasd_device *device;
 992        int count;
 993
 994        device = dasd_device_from_cdev(cdev);
 995        if (IS_ERR(device))
 996                return PTR_ERR(device);
 997
 998        if (!device->discipline)
 999                count = -ENODEV;
1000        else if (!device->discipline->host_access_count)
1001                count = -EOPNOTSUPP;
1002        else
1003                count = device->discipline->host_access_count(device);
1004
1005        dasd_put_device(device);
1006        if (count < 0)
1007                return count;
1008
1009        return sprintf(buf, "%d\n", count);
1010}
1011
1012static DEVICE_ATTR(host_access_count, 0444, dasd_access_show, NULL);
1013
1014static ssize_t
1015dasd_discipline_show(struct device *dev, struct device_attribute *attr,
1016                     char *buf)
1017{
1018        struct dasd_device *device;
1019        ssize_t len;
1020
1021        device = dasd_device_from_cdev(to_ccwdev(dev));
1022        if (IS_ERR(device))
1023                goto out;
1024        else if (!device->discipline) {
1025                dasd_put_device(device);
1026                goto out;
1027        } else {
1028                len = snprintf(buf, PAGE_SIZE, "%s\n",
1029                               device->discipline->name);
1030                dasd_put_device(device);
1031                return len;
1032        }
1033out:
1034        len = snprintf(buf, PAGE_SIZE, "none\n");
1035        return len;
1036}
1037
1038static DEVICE_ATTR(discipline, 0444, dasd_discipline_show, NULL);
1039
1040static ssize_t
1041dasd_device_status_show(struct device *dev, struct device_attribute *attr,
1042                     char *buf)
1043{
1044        struct dasd_device *device;
1045        ssize_t len;
1046
1047        device = dasd_device_from_cdev(to_ccwdev(dev));
1048        if (!IS_ERR(device)) {
1049                switch (device->state) {
1050                case DASD_STATE_NEW:
1051                        len = snprintf(buf, PAGE_SIZE, "new\n");
1052                        break;
1053                case DASD_STATE_KNOWN:
1054                        len = snprintf(buf, PAGE_SIZE, "detected\n");
1055                        break;
1056                case DASD_STATE_BASIC:
1057                        len = snprintf(buf, PAGE_SIZE, "basic\n");
1058                        break;
1059                case DASD_STATE_UNFMT:
1060                        len = snprintf(buf, PAGE_SIZE, "unformatted\n");
1061                        break;
1062                case DASD_STATE_READY:
1063                        len = snprintf(buf, PAGE_SIZE, "ready\n");
1064                        break;
1065                case DASD_STATE_ONLINE:
1066                        len = snprintf(buf, PAGE_SIZE, "online\n");
1067                        break;
1068                default:
1069                        len = snprintf(buf, PAGE_SIZE, "no stat\n");
1070                        break;
1071                }
1072                dasd_put_device(device);
1073        } else
1074                len = snprintf(buf, PAGE_SIZE, "unknown\n");
1075        return len;
1076}
1077
1078static DEVICE_ATTR(status, 0444, dasd_device_status_show, NULL);
1079
1080static ssize_t dasd_alias_show(struct device *dev,
1081                               struct device_attribute *attr, char *buf)
1082{
1083        struct dasd_device *device;
1084        struct dasd_uid uid;
1085
1086        device = dasd_device_from_cdev(to_ccwdev(dev));
1087        if (IS_ERR(device))
1088                return sprintf(buf, "0\n");
1089
1090        if (device->discipline && device->discipline->get_uid &&
1091            !device->discipline->get_uid(device, &uid)) {
1092                if (uid.type == UA_BASE_PAV_ALIAS ||
1093                    uid.type == UA_HYPER_PAV_ALIAS) {
1094                        dasd_put_device(device);
1095                        return sprintf(buf, "1\n");
1096                }
1097        }
1098        dasd_put_device(device);
1099
1100        return sprintf(buf, "0\n");
1101}
1102
1103static DEVICE_ATTR(alias, 0444, dasd_alias_show, NULL);
1104
1105static ssize_t dasd_vendor_show(struct device *dev,
1106                                struct device_attribute *attr, char *buf)
1107{
1108        struct dasd_device *device;
1109        struct dasd_uid uid;
1110        char *vendor;
1111
1112        device = dasd_device_from_cdev(to_ccwdev(dev));
1113        vendor = "";
1114        if (IS_ERR(device))
1115                return snprintf(buf, PAGE_SIZE, "%s\n", vendor);
1116
1117        if (device->discipline && device->discipline->get_uid &&
1118            !device->discipline->get_uid(device, &uid))
1119                        vendor = uid.vendor;
1120
1121        dasd_put_device(device);
1122
1123        return snprintf(buf, PAGE_SIZE, "%s\n", vendor);
1124}
1125
1126static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL);
1127
1128#define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial    */ 14 + 1 +\
1129                     /* SSID   */ 4 + 1 + /* unit addr */ 2 + 1 +\
1130                     /* vduit */ 32 + 1)
1131
1132static ssize_t
1133dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf)
1134{
1135        struct dasd_device *device;
1136        struct dasd_uid uid;
1137        char uid_string[UID_STRLEN];
1138        char ua_string[3];
1139
1140        device = dasd_device_from_cdev(to_ccwdev(dev));
1141        uid_string[0] = 0;
1142        if (IS_ERR(device))
1143                return snprintf(buf, PAGE_SIZE, "%s\n", uid_string);
1144
1145        if (device->discipline && device->discipline->get_uid &&
1146            !device->discipline->get_uid(device, &uid)) {
1147                switch (uid.type) {
1148                case UA_BASE_DEVICE:
1149                        snprintf(ua_string, sizeof(ua_string), "%02x",
1150                                 uid.real_unit_addr);
1151                        break;
1152                case UA_BASE_PAV_ALIAS:
1153                        snprintf(ua_string, sizeof(ua_string), "%02x",
1154                                 uid.base_unit_addr);
1155                        break;
1156                case UA_HYPER_PAV_ALIAS:
1157                        snprintf(ua_string, sizeof(ua_string), "xx");
1158                        break;
1159                default:
1160                        /* should not happen, treat like base device */
1161                        snprintf(ua_string, sizeof(ua_string), "%02x",
1162                                 uid.real_unit_addr);
1163                        break;
1164                }
1165
1166                if (strlen(uid.vduit) > 0)
1167                        snprintf(uid_string, sizeof(uid_string),
1168                                 "%s.%s.%04x.%s.%s",
1169                                 uid.vendor, uid.serial, uid.ssid, ua_string,
1170                                 uid.vduit);
1171                else
1172                        snprintf(uid_string, sizeof(uid_string),
1173                                 "%s.%s.%04x.%s",
1174                                 uid.vendor, uid.serial, uid.ssid, ua_string);
1175        }
1176        dasd_put_device(device);
1177
1178        return snprintf(buf, PAGE_SIZE, "%s\n", uid_string);
1179}
1180static DEVICE_ATTR(uid, 0444, dasd_uid_show, NULL);
1181
1182/*
1183 * extended error-reporting
1184 */
1185static ssize_t
1186dasd_eer_show(struct device *dev, struct device_attribute *attr, char *buf)
1187{
1188        struct dasd_devmap *devmap;
1189        int eer_flag;
1190
1191        devmap = dasd_find_busid(dev_name(dev));
1192        if (!IS_ERR(devmap) && devmap->device)
1193                eer_flag = dasd_eer_enabled(devmap->device);
1194        else
1195                eer_flag = 0;
1196        return snprintf(buf, PAGE_SIZE, eer_flag ? "1\n" : "0\n");
1197}
1198
1199static ssize_t
1200dasd_eer_store(struct device *dev, struct device_attribute *attr,
1201               const char *buf, size_t count)
1202{
1203        struct dasd_device *device;
1204        unsigned int val;
1205        int rc = 0;
1206
1207        device = dasd_device_from_cdev(to_ccwdev(dev));
1208        if (IS_ERR(device))
1209                return PTR_ERR(device);
1210
1211        if (kstrtouint(buf, 0, &val) || val > 1)
1212                return -EINVAL;
1213
1214        if (val)
1215                rc = dasd_eer_enable(device);
1216        else
1217                dasd_eer_disable(device);
1218
1219        dasd_put_device(device);
1220
1221        return rc ? : count;
1222}
1223
1224static DEVICE_ATTR(eer_enabled, 0644, dasd_eer_show, dasd_eer_store);
1225
1226/*
1227 * expiration time for default requests
1228 */
1229static ssize_t
1230dasd_expires_show(struct device *dev, struct device_attribute *attr, char *buf)
1231{
1232        struct dasd_device *device;
1233        int len;
1234
1235        device = dasd_device_from_cdev(to_ccwdev(dev));
1236        if (IS_ERR(device))
1237                return -ENODEV;
1238        len = snprintf(buf, PAGE_SIZE, "%lu\n", device->default_expires);
1239        dasd_put_device(device);
1240        return len;
1241}
1242
1243static ssize_t
1244dasd_expires_store(struct device *dev, struct device_attribute *attr,
1245               const char *buf, size_t count)
1246{
1247        struct dasd_device *device;
1248        unsigned long val;
1249
1250        device = dasd_device_from_cdev(to_ccwdev(dev));
1251        if (IS_ERR(device))
1252                return -ENODEV;
1253
1254        if ((kstrtoul(buf, 10, &val) != 0) ||
1255            (val > DASD_EXPIRES_MAX) || val == 0) {
1256                dasd_put_device(device);
1257                return -EINVAL;
1258        }
1259
1260        if (val)
1261                device->default_expires = val;
1262
1263        dasd_put_device(device);
1264        return count;
1265}
1266
1267static DEVICE_ATTR(expires, 0644, dasd_expires_show, dasd_expires_store);
1268
1269static ssize_t
1270dasd_retries_show(struct device *dev, struct device_attribute *attr, char *buf)
1271{
1272        struct dasd_device *device;
1273        int len;
1274
1275        device = dasd_device_from_cdev(to_ccwdev(dev));
1276        if (IS_ERR(device))
1277                return -ENODEV;
1278        len = snprintf(buf, PAGE_SIZE, "%lu\n", device->default_retries);
1279        dasd_put_device(device);
1280        return len;
1281}
1282
1283static ssize_t
1284dasd_retries_store(struct device *dev, struct device_attribute *attr,
1285                   const char *buf, size_t count)
1286{
1287        struct dasd_device *device;
1288        unsigned long val;
1289
1290        device = dasd_device_from_cdev(to_ccwdev(dev));
1291        if (IS_ERR(device))
1292                return -ENODEV;
1293
1294        if ((kstrtoul(buf, 10, &val) != 0) ||
1295            (val > DASD_RETRIES_MAX)) {
1296                dasd_put_device(device);
1297                return -EINVAL;
1298        }
1299
1300        if (val)
1301                device->default_retries = val;
1302
1303        dasd_put_device(device);
1304        return count;
1305}
1306
1307static DEVICE_ATTR(retries, 0644, dasd_retries_show, dasd_retries_store);
1308
1309static ssize_t
1310dasd_timeout_show(struct device *dev, struct device_attribute *attr,
1311                  char *buf)
1312{
1313        struct dasd_device *device;
1314        int len;
1315
1316        device = dasd_device_from_cdev(to_ccwdev(dev));
1317        if (IS_ERR(device))
1318                return -ENODEV;
1319        len = snprintf(buf, PAGE_SIZE, "%lu\n", device->blk_timeout);
1320        dasd_put_device(device);
1321        return len;
1322}
1323
1324static ssize_t
1325dasd_timeout_store(struct device *dev, struct device_attribute *attr,
1326                   const char *buf, size_t count)
1327{
1328        struct dasd_device *device;
1329        struct request_queue *q;
1330        unsigned long val;
1331
1332        device = dasd_device_from_cdev(to_ccwdev(dev));
1333        if (IS_ERR(device) || !device->block)
1334                return -ENODEV;
1335
1336        if ((kstrtoul(buf, 10, &val) != 0) ||
1337            val > UINT_MAX / HZ) {
1338                dasd_put_device(device);
1339                return -EINVAL;
1340        }
1341        q = device->block->request_queue;
1342        if (!q) {
1343                dasd_put_device(device);
1344                return -ENODEV;
1345        }
1346
1347        device->blk_timeout = val;
1348
1349        blk_queue_rq_timeout(q, device->blk_timeout * HZ);
1350
1351        dasd_put_device(device);
1352        return count;
1353}
1354
1355static DEVICE_ATTR(timeout, 0644,
1356                   dasd_timeout_show, dasd_timeout_store);
1357
1358
1359static ssize_t
1360dasd_path_reset_store(struct device *dev, struct device_attribute *attr,
1361                      const char *buf, size_t count)
1362{
1363        struct dasd_device *device;
1364        unsigned int val;
1365
1366        device = dasd_device_from_cdev(to_ccwdev(dev));
1367        if (IS_ERR(device))
1368                return -ENODEV;
1369
1370        if ((kstrtouint(buf, 16, &val) != 0) || val > 0xff)
1371                val = 0;
1372
1373        if (device->discipline && device->discipline->reset_path)
1374                device->discipline->reset_path(device, (__u8) val);
1375
1376        dasd_put_device(device);
1377        return count;
1378}
1379
1380static DEVICE_ATTR(path_reset, 0200, NULL, dasd_path_reset_store);
1381
1382static ssize_t dasd_hpf_show(struct device *dev, struct device_attribute *attr,
1383                             char *buf)
1384{
1385        struct dasd_device *device;
1386        int hpf;
1387
1388        device = dasd_device_from_cdev(to_ccwdev(dev));
1389        if (IS_ERR(device))
1390                return -ENODEV;
1391        if (!device->discipline || !device->discipline->hpf_enabled) {
1392                dasd_put_device(device);
1393                return snprintf(buf, PAGE_SIZE, "%d\n", dasd_nofcx);
1394        }
1395        hpf = device->discipline->hpf_enabled(device);
1396        dasd_put_device(device);
1397        return snprintf(buf, PAGE_SIZE, "%d\n", hpf);
1398}
1399
1400static DEVICE_ATTR(hpf, 0444, dasd_hpf_show, NULL);
1401
1402static ssize_t dasd_reservation_policy_show(struct device *dev,
1403                                            struct device_attribute *attr,
1404                                            char *buf)
1405{
1406        struct dasd_devmap *devmap;
1407        int rc = 0;
1408
1409        devmap = dasd_find_busid(dev_name(dev));
1410        if (IS_ERR(devmap)) {
1411                rc = snprintf(buf, PAGE_SIZE, "ignore\n");
1412        } else {
1413                spin_lock(&dasd_devmap_lock);
1414                if (devmap->features & DASD_FEATURE_FAILONSLCK)
1415                        rc = snprintf(buf, PAGE_SIZE, "fail\n");
1416                else
1417                        rc = snprintf(buf, PAGE_SIZE, "ignore\n");
1418                spin_unlock(&dasd_devmap_lock);
1419        }
1420        return rc;
1421}
1422
1423static ssize_t dasd_reservation_policy_store(struct device *dev,
1424                                             struct device_attribute *attr,
1425                                             const char *buf, size_t count)
1426{
1427        struct ccw_device *cdev = to_ccwdev(dev);
1428        int rc;
1429
1430        if (sysfs_streq("ignore", buf))
1431                rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 0);
1432        else if (sysfs_streq("fail", buf))
1433                rc = dasd_set_feature(cdev, DASD_FEATURE_FAILONSLCK, 1);
1434        else
1435                rc = -EINVAL;
1436
1437        return rc ? : count;
1438}
1439
1440static DEVICE_ATTR(reservation_policy, 0644,
1441                   dasd_reservation_policy_show, dasd_reservation_policy_store);
1442
1443static ssize_t dasd_reservation_state_show(struct device *dev,
1444                                           struct device_attribute *attr,
1445                                           char *buf)
1446{
1447        struct dasd_device *device;
1448        int rc = 0;
1449
1450        device = dasd_device_from_cdev(to_ccwdev(dev));
1451        if (IS_ERR(device))
1452                return snprintf(buf, PAGE_SIZE, "none\n");
1453
1454        if (test_bit(DASD_FLAG_IS_RESERVED, &device->flags))
1455                rc = snprintf(buf, PAGE_SIZE, "reserved\n");
1456        else if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags))
1457                rc = snprintf(buf, PAGE_SIZE, "lost\n");
1458        else
1459                rc = snprintf(buf, PAGE_SIZE, "none\n");
1460        dasd_put_device(device);
1461        return rc;
1462}
1463
1464static ssize_t dasd_reservation_state_store(struct device *dev,
1465                                            struct device_attribute *attr,
1466                                            const char *buf, size_t count)
1467{
1468        struct dasd_device *device;
1469        int rc = 0;
1470
1471        device = dasd_device_from_cdev(to_ccwdev(dev));
1472        if (IS_ERR(device))
1473                return -ENODEV;
1474        if (sysfs_streq("reset", buf))
1475                clear_bit(DASD_FLAG_LOCK_STOLEN, &device->flags);
1476        else
1477                rc = -EINVAL;
1478        dasd_put_device(device);
1479
1480        if (rc)
1481                return rc;
1482        else
1483                return count;
1484}
1485
1486static DEVICE_ATTR(last_known_reservation_state, 0644,
1487                   dasd_reservation_state_show, dasd_reservation_state_store);
1488
1489static ssize_t dasd_pm_show(struct device *dev,
1490                              struct device_attribute *attr, char *buf)
1491{
1492        struct dasd_device *device;
1493        u8 opm, nppm, cablepm, cuirpm, hpfpm, ifccpm;
1494
1495        device = dasd_device_from_cdev(to_ccwdev(dev));
1496        if (IS_ERR(device))
1497                return sprintf(buf, "0\n");
1498
1499        opm = dasd_path_get_opm(device);
1500        nppm = dasd_path_get_nppm(device);
1501        cablepm = dasd_path_get_cablepm(device);
1502        cuirpm = dasd_path_get_cuirpm(device);
1503        hpfpm = dasd_path_get_hpfpm(device);
1504        ifccpm = dasd_path_get_ifccpm(device);
1505        dasd_put_device(device);
1506
1507        return sprintf(buf, "%02x %02x %02x %02x %02x %02x\n", opm, nppm,
1508                       cablepm, cuirpm, hpfpm, ifccpm);
1509}
1510
1511static DEVICE_ATTR(path_masks, 0444, dasd_pm_show, NULL);
1512
1513/*
1514 * threshold value for IFCC/CCC errors
1515 */
1516static ssize_t
1517dasd_path_threshold_show(struct device *dev,
1518                          struct device_attribute *attr, char *buf)
1519{
1520        struct dasd_device *device;
1521        int len;
1522
1523        device = dasd_device_from_cdev(to_ccwdev(dev));
1524        if (IS_ERR(device))
1525                return -ENODEV;
1526        len = snprintf(buf, PAGE_SIZE, "%lu\n", device->path_thrhld);
1527        dasd_put_device(device);
1528        return len;
1529}
1530
1531static ssize_t
1532dasd_path_threshold_store(struct device *dev, struct device_attribute *attr,
1533                           const char *buf, size_t count)
1534{
1535        struct dasd_device *device;
1536        unsigned long flags;
1537        unsigned long val;
1538
1539        device = dasd_device_from_cdev(to_ccwdev(dev));
1540        if (IS_ERR(device))
1541                return -ENODEV;
1542
1543        if (kstrtoul(buf, 10, &val) != 0 || val > DASD_THRHLD_MAX) {
1544                dasd_put_device(device);
1545                return -EINVAL;
1546        }
1547        spin_lock_irqsave(get_ccwdev_lock(to_ccwdev(dev)), flags);
1548        device->path_thrhld = val;
1549        spin_unlock_irqrestore(get_ccwdev_lock(to_ccwdev(dev)), flags);
1550        dasd_put_device(device);
1551        return count;
1552}
1553static DEVICE_ATTR(path_threshold, 0644, dasd_path_threshold_show,
1554                   dasd_path_threshold_store);
1555
1556/*
1557 * configure if path is disabled after IFCC/CCC error threshold is
1558 * exceeded
1559 */
1560static ssize_t
1561dasd_path_autodisable_show(struct device *dev,
1562                                   struct device_attribute *attr, char *buf)
1563{
1564        struct dasd_devmap *devmap;
1565        int flag;
1566
1567        devmap = dasd_find_busid(dev_name(dev));
1568        if (!IS_ERR(devmap))
1569                flag = (devmap->features & DASD_FEATURE_PATH_AUTODISABLE) != 0;
1570        else
1571                flag = (DASD_FEATURE_DEFAULT &
1572                        DASD_FEATURE_PATH_AUTODISABLE) != 0;
1573        return snprintf(buf, PAGE_SIZE, flag ? "1\n" : "0\n");
1574}
1575
1576static ssize_t
1577dasd_path_autodisable_store(struct device *dev,
1578                                    struct device_attribute *attr,
1579                                    const char *buf, size_t count)
1580{
1581        unsigned int val;
1582        int rc;
1583
1584        if (kstrtouint(buf, 0, &val) || val > 1)
1585                return -EINVAL;
1586
1587        rc = dasd_set_feature(to_ccwdev(dev),
1588                              DASD_FEATURE_PATH_AUTODISABLE, val);
1589
1590        return rc ? : count;
1591}
1592
1593static DEVICE_ATTR(path_autodisable, 0644,
1594                   dasd_path_autodisable_show,
1595                   dasd_path_autodisable_store);
1596/*
1597 * interval for IFCC/CCC checks
1598 * meaning time with no IFCC/CCC error before the error counter
1599 * gets reset
1600 */
1601static ssize_t
1602dasd_path_interval_show(struct device *dev,
1603                        struct device_attribute *attr, char *buf)
1604{
1605        struct dasd_device *device;
1606        int len;
1607
1608        device = dasd_device_from_cdev(to_ccwdev(dev));
1609        if (IS_ERR(device))
1610                return -ENODEV;
1611        len = snprintf(buf, PAGE_SIZE, "%lu\n", device->path_interval);
1612        dasd_put_device(device);
1613        return len;
1614}
1615
1616static ssize_t
1617dasd_path_interval_store(struct device *dev, struct device_attribute *attr,
1618               const char *buf, size_t count)
1619{
1620        struct dasd_device *device;
1621        unsigned long flags;
1622        unsigned long val;
1623
1624        device = dasd_device_from_cdev(to_ccwdev(dev));
1625        if (IS_ERR(device))
1626                return -ENODEV;
1627
1628        if ((kstrtoul(buf, 10, &val) != 0) ||
1629            (val > DASD_INTERVAL_MAX) || val == 0) {
1630                dasd_put_device(device);
1631                return -EINVAL;
1632        }
1633        spin_lock_irqsave(get_ccwdev_lock(to_ccwdev(dev)), flags);
1634        if (val)
1635                device->path_interval = val;
1636        spin_unlock_irqrestore(get_ccwdev_lock(to_ccwdev(dev)), flags);
1637        dasd_put_device(device);
1638        return count;
1639}
1640
1641static DEVICE_ATTR(path_interval, 0644, dasd_path_interval_show,
1642                   dasd_path_interval_store);
1643
1644
1645#define DASD_DEFINE_ATTR(_name, _func)                                  \
1646static ssize_t dasd_##_name##_show(struct device *dev,                  \
1647                                   struct device_attribute *attr,       \
1648                                   char *buf)                           \
1649{                                                                       \
1650        struct ccw_device *cdev = to_ccwdev(dev);                       \
1651        struct dasd_device *device = dasd_device_from_cdev(cdev);       \
1652        int val = 0;                                                    \
1653                                                                        \
1654        if (IS_ERR(device))                                             \
1655                return -ENODEV;                                         \
1656        if (device->discipline && _func)                                \
1657                val = _func(device);                                    \
1658        dasd_put_device(device);                                        \
1659                                                                        \
1660        return snprintf(buf, PAGE_SIZE, "%d\n", val);                   \
1661}                                                                       \
1662static DEVICE_ATTR(_name, 0444, dasd_##_name##_show, NULL);             \
1663
1664DASD_DEFINE_ATTR(ese, device->discipline->is_ese);
1665DASD_DEFINE_ATTR(extent_size, device->discipline->ext_size);
1666DASD_DEFINE_ATTR(pool_id, device->discipline->ext_pool_id);
1667DASD_DEFINE_ATTR(space_configured, device->discipline->space_configured);
1668DASD_DEFINE_ATTR(space_allocated, device->discipline->space_allocated);
1669DASD_DEFINE_ATTR(logical_capacity, device->discipline->logical_capacity);
1670DASD_DEFINE_ATTR(warn_threshold, device->discipline->ext_pool_warn_thrshld);
1671DASD_DEFINE_ATTR(cap_at_warnlevel, device->discipline->ext_pool_cap_at_warnlevel);
1672DASD_DEFINE_ATTR(pool_oos, device->discipline->ext_pool_oos);
1673
1674static struct attribute * dasd_attrs[] = {
1675        &dev_attr_readonly.attr,
1676        &dev_attr_discipline.attr,
1677        &dev_attr_status.attr,
1678        &dev_attr_alias.attr,
1679        &dev_attr_vendor.attr,
1680        &dev_attr_uid.attr,
1681        &dev_attr_use_diag.attr,
1682        &dev_attr_raw_track_access.attr,
1683        &dev_attr_eer_enabled.attr,
1684        &dev_attr_erplog.attr,
1685        &dev_attr_failfast.attr,
1686        &dev_attr_expires.attr,
1687        &dev_attr_retries.attr,
1688        &dev_attr_timeout.attr,
1689        &dev_attr_reservation_policy.attr,
1690        &dev_attr_last_known_reservation_state.attr,
1691        &dev_attr_safe_offline.attr,
1692        &dev_attr_host_access_count.attr,
1693        &dev_attr_path_masks.attr,
1694        &dev_attr_path_threshold.attr,
1695        &dev_attr_path_autodisable.attr,
1696        &dev_attr_path_interval.attr,
1697        &dev_attr_path_reset.attr,
1698        &dev_attr_hpf.attr,
1699        &dev_attr_ese.attr,
1700        NULL,
1701};
1702
1703static const struct attribute_group dasd_attr_group = {
1704        .attrs = dasd_attrs,
1705};
1706
1707static struct attribute *capacity_attrs[] = {
1708        &dev_attr_space_configured.attr,
1709        &dev_attr_space_allocated.attr,
1710        &dev_attr_logical_capacity.attr,
1711        NULL,
1712};
1713
1714static const struct attribute_group capacity_attr_group = {
1715        .name = "capacity",
1716        .attrs = capacity_attrs,
1717};
1718
1719static struct attribute *ext_pool_attrs[] = {
1720        &dev_attr_pool_id.attr,
1721        &dev_attr_extent_size.attr,
1722        &dev_attr_warn_threshold.attr,
1723        &dev_attr_cap_at_warnlevel.attr,
1724        &dev_attr_pool_oos.attr,
1725        NULL,
1726};
1727
1728static const struct attribute_group ext_pool_attr_group = {
1729        .name = "extent_pool",
1730        .attrs = ext_pool_attrs,
1731};
1732
1733static const struct attribute_group *dasd_attr_groups[] = {
1734        &dasd_attr_group,
1735        &capacity_attr_group,
1736        &ext_pool_attr_group,
1737        NULL,
1738};
1739
1740/*
1741 * Return value of the specified feature.
1742 */
1743int
1744dasd_get_feature(struct ccw_device *cdev, int feature)
1745{
1746        struct dasd_devmap *devmap;
1747
1748        devmap = dasd_find_busid(dev_name(&cdev->dev));
1749        if (IS_ERR(devmap))
1750                return PTR_ERR(devmap);
1751
1752        return ((devmap->features & feature) != 0);
1753}
1754
1755/*
1756 * Set / reset given feature.
1757 * Flag indicates whether to set (!=0) or the reset (=0) the feature.
1758 */
1759int
1760dasd_set_feature(struct ccw_device *cdev, int feature, int flag)
1761{
1762        struct dasd_devmap *devmap;
1763
1764        devmap = dasd_devmap_from_cdev(cdev);
1765        if (IS_ERR(devmap))
1766                return PTR_ERR(devmap);
1767
1768        spin_lock(&dasd_devmap_lock);
1769        if (flag)
1770                devmap->features |= feature;
1771        else
1772                devmap->features &= ~feature;
1773        if (devmap->device)
1774                devmap->device->features = devmap->features;
1775        spin_unlock(&dasd_devmap_lock);
1776        return 0;
1777}
1778EXPORT_SYMBOL(dasd_set_feature);
1779
1780
1781int dasd_add_sysfs_files(struct ccw_device *cdev)
1782{
1783        return sysfs_create_groups(&cdev->dev.kobj, dasd_attr_groups);
1784}
1785
1786void
1787dasd_remove_sysfs_files(struct ccw_device *cdev)
1788{
1789        sysfs_remove_groups(&cdev->dev.kobj, dasd_attr_groups);
1790}
1791
1792
1793int
1794dasd_devmap_init(void)
1795{
1796        int i;
1797
1798        /* Initialize devmap structures. */
1799        dasd_max_devindex = 0;
1800        for (i = 0; i < 256; i++)
1801                INIT_LIST_HEAD(&dasd_hashlists[i]);
1802        return 0;
1803}
1804
1805void
1806dasd_devmap_exit(void)
1807{
1808        dasd_forget_ranges();
1809}
1810