kernel: don't auto-split "firmware" if it has "compatible" DT property
authorRafał Miłecki <rafal@milecki.pl>
Thu, 22 Nov 2018 11:55:14 +0000 (12:55 +0100)
committerJo-Philipp Wich <jo@mein.io>
Tue, 18 Dec 2018 16:48:13 +0000 (17:48 +0100)
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>
(backported from 934edb764dfd9fffe88478ecd315bee6ca0a781a)

target/linux/generic/pending-4.14/400-mtd-add-rootfs-split-support.patch
target/linux/generic/pending-4.14/401-mtd-add-support-for-different-partition-parser-types.patch
target/linux/generic/pending-4.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
target/linux/generic/pending-4.14/404-mtd-add-more-helper-functions.patch
target/linux/generic/pending-4.9/400-mtd-add-rootfs-split-support.patch
target/linux/generic/pending-4.9/401-mtd-add-support-for-different-partition-parser-types.patch
target/linux/generic/pending-4.9/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
target/linux/generic/pending-4.9/404-mtd-add-more-helper-functions.patch

index 68737803d8fb3b535b20cbb4f0e5c2abebe51a68..b68e25381904b8ed962a24ac686d61e1a13c789f 100644 (file)
@@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
        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);
  
@@ -94,8 +94,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +      if (rootfs_found)
 +              return;
 +
-+      if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
-+          IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
++      if (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);
 +
 +      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
   * 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);
  
                add_mtd_device(&slave->mtd);
index a48ae87ea24996561114de43901550d7b0aed22d..0393fb2309d5d10f7345c6674b72544ad5c98fbc 100644 (file)
@@ -57,7 +57,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
  #define SPLIT_FIRMWARE_NAME   CONFIG_MTD_SPLIT_FIRMWARE_NAME
  #else
-@@ -1118,6 +1152,61 @@ void mtd_part_parser_cleanup(struct mtd_
+@@ -1119,6 +1153,61 @@ void mtd_part_parser_cleanup(struct mtd_
        }
  }
  
index 3c105b2a47fc6d6509e9e86a3bf4ea1a7461452b..240d0b2a25388334f0bdea912f6ddd241e48cd97 100644 (file)
@@ -28,9 +28,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 +              rootfs_found = 1;
 +      }
 +
-       if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
-           IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
-               split_firmware(master, part);
+       if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
+           !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
+           !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
 --- a/include/linux/mtd/partitions.h
 +++ b/include/linux/mtd/partitions.h
 @@ -75,6 +75,8 @@ struct mtd_part_parser_data {
index b37563c90291e2326d8c004028024eb2ca22af3b..d1035b67380db1c6663075a1e8f22fb5276c4332 100644 (file)
@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 
 --- a/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);
  
index b0cb2731417897c35f9f9974941a66a00a89e300..2072775d1eef0fbeb0a332b60891947530664424 100644 (file)
@@ -68,7 +68,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
        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);
  
@@ -94,8 +94,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +      if (rootfs_found)
 +              return;
 +
-+      if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
-+          IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
++      if (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);
 +
 +      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
   * 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);
  
                add_mtd_device(&slave->mtd);
index 0eb6d7422ded9f112194debbf2ff09ffc874d44d..29a1d73854c9ab2cc759e534713a75f97f561989 100644 (file)
@@ -57,7 +57,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
  #define SPLIT_FIRMWARE_NAME   CONFIG_MTD_SPLIT_FIRMWARE_NAME
  #else
-@@ -1115,6 +1149,61 @@ void mtd_part_parser_cleanup(struct mtd_
+@@ -1116,6 +1150,61 @@ void mtd_part_parser_cleanup(struct mtd_
        }
  }
  
index 3cb27c7605dc7b6efe8fae281e4b2e195cb47b11..ccb7f0095148b379926e902e2ad052b9ce7694d3 100644 (file)
@@ -28,9 +28,9 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 +              rootfs_found = 1;
 +      }
 +
-       if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
-           IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
-               split_firmware(master, part);
+       if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
+           !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
+           !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
 --- a/include/linux/mtd/partitions.h
 +++ b/include/linux/mtd/partitions.h
 @@ -75,6 +75,8 @@ struct mtd_part_parser_data {
index 300a0b0267b5e1e22fd361eb6951827c83701a12..e25ab6854152baf8773c1d502e0f314a7ea99631 100644 (file)
@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
 
 --- a/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);