block: constify partition prober array
[linux-block.git] / block / partitions / core.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 1991-1998  Linus Torvalds
4  * Re-organised Feb 1998 Russell King
5  * Copyright (C) 2020 Christoph Hellwig
6  */
7 #include <linux/fs.h>
8 #include <linux/major.h>
9 #include <linux/slab.h>
10 #include <linux/ctype.h>
11 #include <linux/vmalloc.h>
12 #include <linux/raid/detect.h>
13 #include "check.h"
14
15 static int (*const check_part[])(struct parsed_partitions *) = {
16         /*
17          * Probe partition formats with tables at disk address 0
18          * that also have an ADFS boot block at 0xdc0.
19          */
20 #ifdef CONFIG_ACORN_PARTITION_ICS
21         adfspart_check_ICS,
22 #endif
23 #ifdef CONFIG_ACORN_PARTITION_POWERTEC
24         adfspart_check_POWERTEC,
25 #endif
26 #ifdef CONFIG_ACORN_PARTITION_EESOX
27         adfspart_check_EESOX,
28 #endif
29
30         /*
31          * Now move on to formats that only have partition info at
32          * disk address 0xdc0.  Since these may also have stale
33          * PC/BIOS partition tables, they need to come before
34          * the msdos entry.
35          */
36 #ifdef CONFIG_ACORN_PARTITION_CUMANA
37         adfspart_check_CUMANA,
38 #endif
39 #ifdef CONFIG_ACORN_PARTITION_ADFS
40         adfspart_check_ADFS,
41 #endif
42
43 #ifdef CONFIG_CMDLINE_PARTITION
44         cmdline_partition,
45 #endif
46 #ifdef CONFIG_EFI_PARTITION
47         efi_partition,          /* this must come before msdos */
48 #endif
49 #ifdef CONFIG_SGI_PARTITION
50         sgi_partition,
51 #endif
52 #ifdef CONFIG_LDM_PARTITION
53         ldm_partition,          /* this must come before msdos */
54 #endif
55 #ifdef CONFIG_MSDOS_PARTITION
56         msdos_partition,
57 #endif
58 #ifdef CONFIG_OSF_PARTITION
59         osf_partition,
60 #endif
61 #ifdef CONFIG_SUN_PARTITION
62         sun_partition,
63 #endif
64 #ifdef CONFIG_AMIGA_PARTITION
65         amiga_partition,
66 #endif
67 #ifdef CONFIG_ATARI_PARTITION
68         atari_partition,
69 #endif
70 #ifdef CONFIG_MAC_PARTITION
71         mac_partition,
72 #endif
73 #ifdef CONFIG_ULTRIX_PARTITION
74         ultrix_partition,
75 #endif
76 #ifdef CONFIG_IBM_PARTITION
77         ibm_partition,
78 #endif
79 #ifdef CONFIG_KARMA_PARTITION
80         karma_partition,
81 #endif
82 #ifdef CONFIG_SYSV68_PARTITION
83         sysv68_partition,
84 #endif
85         NULL
86 };
87
88 static struct parsed_partitions *allocate_partitions(struct gendisk *hd)
89 {
90         struct parsed_partitions *state;
91         int nr = DISK_MAX_PARTS;
92
93         state = kzalloc(sizeof(*state), GFP_KERNEL);
94         if (!state)
95                 return NULL;
96
97         state->parts = vzalloc(array_size(nr, sizeof(state->parts[0])));
98         if (!state->parts) {
99                 kfree(state);
100                 return NULL;
101         }
102
103         state->limit = nr;
104
105         return state;
106 }
107
108 static void free_partitions(struct parsed_partitions *state)
109 {
110         vfree(state->parts);
111         kfree(state);
112 }
113
114 static struct parsed_partitions *check_partition(struct gendisk *hd)
115 {
116         struct parsed_partitions *state;
117         int i, res, err;
118
119         state = allocate_partitions(hd);
120         if (!state)
121                 return NULL;
122         state->pp_buf = (char *)__get_free_page(GFP_KERNEL);
123         if (!state->pp_buf) {
124                 free_partitions(state);
125                 return NULL;
126         }
127         state->pp_buf[0] = '\0';
128
129         state->disk = hd;
130         snprintf(state->name, BDEVNAME_SIZE, "%s", hd->disk_name);
131         snprintf(state->pp_buf, PAGE_SIZE, " %s:", state->name);
132         if (isdigit(state->name[strlen(state->name)-1]))
133                 sprintf(state->name, "p");
134
135         i = res = err = 0;
136         while (!res && check_part[i]) {
137                 memset(state->parts, 0, state->limit * sizeof(state->parts[0]));
138                 res = check_part[i++](state);
139                 if (res < 0) {
140                         /*
141                          * We have hit an I/O error which we don't report now.
142                          * But record it, and let the others do their job.
143                          */
144                         err = res;
145                         res = 0;
146                 }
147
148         }
149         if (res > 0) {
150                 printk(KERN_INFO "%s", state->pp_buf);
151
152                 free_page((unsigned long)state->pp_buf);
153                 return state;
154         }
155         if (state->access_beyond_eod)
156                 err = -ENOSPC;
157         /*
158          * The partition is unrecognized. So report I/O errors if there were any
159          */
160         if (err)
161                 res = err;
162         if (res) {
163                 strlcat(state->pp_buf,
164                         " unable to read partition table\n", PAGE_SIZE);
165                 printk(KERN_INFO "%s", state->pp_buf);
166         }
167
168         free_page((unsigned long)state->pp_buf);
169         free_partitions(state);
170         return ERR_PTR(res);
171 }
172
173 static ssize_t part_partition_show(struct device *dev,
174                                    struct device_attribute *attr, char *buf)
175 {
176         return sprintf(buf, "%d\n", dev_to_bdev(dev)->bd_partno);
177 }
178
179 static ssize_t part_start_show(struct device *dev,
180                                struct device_attribute *attr, char *buf)
181 {
182         return sprintf(buf, "%llu\n", dev_to_bdev(dev)->bd_start_sect);
183 }
184
185 static ssize_t part_ro_show(struct device *dev,
186                             struct device_attribute *attr, char *buf)
187 {
188         return sprintf(buf, "%d\n", bdev_read_only(dev_to_bdev(dev)));
189 }
190
191 static ssize_t part_alignment_offset_show(struct device *dev,
192                                           struct device_attribute *attr, char *buf)
193 {
194         return sprintf(buf, "%u\n", bdev_alignment_offset(dev_to_bdev(dev)));
195 }
196
197 static ssize_t part_discard_alignment_show(struct device *dev,
198                                            struct device_attribute *attr, char *buf)
199 {
200         return sprintf(buf, "%u\n", bdev_discard_alignment(dev_to_bdev(dev)));
201 }
202
203 static DEVICE_ATTR(partition, 0444, part_partition_show, NULL);
204 static DEVICE_ATTR(start, 0444, part_start_show, NULL);
205 static DEVICE_ATTR(size, 0444, part_size_show, NULL);
206 static DEVICE_ATTR(ro, 0444, part_ro_show, NULL);
207 static DEVICE_ATTR(alignment_offset, 0444, part_alignment_offset_show, NULL);
208 static DEVICE_ATTR(discard_alignment, 0444, part_discard_alignment_show, NULL);
209 static DEVICE_ATTR(stat, 0444, part_stat_show, NULL);
210 static DEVICE_ATTR(inflight, 0444, part_inflight_show, NULL);
211 #ifdef CONFIG_FAIL_MAKE_REQUEST
212 static struct device_attribute dev_attr_fail =
213         __ATTR(make-it-fail, 0644, part_fail_show, part_fail_store);
214 #endif
215
216 static struct attribute *part_attrs[] = {
217         &dev_attr_partition.attr,
218         &dev_attr_start.attr,
219         &dev_attr_size.attr,
220         &dev_attr_ro.attr,
221         &dev_attr_alignment_offset.attr,
222         &dev_attr_discard_alignment.attr,
223         &dev_attr_stat.attr,
224         &dev_attr_inflight.attr,
225 #ifdef CONFIG_FAIL_MAKE_REQUEST
226         &dev_attr_fail.attr,
227 #endif
228         NULL
229 };
230
231 static struct attribute_group part_attr_group = {
232         .attrs = part_attrs,
233 };
234
235 static const struct attribute_group *part_attr_groups[] = {
236         &part_attr_group,
237 #ifdef CONFIG_BLK_DEV_IO_TRACE
238         &blk_trace_attr_group,
239 #endif
240         NULL
241 };
242
243 static void part_release(struct device *dev)
244 {
245         put_disk(dev_to_bdev(dev)->bd_disk);
246         iput(dev_to_bdev(dev)->bd_inode);
247 }
248
249 static int part_uevent(const struct device *dev, struct kobj_uevent_env *env)
250 {
251         const struct block_device *part = dev_to_bdev(dev);
252
253         add_uevent_var(env, "PARTN=%u", part->bd_partno);
254         if (part->bd_meta_info && part->bd_meta_info->volname[0])
255                 add_uevent_var(env, "PARTNAME=%s", part->bd_meta_info->volname);
256         return 0;
257 }
258
259 struct device_type part_type = {
260         .name           = "partition",
261         .groups         = part_attr_groups,
262         .release        = part_release,
263         .uevent         = part_uevent,
264 };
265
266 static void delete_partition(struct block_device *part)
267 {
268         lockdep_assert_held(&part->bd_disk->open_mutex);
269
270         fsync_bdev(part);
271         __invalidate_device(part, true);
272
273         xa_erase(&part->bd_disk->part_tbl, part->bd_partno);
274         kobject_put(part->bd_holder_dir);
275         device_del(&part->bd_device);
276
277         /*
278          * Remove the block device from the inode hash, so that it cannot be
279          * looked up any more even when openers still hold references.
280          */
281         remove_inode_hash(part->bd_inode);
282
283         put_device(&part->bd_device);
284 }
285
286 static ssize_t whole_disk_show(struct device *dev,
287                                struct device_attribute *attr, char *buf)
288 {
289         return 0;
290 }
291 static DEVICE_ATTR(whole_disk, 0444, whole_disk_show, NULL);
292
293 /*
294  * Must be called either with open_mutex held, before a disk can be opened or
295  * after all disk users are gone.
296  */
297 static struct block_device *add_partition(struct gendisk *disk, int partno,
298                                 sector_t start, sector_t len, int flags,
299                                 struct partition_meta_info *info)
300 {
301         dev_t devt = MKDEV(0, 0);
302         struct device *ddev = disk_to_dev(disk);
303         struct device *pdev;
304         struct block_device *bdev;
305         const char *dname;
306         int err;
307
308         lockdep_assert_held(&disk->open_mutex);
309
310         if (partno >= DISK_MAX_PARTS)
311                 return ERR_PTR(-EINVAL);
312
313         /*
314          * Partitions are not supported on zoned block devices that are used as
315          * such.
316          */
317         switch (disk->queue->limits.zoned) {
318         case BLK_ZONED_HM:
319                 pr_warn("%s: partitions not supported on host managed zoned block device\n",
320                         disk->disk_name);
321                 return ERR_PTR(-ENXIO);
322         case BLK_ZONED_HA:
323                 pr_info("%s: disabling host aware zoned block device support due to partitions\n",
324                         disk->disk_name);
325                 disk_set_zoned(disk, BLK_ZONED_NONE);
326                 break;
327         case BLK_ZONED_NONE:
328                 break;
329         }
330
331         if (xa_load(&disk->part_tbl, partno))
332                 return ERR_PTR(-EBUSY);
333
334         /* ensure we always have a reference to the whole disk */
335         get_device(disk_to_dev(disk));
336
337         err = -ENOMEM;
338         bdev = bdev_alloc(disk, partno);
339         if (!bdev)
340                 goto out_put_disk;
341
342         bdev->bd_start_sect = start;
343         bdev_set_nr_sectors(bdev, len);
344
345         pdev = &bdev->bd_device;
346         dname = dev_name(ddev);
347         if (isdigit(dname[strlen(dname) - 1]))
348                 dev_set_name(pdev, "%sp%d", dname, partno);
349         else
350                 dev_set_name(pdev, "%s%d", dname, partno);
351
352         device_initialize(pdev);
353         pdev->class = &block_class;
354         pdev->type = &part_type;
355         pdev->parent = ddev;
356
357         /* in consecutive minor range? */
358         if (bdev->bd_partno < disk->minors) {
359                 devt = MKDEV(disk->major, disk->first_minor + bdev->bd_partno);
360         } else {
361                 err = blk_alloc_ext_minor();
362                 if (err < 0)
363                         goto out_put;
364                 devt = MKDEV(BLOCK_EXT_MAJOR, err);
365         }
366         pdev->devt = devt;
367
368         if (info) {
369                 err = -ENOMEM;
370                 bdev->bd_meta_info = kmemdup(info, sizeof(*info), GFP_KERNEL);
371                 if (!bdev->bd_meta_info)
372                         goto out_put;
373         }
374
375         /* delay uevent until 'holders' subdir is created */
376         dev_set_uevent_suppress(pdev, 1);
377         err = device_add(pdev);
378         if (err)
379                 goto out_put;
380
381         err = -ENOMEM;
382         bdev->bd_holder_dir = kobject_create_and_add("holders", &pdev->kobj);
383         if (!bdev->bd_holder_dir)
384                 goto out_del;
385
386         dev_set_uevent_suppress(pdev, 0);
387         if (flags & ADDPART_FLAG_WHOLEDISK) {
388                 err = device_create_file(pdev, &dev_attr_whole_disk);
389                 if (err)
390                         goto out_del;
391         }
392
393         /* everything is up and running, commence */
394         err = xa_insert(&disk->part_tbl, partno, bdev, GFP_KERNEL);
395         if (err)
396                 goto out_del;
397         bdev_add(bdev, devt);
398
399         /* suppress uevent if the disk suppresses it */
400         if (!dev_get_uevent_suppress(ddev))
401                 kobject_uevent(&pdev->kobj, KOBJ_ADD);
402         return bdev;
403
404 out_del:
405         kobject_put(bdev->bd_holder_dir);
406         device_del(pdev);
407 out_put:
408         put_device(pdev);
409         return ERR_PTR(err);
410 out_put_disk:
411         put_disk(disk);
412         return ERR_PTR(err);
413 }
414
415 static bool partition_overlaps(struct gendisk *disk, sector_t start,
416                 sector_t length, int skip_partno)
417 {
418         struct block_device *part;
419         bool overlap = false;
420         unsigned long idx;
421
422         rcu_read_lock();
423         xa_for_each_start(&disk->part_tbl, idx, part, 1) {
424                 if (part->bd_partno != skip_partno &&
425                     start < part->bd_start_sect + bdev_nr_sectors(part) &&
426                     start + length > part->bd_start_sect) {
427                         overlap = true;
428                         break;
429                 }
430         }
431         rcu_read_unlock();
432
433         return overlap;
434 }
435
436 int bdev_add_partition(struct gendisk *disk, int partno, sector_t start,
437                 sector_t length)
438 {
439         struct block_device *part;
440         int ret;
441
442         mutex_lock(&disk->open_mutex);
443         if (!disk_live(disk)) {
444                 ret = -ENXIO;
445                 goto out;
446         }
447
448         if (partition_overlaps(disk, start, length, -1)) {
449                 ret = -EBUSY;
450                 goto out;
451         }
452
453         part = add_partition(disk, partno, start, length,
454                         ADDPART_FLAG_NONE, NULL);
455         ret = PTR_ERR_OR_ZERO(part);
456 out:
457         mutex_unlock(&disk->open_mutex);
458         return ret;
459 }
460
461 int bdev_del_partition(struct gendisk *disk, int partno)
462 {
463         struct block_device *part = NULL;
464         int ret = -ENXIO;
465
466         mutex_lock(&disk->open_mutex);
467         part = xa_load(&disk->part_tbl, partno);
468         if (!part)
469                 goto out_unlock;
470
471         ret = -EBUSY;
472         if (atomic_read(&part->bd_openers))
473                 goto out_unlock;
474
475         delete_partition(part);
476         ret = 0;
477 out_unlock:
478         mutex_unlock(&disk->open_mutex);
479         return ret;
480 }
481
482 int bdev_resize_partition(struct gendisk *disk, int partno, sector_t start,
483                 sector_t length)
484 {
485         struct block_device *part = NULL;
486         int ret = -ENXIO;
487
488         mutex_lock(&disk->open_mutex);
489         part = xa_load(&disk->part_tbl, partno);
490         if (!part)
491                 goto out_unlock;
492
493         ret = -EINVAL;
494         if (start != part->bd_start_sect)
495                 goto out_unlock;
496
497         ret = -EBUSY;
498         if (partition_overlaps(disk, start, length, partno))
499                 goto out_unlock;
500
501         bdev_set_nr_sectors(part, length);
502
503         ret = 0;
504 out_unlock:
505         mutex_unlock(&disk->open_mutex);
506         return ret;
507 }
508
509 static bool disk_unlock_native_capacity(struct gendisk *disk)
510 {
511         if (!disk->fops->unlock_native_capacity ||
512             test_and_set_bit(GD_NATIVE_CAPACITY, &disk->state)) {
513                 printk(KERN_CONT "truncated\n");
514                 return false;
515         }
516
517         printk(KERN_CONT "enabling native capacity\n");
518         disk->fops->unlock_native_capacity(disk);
519         return true;
520 }
521
522 void blk_drop_partitions(struct gendisk *disk)
523 {
524         struct block_device *part;
525         unsigned long idx;
526
527         lockdep_assert_held(&disk->open_mutex);
528
529         xa_for_each_start(&disk->part_tbl, idx, part, 1)
530                 delete_partition(part);
531 }
532
533 static bool blk_add_partition(struct gendisk *disk,
534                 struct parsed_partitions *state, int p)
535 {
536         sector_t size = state->parts[p].size;
537         sector_t from = state->parts[p].from;
538         struct block_device *part;
539
540         if (!size)
541                 return true;
542
543         if (from >= get_capacity(disk)) {
544                 printk(KERN_WARNING
545                        "%s: p%d start %llu is beyond EOD, ",
546                        disk->disk_name, p, (unsigned long long) from);
547                 if (disk_unlock_native_capacity(disk))
548                         return false;
549                 return true;
550         }
551
552         if (from + size > get_capacity(disk)) {
553                 printk(KERN_WARNING
554                        "%s: p%d size %llu extends beyond EOD, ",
555                        disk->disk_name, p, (unsigned long long) size);
556
557                 if (disk_unlock_native_capacity(disk))
558                         return false;
559
560                 /*
561                  * We can not ignore partitions of broken tables created by for
562                  * example camera firmware, but we limit them to the end of the
563                  * disk to avoid creating invalid block devices.
564                  */
565                 size = get_capacity(disk) - from;
566         }
567
568         part = add_partition(disk, p, from, size, state->parts[p].flags,
569                              &state->parts[p].info);
570         if (IS_ERR(part) && PTR_ERR(part) != -ENXIO) {
571                 printk(KERN_ERR " %s: p%d could not be added: %ld\n",
572                        disk->disk_name, p, -PTR_ERR(part));
573                 return true;
574         }
575
576         if (IS_BUILTIN(CONFIG_BLK_DEV_MD) &&
577             (state->parts[p].flags & ADDPART_FLAG_RAID))
578                 md_autodetect_dev(part->bd_dev);
579
580         return true;
581 }
582
583 static int blk_add_partitions(struct gendisk *disk)
584 {
585         struct parsed_partitions *state;
586         int ret = -EAGAIN, p;
587
588         if (disk->flags & GENHD_FL_NO_PART)
589                 return 0;
590
591         if (test_bit(GD_SUPPRESS_PART_SCAN, &disk->state))
592                 return 0;
593
594         state = check_partition(disk);
595         if (!state)
596                 return 0;
597         if (IS_ERR(state)) {
598                 /*
599                  * I/O error reading the partition table.  If we tried to read
600                  * beyond EOD, retry after unlocking the native capacity.
601                  */
602                 if (PTR_ERR(state) == -ENOSPC) {
603                         printk(KERN_WARNING "%s: partition table beyond EOD, ",
604                                disk->disk_name);
605                         if (disk_unlock_native_capacity(disk))
606                                 return -EAGAIN;
607                 }
608                 return -EIO;
609         }
610
611         /*
612          * Partitions are not supported on host managed zoned block devices.
613          */
614         if (disk->queue->limits.zoned == BLK_ZONED_HM) {
615                 pr_warn("%s: ignoring partition table on host managed zoned block device\n",
616                         disk->disk_name);
617                 ret = 0;
618                 goto out_free_state;
619         }
620
621         /*
622          * If we read beyond EOD, try unlocking native capacity even if the
623          * partition table was successfully read as we could be missing some
624          * partitions.
625          */
626         if (state->access_beyond_eod) {
627                 printk(KERN_WARNING
628                        "%s: partition table partially beyond EOD, ",
629                        disk->disk_name);
630                 if (disk_unlock_native_capacity(disk))
631                         goto out_free_state;
632         }
633
634         /* tell userspace that the media / partition table may have changed */
635         kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
636
637         for (p = 1; p < state->limit; p++)
638                 if (!blk_add_partition(disk, state, p))
639                         goto out_free_state;
640
641         ret = 0;
642 out_free_state:
643         free_partitions(state);
644         return ret;
645 }
646
647 int bdev_disk_changed(struct gendisk *disk, bool invalidate)
648 {
649         int ret = 0;
650
651         lockdep_assert_held(&disk->open_mutex);
652
653         if (!disk_live(disk))
654                 return -ENXIO;
655
656 rescan:
657         if (disk->open_partitions)
658                 return -EBUSY;
659         sync_blockdev(disk->part0);
660         invalidate_bdev(disk->part0);
661         blk_drop_partitions(disk);
662
663         clear_bit(GD_NEED_PART_SCAN, &disk->state);
664
665         /*
666          * Historically we only set the capacity to zero for devices that
667          * support partitions (independ of actually having partitions created).
668          * Doing that is rather inconsistent, but changing it broke legacy
669          * udisks polling for legacy ide-cdrom devices.  Use the crude check
670          * below to get the sane behavior for most device while not breaking
671          * userspace for this particular setup.
672          */
673         if (invalidate) {
674                 if (!(disk->flags & GENHD_FL_NO_PART) ||
675                     !(disk->flags & GENHD_FL_REMOVABLE))
676                         set_capacity(disk, 0);
677         }
678
679         if (get_capacity(disk)) {
680                 ret = blk_add_partitions(disk);
681                 if (ret == -EAGAIN)
682                         goto rescan;
683         } else if (invalidate) {
684                 /*
685                  * Tell userspace that the media / partition table may have
686                  * changed.
687                  */
688                 kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
689         }
690
691         return ret;
692 }
693 /*
694  * Only exported for loop and dasd for historic reasons.  Don't use in new
695  * code!
696  */
697 EXPORT_SYMBOL_GPL(bdev_disk_changed);
698
699 void *read_part_sector(struct parsed_partitions *state, sector_t n, Sector *p)
700 {
701         struct address_space *mapping = state->disk->part0->bd_inode->i_mapping;
702         struct folio *folio;
703
704         if (n >= get_capacity(state->disk)) {
705                 state->access_beyond_eod = true;
706                 goto out;
707         }
708
709         folio = read_mapping_folio(mapping, n >> PAGE_SECTORS_SHIFT, NULL);
710         if (IS_ERR(folio))
711                 goto out;
712
713         p->v = folio;
714         return folio_address(folio) + offset_in_folio(folio, n * SECTOR_SIZE);
715 out:
716         p->v = NULL;
717         return NULL;
718 }