linux/fs/partitions/check.c
<<
>>
Prefs
   1/*
   2 *  fs/partitions/check.c
   3 *
   4 *  Code extracted from drivers/block/genhd.c
   5 *  Copyright (C) 1991-1998  Linus Torvalds
   6 *  Re-organised Feb 1998 Russell King
   7 *
   8 *  We now have independent partition support from the
   9 *  block drivers, which allows all the partition code to
  10 *  be grouped in one location, and it to be mostly self
  11 *  contained.
  12 *
  13 *  Added needed MAJORS for new pairs, {hdi,hdj}, {hdk,hdl}
  14 */
  15
  16#include <linux/init.h>
  17#include <linux/module.h>
  18#include <linux/fs.h>
  19#include <linux/kmod.h>
  20#include <linux/ctype.h>
  21#include <linux/genhd.h>
  22#include <linux/blktrace_api.h>
  23
  24#include "check.h"
  25
  26#include "acorn.h"
  27#include "amiga.h"
  28#include "atari.h"
  29#include "ldm.h"
  30#include "mac.h"
  31#include "msdos.h"
  32#include "osf.h"
  33#include "sgi.h"
  34#include "sun.h"
  35#include "ibm.h"
  36#include "ultrix.h"
  37#include "efi.h"
  38#include "karma.h"
  39#include "sysv68.h"
  40
  41#ifdef CONFIG_BLK_DEV_MD
  42extern void md_autodetect_dev(dev_t dev);
  43#endif
  44
  45int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/
  46
  47static int (*check_part[])(struct parsed_partitions *, struct block_device *) = {
  48        /*
  49         * Probe partition formats with tables at disk address 0
  50         * that also have an ADFS boot block at 0xdc0.
  51         */
  52#ifdef CONFIG_ACORN_PARTITION_ICS
  53        adfspart_check_ICS,
  54#endif
  55#ifdef CONFIG_ACORN_PARTITION_POWERTEC
  56        adfspart_check_POWERTEC,
  57#endif
  58#ifdef CONFIG_ACORN_PARTITION_EESOX
  59        adfspart_check_EESOX,
  60#endif
  61
  62        /*
  63         * Now move on to formats that only have partition info at
  64         * disk address 0xdc0.  Since these may also have stale
  65         * PC/BIOS partition tables, they need to come before
  66         * the msdos entry.
  67         */
  68#ifdef CONFIG_ACORN_PARTITION_CUMANA
  69        adfspart_check_CUMANA,
  70#endif
  71#ifdef CONFIG_ACORN_PARTITION_ADFS
  72        adfspart_check_ADFS,
  73#endif
  74
  75#ifdef CONFIG_EFI_PARTITION
  76        efi_partition,          /* this must come before msdos */
  77#endif
  78#ifdef CONFIG_SGI_PARTITION
  79        sgi_partition,
  80#endif
  81#ifdef CONFIG_LDM_PARTITION
  82        ldm_partition,          /* this must come before msdos */
  83#endif
  84#ifdef CONFIG_MSDOS_PARTITION
  85        msdos_partition,
  86#endif
  87#ifdef CONFIG_OSF_PARTITION
  88        osf_partition,
  89#endif
  90#ifdef CONFIG_SUN_PARTITION
  91        sun_partition,
  92#endif
  93#ifdef CONFIG_AMIGA_PARTITION
  94        amiga_partition,
  95#endif
  96#ifdef CONFIG_ATARI_PARTITION
  97        atari_partition,
  98#endif
  99#ifdef CONFIG_MAC_PARTITION
 100        mac_partition,
 101#endif
 102#ifdef CONFIG_ULTRIX_PARTITION
 103        ultrix_partition,
 104#endif
 105#ifdef CONFIG_IBM_PARTITION
 106        ibm_partition,
 107#endif
 108#ifdef CONFIG_KARMA_PARTITION
 109        karma_partition,
 110#endif
 111#ifdef CONFIG_SYSV68_PARTITION
 112        sysv68_partition,
 113#endif
 114        NULL
 115};
 116 
 117/*
 118 * disk_name() is used by partition check code and the genhd driver.
 119 * It formats the devicename of the indicated disk into
 120 * the supplied buffer (of size at least 32), and returns
 121 * a pointer to that same buffer (for convenience).
 122 */
 123
 124char *disk_name(struct gendisk *hd, int partno, char *buf)
 125{
 126        if (!partno)
 127                snprintf(buf, BDEVNAME_SIZE, "%s", hd->disk_name);
 128        else if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
 129                snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno);
 130        else
 131                snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno);
 132
 133        return buf;
 134}
 135
 136const char *bdevname(struct block_device *bdev, char *buf)
 137{
 138        return disk_name(bdev->bd_disk, bdev->bd_part->partno, buf);
 139}
 140
 141EXPORT_SYMBOL(bdevname);
 142
 143/*
 144 * There's very little reason to use this, you should really
 145 * have a struct block_device just about everywhere and use
 146 * bdevname() instead.
 147 */
 148const char *__bdevname(dev_t dev, char *buffer)
 149{
 150        scnprintf(buffer, BDEVNAME_SIZE, "unknown-block(%u,%u)",
 151                                MAJOR(dev), MINOR(dev));
 152        return buffer;
 153}
 154
 155EXPORT_SYMBOL(__bdevname);
 156
 157static struct parsed_partitions *
 158check_partition(struct gendisk *hd, struct block_device *bdev)
 159{
 160        struct parsed_partitions *state;
 161        int i, res, err;
 162
 163        state = kmalloc(sizeof(struct parsed_partitions), GFP_KERNEL);
 164        if (!state)
 165                return NULL;
 166
 167        disk_name(hd, 0, state->name);
 168        printk(KERN_INFO " %s:", state->name);
 169        if (isdigit(state->name[strlen(state->name)-1]))
 170                sprintf(state->name, "p");
 171
 172        state->limit = disk_max_parts(hd);
 173        i = res = err = 0;
 174        while (!res && check_part[i]) {
 175                memset(&state->parts, 0, sizeof(state->parts));
 176                res = check_part[i++](state, bdev);
 177                if (res < 0) {
 178                        /* We have hit an I/O error which we don't report now.
 179                        * But record it, and let the others do their job.
 180                        */
 181                        err = res;
 182                        res = 0;
 183                }
 184
 185        }
 186        if (res > 0)
 187                return state;
 188        if (err)
 189        /* The partition is unrecognized. So report I/O errors if there were any */
 190                res = err;
 191        if (!res)
 192                printk(" unknown partition table\n");
 193        else if (warn_no_part)
 194                printk(" unable to read partition table\n");
 195        kfree(state);
 196        return ERR_PTR(res);
 197}
 198
 199static ssize_t part_partition_show(struct device *dev,
 200                                   struct device_attribute *attr, char *buf)
 201{
 202        struct hd_struct *p = dev_to_part(dev);
 203
 204        return sprintf(buf, "%d\n", p->partno);
 205}
 206
 207static ssize_t part_start_show(struct device *dev,
 208                               struct device_attribute *attr, char *buf)
 209{
 210        struct hd_struct *p = dev_to_part(dev);
 211
 212        return sprintf(buf, "%llu\n",(unsigned long long)p->start_sect);
 213}
 214
 215ssize_t part_size_show(struct device *dev,
 216                       struct device_attribute *attr, char *buf)
 217{
 218        struct hd_struct *p = dev_to_part(dev);
 219        return sprintf(buf, "%llu\n",(unsigned long long)p->nr_sects);
 220}
 221
 222ssize_t part_alignment_offset_show(struct device *dev,
 223                                   struct device_attribute *attr, char *buf)
 224{
 225        struct hd_struct *p = dev_to_part(dev);
 226        return sprintf(buf, "%llu\n", (unsigned long long)p->alignment_offset);
 227}
 228
 229ssize_t part_stat_show(struct device *dev,
 230                       struct device_attribute *attr, char *buf)
 231{
 232        struct hd_struct *p = dev_to_part(dev);
 233        int cpu;
 234
 235        cpu = part_stat_lock();
 236        part_round_stats(cpu, p);
 237        part_stat_unlock();
 238        return sprintf(buf,
 239                "%8lu %8lu %8llu %8u "
 240                "%8lu %8lu %8llu %8u "
 241                "%8u %8u %8u"
 242                "\n",
 243                part_stat_read(p, ios[READ]),
 244                part_stat_read(p, merges[READ]),
 245                (unsigned long long)part_stat_read(p, sectors[READ]),
 246                jiffies_to_msecs(part_stat_read(p, ticks[READ])),
 247                part_stat_read(p, ios[WRITE]),
 248                part_stat_read(p, merges[WRITE]),
 249                (unsigned long long)part_stat_read(p, sectors[WRITE]),
 250                jiffies_to_msecs(part_stat_read(p, ticks[WRITE])),
 251                part_in_flight(p),
 252                jiffies_to_msecs(part_stat_read(p, io_ticks)),
 253                jiffies_to_msecs(part_stat_read(p, time_in_queue)));
 254}
 255
 256ssize_t part_inflight_show(struct device *dev,
 257                        struct device_attribute *attr, char *buf)
 258{
 259        struct hd_struct *p = dev_to_part(dev);
 260
 261        return sprintf(buf, "%8u %8u\n", p->in_flight[0], p->in_flight[1]);
 262}
 263
 264#ifdef CONFIG_FAIL_MAKE_REQUEST
 265ssize_t part_fail_show(struct device *dev,
 266                       struct device_attribute *attr, char *buf)
 267{
 268        struct hd_struct *p = dev_to_part(dev);
 269
 270        return sprintf(buf, "%d\n", p->make_it_fail);
 271}
 272
 273ssize_t part_fail_store(struct device *dev,
 274                        struct device_attribute *attr,
 275                        const char *buf, size_t count)
 276{
 277        struct hd_struct *p = dev_to_part(dev);
 278        int i;
 279
 280        if (count > 0 && sscanf(buf, "%d", &i) > 0)
 281                p->make_it_fail = (i == 0) ? 0 : 1;
 282
 283        return count;
 284}
 285#endif
 286
 287static DEVICE_ATTR(partition, S_IRUGO, part_partition_show, NULL);
 288static DEVICE_ATTR(start, S_IRUGO, part_start_show, NULL);
 289static DEVICE_ATTR(size, S_IRUGO, part_size_show, NULL);
 290static DEVICE_ATTR(alignment_offset, S_IRUGO, part_alignment_offset_show, NULL);
 291static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL);
 292static DEVICE_ATTR(inflight, S_IRUGO, part_inflight_show, NULL);
 293#ifdef CONFIG_FAIL_MAKE_REQUEST
 294static struct device_attribute dev_attr_fail =
 295        __ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store);
 296#endif
 297
 298static struct attribute *part_attrs[] = {
 299        &dev_attr_partition.attr,
 300        &dev_attr_start.attr,
 301        &dev_attr_size.attr,
 302        &dev_attr_alignment_offset.attr,
 303        &dev_attr_stat.attr,
 304        &dev_attr_inflight.attr,
 305#ifdef CONFIG_FAIL_MAKE_REQUEST
 306        &dev_attr_fail.attr,
 307#endif
 308        NULL
 309};
 310
 311static struct attribute_group part_attr_group = {
 312        .attrs = part_attrs,
 313};
 314
 315static const struct attribute_group *part_attr_groups[] = {
 316        &part_attr_group,
 317#ifdef CONFIG_BLK_DEV_IO_TRACE
 318        &blk_trace_attr_group,
 319#endif
 320        NULL
 321};
 322
 323static void part_release(struct device *dev)
 324{
 325        struct hd_struct *p = dev_to_part(dev);
 326        free_part_stats(p);
 327        kfree(p);
 328}
 329
 330struct device_type part_type = {
 331        .name           = "partition",
 332        .groups         = part_attr_groups,
 333        .release        = part_release,
 334};
 335
 336static void delete_partition_rcu_cb(struct rcu_head *head)
 337{
 338        struct hd_struct *part = container_of(head, struct hd_struct, rcu_head);
 339
 340        part->start_sect = 0;
 341        part->nr_sects = 0;
 342        part_stat_set_all(part, 0);
 343        put_device(part_to_dev(part));
 344}
 345
 346void delete_partition(struct gendisk *disk, int partno)
 347{
 348        struct disk_part_tbl *ptbl = disk->part_tbl;
 349        struct hd_struct *part;
 350
 351        if (partno >= ptbl->len)
 352                return;
 353
 354        part = ptbl->part[partno];
 355        if (!part)
 356                return;
 357
 358        blk_free_devt(part_devt(part));
 359        rcu_assign_pointer(ptbl->part[partno], NULL);
 360        rcu_assign_pointer(ptbl->last_lookup, NULL);
 361        kobject_put(part->holder_dir);
 362        device_del(part_to_dev(part));
 363
 364        call_rcu(&part->rcu_head, delete_partition_rcu_cb);
 365}
 366
 367static ssize_t whole_disk_show(struct device *dev,
 368                               struct device_attribute *attr, char *buf)
 369{
 370        return 0;
 371}
 372static DEVICE_ATTR(whole_disk, S_IRUSR | S_IRGRP | S_IROTH,
 373                   whole_disk_show, NULL);
 374
 375struct hd_struct *add_partition(struct gendisk *disk, int partno,
 376                                sector_t start, sector_t len, int flags)
 377{
 378        struct hd_struct *p;
 379        dev_t devt = MKDEV(0, 0);
 380        struct device *ddev = disk_to_dev(disk);
 381        struct device *pdev;
 382        struct disk_part_tbl *ptbl;
 383        const char *dname;
 384        int err;
 385
 386        err = disk_expand_part_tbl(disk, partno);
 387        if (err)
 388                return ERR_PTR(err);
 389        ptbl = disk->part_tbl;
 390
 391        if (ptbl->part[partno])
 392                return ERR_PTR(-EBUSY);
 393
 394        p = kzalloc(sizeof(*p), GFP_KERNEL);
 395        if (!p)
 396                return ERR_PTR(-EBUSY);
 397
 398        if (!init_part_stats(p)) {
 399                err = -ENOMEM;
 400                goto out_free;
 401        }
 402        pdev = part_to_dev(p);
 403
 404        p->start_sect = start;
 405        p->alignment_offset = queue_sector_alignment_offset(disk->queue, start);
 406        p->nr_sects = len;
 407        p->partno = partno;
 408        p->policy = get_disk_ro(disk);
 409
 410        dname = dev_name(ddev);
 411        if (isdigit(dname[strlen(dname) - 1]))
 412                dev_set_name(pdev, "%sp%d", dname, partno);
 413        else
 414                dev_set_name(pdev, "%s%d", dname, partno);
 415
 416        device_initialize(pdev);
 417        pdev->class = &block_class;
 418        pdev->type = &part_type;
 419        pdev->parent = ddev;
 420
 421        err = blk_alloc_devt(p, &devt);
 422        if (err)
 423                goto out_free_stats;
 424        pdev->devt = devt;
 425
 426        /* delay uevent until 'holders' subdir is created */
 427        dev_set_uevent_suppress(pdev, 1);
 428        err = device_add(pdev);
 429        if (err)
 430                goto out_put;
 431
 432        err = -ENOMEM;
 433        p->holder_dir = kobject_create_and_add("holders", &pdev->kobj);
 434        if (!p->holder_dir)
 435                goto out_del;
 436
 437        dev_set_uevent_suppress(pdev, 0);
 438        if (flags & ADDPART_FLAG_WHOLEDISK) {
 439                err = device_create_file(pdev, &dev_attr_whole_disk);
 440                if (err)
 441                        goto out_del;
 442        }
 443
 444        /* everything is up and running, commence */
 445        INIT_RCU_HEAD(&p->rcu_head);
 446        rcu_assign_pointer(ptbl->part[partno], p);
 447
 448        /* suppress uevent if the disk supresses it */
 449        if (!dev_get_uevent_suppress(ddev))
 450                kobject_uevent(&pdev->kobj, KOBJ_ADD);
 451
 452        return p;
 453
 454out_free_stats:
 455        free_part_stats(p);
 456out_free:
 457        kfree(p);
 458        return ERR_PTR(err);
 459out_del:
 460        kobject_put(p->holder_dir);
 461        device_del(pdev);
 462out_put:
 463        put_device(pdev);
 464        blk_free_devt(devt);
 465        return ERR_PTR(err);
 466}
 467
 468/* Not exported, helper to add_disk(). */
 469void register_disk(struct gendisk *disk)
 470{
 471        struct device *ddev = disk_to_dev(disk);
 472        struct block_device *bdev;
 473        struct disk_part_iter piter;
 474        struct hd_struct *part;
 475        int err;
 476
 477        ddev->parent = disk->driverfs_dev;
 478
 479        dev_set_name(ddev, disk->disk_name);
 480
 481        /* delay uevents, until we scanned partition table */
 482        dev_set_uevent_suppress(ddev, 1);
 483
 484        if (device_add(ddev))
 485                return;
 486#ifndef CONFIG_SYSFS_DEPRECATED
 487        err = sysfs_create_link(block_depr, &ddev->kobj,
 488                                kobject_name(&ddev->kobj));
 489        if (err) {
 490                device_del(ddev);
 491                return;
 492        }
 493#endif
 494        disk->part0.holder_dir = kobject_create_and_add("holders", &ddev->kobj);
 495        disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj);
 496
 497        /* No minors to use for partitions */
 498        if (!disk_partitionable(disk))
 499                goto exit;
 500
 501        /* No such device (e.g., media were just removed) */
 502        if (!get_capacity(disk))
 503                goto exit;
 504
 505        bdev = bdget_disk(disk, 0);
 506        if (!bdev)
 507                goto exit;
 508
 509        bdev->bd_invalidated = 1;
 510        err = blkdev_get(bdev, FMODE_READ);
 511        if (err < 0)
 512                goto exit;
 513        blkdev_put(bdev, FMODE_READ);
 514
 515exit:
 516        /* announce disk after possible partitions are created */
 517        dev_set_uevent_suppress(ddev, 0);
 518        kobject_uevent(&ddev->kobj, KOBJ_ADD);
 519
 520        /* announce possible partitions */
 521        disk_part_iter_init(&piter, disk, 0);
 522        while ((part = disk_part_iter_next(&piter)))
 523                kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
 524        disk_part_iter_exit(&piter);
 525}
 526
 527int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
 528{
 529        struct disk_part_iter piter;
 530        struct hd_struct *part;
 531        struct parsed_partitions *state;
 532        int p, highest, res;
 533
 534        if (bdev->bd_part_count)
 535                return -EBUSY;
 536        res = invalidate_partition(disk, 0);
 537        if (res)
 538                return res;
 539
 540        disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY);
 541        while ((part = disk_part_iter_next(&piter)))
 542                delete_partition(disk, part->partno);
 543        disk_part_iter_exit(&piter);
 544
 545        if (disk->fops->revalidate_disk)
 546                disk->fops->revalidate_disk(disk);
 547        check_disk_size_change(disk, bdev);
 548        bdev->bd_invalidated = 0;
 549        if (!get_capacity(disk) || !(state = check_partition(disk, bdev)))
 550                return 0;
 551        if (IS_ERR(state))      /* I/O error reading the partition table */
 552                return -EIO;
 553
 554        /* tell userspace that the media / partition table may have changed */
 555        kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
 556
 557        /* Detect the highest partition number and preallocate
 558         * disk->part_tbl.  This is an optimization and not strictly
 559         * necessary.
 560         */
 561        for (p = 1, highest = 0; p < state->limit; p++)
 562                if (state->parts[p].size)
 563                        highest = p;
 564
 565        disk_expand_part_tbl(disk, highest);
 566
 567        /* add partitions */
 568        for (p = 1; p < state->limit; p++) {
 569                sector_t size, from;
 570try_scan:
 571                size = state->parts[p].size;
 572                if (!size)
 573                        continue;
 574
 575                from = state->parts[p].from;
 576                if (from >= get_capacity(disk)) {
 577                        printk(KERN_WARNING
 578                               "%s: p%d ignored, start %llu is behind the end of the disk\n",
 579                               disk->disk_name, p, (unsigned long long) from);
 580                        continue;
 581                }
 582
 583                if (from + size > get_capacity(disk)) {
 584                        const struct block_device_operations *bdops = disk->fops;
 585                        unsigned long long capacity;
 586
 587                        printk(KERN_WARNING
 588                               "%s: p%d size %llu exceeds device capacity, ",
 589                               disk->disk_name, p, (unsigned long long) size);
 590
 591                        if (bdops->set_capacity &&
 592                            (disk->flags & GENHD_FL_NATIVE_CAPACITY) == 0) {
 593                                printk(KERN_CONT "enabling native capacity\n");
 594                                capacity = bdops->set_capacity(disk, ~0ULL);
 595                                disk->flags |= GENHD_FL_NATIVE_CAPACITY;
 596                                if (capacity > get_capacity(disk)) {
 597                                        set_capacity(disk, capacity);
 598                                        check_disk_size_change(disk, bdev);
 599                                        bdev->bd_invalidated = 0;
 600                                }
 601                                goto try_scan;
 602                        } else {
 603                                /*
 604                                 * we can not ignore partitions of broken tables
 605                                 * created by for example camera firmware, but
 606                                 * we limit them to the end of the disk to avoid
 607                                 * creating invalid block devices
 608                                 */
 609                                printk(KERN_CONT "limited to end of disk\n");
 610                                size = get_capacity(disk) - from;
 611                        }
 612                }
 613                part = add_partition(disk, p, from, size,
 614                                     state->parts[p].flags);
 615                if (IS_ERR(part)) {
 616                        printk(KERN_ERR " %s: p%d could not be added: %ld\n",
 617                               disk->disk_name, p, -PTR_ERR(part));
 618                        continue;
 619                }
 620#ifdef CONFIG_BLK_DEV_MD
 621                if (state->parts[p].flags & ADDPART_FLAG_RAID)
 622                        md_autodetect_dev(part_to_dev(part)->devt);
 623#endif
 624        }
 625        kfree(state);
 626        return 0;
 627}
 628
 629unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
 630{
 631        struct address_space *mapping = bdev->bd_inode->i_mapping;
 632        struct page *page;
 633
 634        page = read_mapping_page(mapping, (pgoff_t)(n >> (PAGE_CACHE_SHIFT-9)),
 635                                 NULL);
 636        if (!IS_ERR(page)) {
 637                if (PageError(page))
 638                        goto fail;
 639                p->v = page;
 640                return (unsigned char *)page_address(page) +  ((n & ((1 << (PAGE_CACHE_SHIFT - 9)) - 1)) << 9);
 641fail:
 642                page_cache_release(page);
 643        }
 644        p->v = NULL;
 645        return NULL;
 646}
 647
 648EXPORT_SYMBOL(read_dev_sector);
 649
 650void del_gendisk(struct gendisk *disk)
 651{
 652        struct disk_part_iter piter;
 653        struct hd_struct *part;
 654
 655        /* invalidate stuff */
 656        disk_part_iter_init(&piter, disk,
 657                             DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE);
 658        while ((part = disk_part_iter_next(&piter))) {
 659                invalidate_partition(disk, part->partno);
 660                delete_partition(disk, part->partno);
 661        }
 662        disk_part_iter_exit(&piter);
 663
 664        invalidate_partition(disk, 0);
 665        blk_free_devt(disk_to_dev(disk)->devt);
 666        set_capacity(disk, 0);
 667        disk->flags &= ~GENHD_FL_UP;
 668        unlink_gendisk(disk);
 669        part_stat_set_all(&disk->part0, 0);
 670        disk->part0.stamp = 0;
 671
 672        kobject_put(disk->part0.holder_dir);
 673        kobject_put(disk->slave_dir);
 674        disk->driverfs_dev = NULL;
 675#ifndef CONFIG_SYSFS_DEPRECATED
 676        sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
 677#endif
 678        device_del(disk_to_dev(disk));
 679}
 680