--- a/block/partitions/Kconfig +++ b/block/partitions/Kconfig @@ -101,6 +101,13 @@ config ATARI_PARTITION Say Y here if you would like to use hard disks under Linux which were partitioned under the Atari OS. +config FIT_PARTITION + bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED + default n + help + Say Y here if your system needs to mount the filesystem part of + a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot. + config IBM_PARTITION bool "IBM disk label and partition support" depends on PARTITION_ADVANCED && S390 --- a/block/partitions/Makefile +++ b/block/partitions/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o obj-$(CONFIG_AMIGA_PARTITION) += amiga.o obj-$(CONFIG_ATARI_PARTITION) += atari.o obj-$(CONFIG_AIX_PARTITION) += aix.o +obj-$(CONFIG_FIT_PARTITION) += fit.o obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o obj-$(CONFIG_MAC_PARTITION) += mac.o obj-$(CONFIG_LDM_PARTITION) += ldm.o --- a/drivers/mtd/ubi/block.c +++ b/drivers/mtd/ubi/block.c @@ -396,7 +396,7 @@ int ubiblock_create(struct ubi_volume_in dev->leb_size = vi->usable_leb_size; /* Initialize the gendisk of this ubiblock device */ - gd = alloc_disk(1); + gd = alloc_disk(0); if (!gd) { pr_err("UBI: block: alloc_disk failed\n"); ret = -ENODEV; @@ -413,6 +413,7 @@ int ubiblock_create(struct ubi_volume_in goto out_put_disk; } gd->private_data = dev; + gd->flags |= GENHD_FL_EXT_DEVT; sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id); set_capacity(gd, disk_capacity); dev->gd = gd; --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -18,6 +18,10 @@ #include #include #include +#ifdef CONFIG_FIT_PARTITION +#include +#endif + #include "partitions/check.h" @@ -180,6 +184,18 @@ ssize_t part_fail_store(struct device *d } #endif +static ssize_t part_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct hd_struct *p = dev_to_part(dev); + + if (p->info && p->info->volname) + return sprintf(buf, "%s\n", p->info->volname); + + buf[0] = '\0'; + return 0; +} + static DEVICE_ATTR(partition, 0444, part_partition_show, NULL); static DEVICE_ATTR(start, 0444, part_start_show, NULL); static DEVICE_ATTR(size, 0444, part_size_show, NULL); @@ -188,6 +204,7 @@ static DEVICE_ATTR(alignment_offset, 044 static DEVICE_ATTR(discard_alignment, 0444, part_discard_alignment_show, NULL); static DEVICE_ATTR(stat, 0444, part_stat_show, NULL); static DEVICE_ATTR(inflight, 0444, part_inflight_show, NULL); +static DEVICE_ATTR(name, 0444, part_name_show, NULL); #ifdef CONFIG_FAIL_MAKE_REQUEST static struct device_attribute dev_attr_fail = __ATTR(make-it-fail, 0644, part_fail_show, part_fail_store); @@ -202,6 +219,7 @@ static struct attribute *part_attrs[] = &dev_attr_discard_alignment.attr, &dev_attr_stat.attr, &dev_attr_inflight.attr, + &dev_attr_name.attr, #ifdef CONFIG_FAIL_MAKE_REQUEST &dev_attr_fail.attr, #endif @@ -634,6 +652,10 @@ rescan: if (state->parts[p].flags & ADDPART_FLAG_RAID) md_autodetect_dev(part_to_dev(part)->devt); #endif +#ifdef CONFIG_FIT_PARTITION + if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0) + ROOT_DEV = part_to_dev(part)->devt; +#endif } free_partitions(state); return 0; --- a/block/partitions/check.c +++ b/block/partitions/check.c @@ -33,6 +33,7 @@ #include "ibm.h" #include "ultrix.h" #include "efi.h" +#include "fit.h" #include "karma.h" #include "sysv68.h" #include "cmdline.h" @@ -73,6 +74,9 @@ static int (*check_part[])(struct parsed #ifdef CONFIG_EFI_PARTITION efi_partition, /* this must come before msdos */ #endif +#ifdef CONFIG_FIT_PARTITION + fit_partition, +#endif #ifdef CONFIG_SGI_PARTITION sgi_partition, #endif --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -614,6 +614,7 @@ struct unixware_disklabel { #define ADDPART_FLAG_NONE 0 #define ADDPART_FLAG_RAID 1 #define ADDPART_FLAG_WHOLEDISK 2 +#define ADDPART_FLAG_ROOTDEV 4 extern int blk_alloc_devt(struct hd_struct *part, dev_t *devt); extern void blk_free_devt(dev_t devt); --- /dev/null +++ b/block/partitions/fit.h @@ -0,0 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +int fit_partition(struct parsed_partitions *); +int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain); --- a/block/partitions/efi.c +++ b/block/partitions/efi.c @@ -681,6 +681,9 @@ int efi_partition(struct parsed_partitio gpt_entry *ptes = NULL; u32 i; unsigned ssz = bdev_logical_block_size(state->bdev) / 512; +#ifdef CONFIG_FIT_PARTITION + u32 extra_slot = 64; +#endif if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { kfree(gpt); @@ -722,6 +725,11 @@ int efi_partition(struct parsed_partitio label_count++; } state->parts[i + 1].has_info = true; +#ifdef CONFIG_FIT_PARTITION + /* If this is a U-Boot FIT volume it may have subpartitions */ + if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID)) + (void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1); +#endif } kfree(ptes); kfree(gpt); --- a/block/partitions/efi.h +++ b/block/partitions/efi.h @@ -52,6 +52,9 @@ #define PARTITION_LINUX_LVM_GUID \ EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \ 0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28) +#define PARTITION_LINUX_FIT_GUID \ + EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \ + 0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93) typedef struct _gpt_header { __le64 signature;