kernel: don't auto-split "firmware" if it has "compatible" DT property
If "compatible" is being used that should trigger a proper parser directly. It's more reliable thanks to not trying parsers one by one. In such case partition shouldn't be split automatically to avoid parsing it twice. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
		| @@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
|  	mtd_add_partition_attrs(new); |  	mtd_add_partition_attrs(new); | ||||||
|   |   | ||||||
| @@ -736,6 +741,35 @@ int mtd_del_partition(struct mtd_info *m | @@ -736,6 +741,36 @@ int mtd_del_partition(struct mtd_info *m | ||||||
|  } |  } | ||||||
|  EXPORT_SYMBOL_GPL(mtd_del_partition); |  EXPORT_SYMBOL_GPL(mtd_del_partition); | ||||||
|   |   | ||||||
| @@ -94,8 +94,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +	if (rootfs_found) | +	if (rootfs_found) | ||||||
| +		return; | +		return; | ||||||
| + | + | ||||||
| +	if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && | +	if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && | ||||||
| +	    IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE)) | +	    !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && | ||||||
|  | +	    !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL)) | ||||||
| +		split_firmware(master, part); | +		split_firmware(master, part); | ||||||
| + | + | ||||||
| +	arch_split_mtd_part(master, part->mtd.name, part->offset, | +	arch_split_mtd_part(master, part->mtd.name, part->offset, | ||||||
| @@ -104,7 +105,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  /* |  /* | ||||||
|   * This function, given a master MTD object and a partition table, creates |   * This function, given a master MTD object and a partition table, creates | ||||||
|   * and registers slave MTD objects which are bound to the master according to |   * and registers slave MTD objects which are bound to the master according to | ||||||
| @@ -767,6 +801,7 @@ int add_mtd_partitions(struct mtd_info * | @@ -767,6 +802,7 @@ int add_mtd_partitions(struct mtd_info * | ||||||
|  		mutex_unlock(&mtd_partitions_mutex); |  		mutex_unlock(&mtd_partitions_mutex); | ||||||
|   |   | ||||||
|  		add_mtd_device(&slave->mtd); |  		add_mtd_device(&slave->mtd); | ||||||
|   | |||||||
| @@ -57,7 +57,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME |  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME | ||||||
|  #define SPLIT_FIRMWARE_NAME	CONFIG_MTD_SPLIT_FIRMWARE_NAME |  #define SPLIT_FIRMWARE_NAME	CONFIG_MTD_SPLIT_FIRMWARE_NAME | ||||||
|  #else |  #else | ||||||
| @@ -1118,6 +1152,61 @@ void mtd_part_parser_cleanup(struct mtd_ | @@ -1119,6 +1153,61 @@ void mtd_part_parser_cleanup(struct mtd_ | ||||||
|  	} |  	} | ||||||
|  } |  } | ||||||
|   |   | ||||||
|   | |||||||
| @@ -28,9 +28,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
| +		rootfs_found = 1; | +		rootfs_found = 1; | ||||||
| +	} | +	} | ||||||
| + | + | ||||||
|  	if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && |  	if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && | ||||||
|  	    IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE)) |  	    !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && | ||||||
|  		split_firmware(master, part); |  	    !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL)) | ||||||
| --- a/include/linux/mtd/partitions.h | --- a/include/linux/mtd/partitions.h | ||||||
| +++ b/include/linux/mtd/partitions.h | +++ b/include/linux/mtd/partitions.h | ||||||
| @@ -75,6 +75,8 @@ struct mtd_part_parser_data { | @@ -75,6 +75,8 @@ struct mtd_part_parser_data { | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  |  | ||||||
| --- a/drivers/mtd/mtdpart.c | --- a/drivers/mtd/mtdpart.c | ||||||
| +++ b/drivers/mtd/mtdpart.c | +++ b/drivers/mtd/mtdpart.c | ||||||
| @@ -1231,6 +1231,24 @@ int mtd_is_partition(const struct mtd_in | @@ -1232,6 +1232,24 @@ int mtd_is_partition(const struct mtd_in | ||||||
|  } |  } | ||||||
|  EXPORT_SYMBOL_GPL(mtd_is_partition); |  EXPORT_SYMBOL_GPL(mtd_is_partition); | ||||||
|   |   | ||||||
|   | |||||||
| @@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
|  	mtd_add_partition_attrs(new); |  	mtd_add_partition_attrs(new); | ||||||
|   |   | ||||||
| @@ -728,6 +733,35 @@ int mtd_del_partition(struct mtd_info *m | @@ -728,6 +733,36 @@ int mtd_del_partition(struct mtd_info *m | ||||||
|  } |  } | ||||||
|  EXPORT_SYMBOL_GPL(mtd_del_partition); |  EXPORT_SYMBOL_GPL(mtd_del_partition); | ||||||
|   |   | ||||||
| @@ -94,8 +94,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +	if (rootfs_found) | +	if (rootfs_found) | ||||||
| +		return; | +		return; | ||||||
| + | + | ||||||
| +	if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && | +	if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && | ||||||
| +	    IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE)) | +	    !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && | ||||||
|  | +	    !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL)) | ||||||
| +		split_firmware(master, part); | +		split_firmware(master, part); | ||||||
| + | + | ||||||
| +	arch_split_mtd_part(master, part->mtd.name, part->offset, | +	arch_split_mtd_part(master, part->mtd.name, part->offset, | ||||||
| @@ -104,7 +105,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  /* |  /* | ||||||
|   * This function, given a master MTD object and a partition table, creates |   * This function, given a master MTD object and a partition table, creates | ||||||
|   * and registers slave MTD objects which are bound to the master according to |   * and registers slave MTD objects which are bound to the master according to | ||||||
| @@ -759,6 +793,7 @@ int add_mtd_partitions(struct mtd_info * | @@ -759,6 +794,7 @@ int add_mtd_partitions(struct mtd_info * | ||||||
|  		mutex_unlock(&mtd_partitions_mutex); |  		mutex_unlock(&mtd_partitions_mutex); | ||||||
|   |   | ||||||
|  		add_mtd_device(&slave->mtd); |  		add_mtd_device(&slave->mtd); | ||||||
|   | |||||||
| @@ -57,7 +57,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME |  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME | ||||||
|  #define SPLIT_FIRMWARE_NAME	CONFIG_MTD_SPLIT_FIRMWARE_NAME |  #define SPLIT_FIRMWARE_NAME	CONFIG_MTD_SPLIT_FIRMWARE_NAME | ||||||
|  #else |  #else | ||||||
| @@ -1115,6 +1149,61 @@ void mtd_part_parser_cleanup(struct mtd_ | @@ -1116,6 +1150,61 @@ void mtd_part_parser_cleanup(struct mtd_ | ||||||
|  	} |  	} | ||||||
|  } |  } | ||||||
|   |   | ||||||
|   | |||||||
| @@ -28,9 +28,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
| +		rootfs_found = 1; | +		rootfs_found = 1; | ||||||
| +	} | +	} | ||||||
| + | + | ||||||
|  	if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && |  	if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && | ||||||
|  	    IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE)) |  	    !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && | ||||||
|  		split_firmware(master, part); |  	    !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL)) | ||||||
| --- a/include/linux/mtd/partitions.h | --- a/include/linux/mtd/partitions.h | ||||||
| +++ b/include/linux/mtd/partitions.h | +++ b/include/linux/mtd/partitions.h | ||||||
| @@ -75,6 +75,8 @@ struct mtd_part_parser_data { | @@ -75,6 +75,8 @@ struct mtd_part_parser_data { | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  |  | ||||||
| --- a/drivers/mtd/mtdpart.c | --- a/drivers/mtd/mtdpart.c | ||||||
| +++ b/drivers/mtd/mtdpart.c | +++ b/drivers/mtd/mtdpart.c | ||||||
| @@ -1228,6 +1228,24 @@ int mtd_is_partition(const struct mtd_in | @@ -1229,6 +1229,24 @@ int mtd_is_partition(const struct mtd_in | ||||||
|  } |  } | ||||||
|  EXPORT_SYMBOL_GPL(mtd_is_partition); |  EXPORT_SYMBOL_GPL(mtd_is_partition); | ||||||
|   |   | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Rafał Miłecki
					Rafał Miłecki