x86: try harder to attach block2mtd to fix boot issues on devices with longer delays
authorFelix Fietkau <nbd@openwrt.org>
Thu, 10 Apr 2014 14:43:17 +0000 (14:43 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 10 Apr 2014 14:43:17 +0000 (14:43 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 40444

target/linux/generic/patches-3.10/441-block2mtd_probe.patch
target/linux/generic/patches-3.12/440-block2mtd_init.patch
target/linux/generic/patches-3.12/441-block2mtd_probe.patch
target/linux/generic/patches-3.12/442-block2mtd_logmessages.patch [deleted file]
target/linux/generic/patches-3.13/440-block2mtd_init.patch
target/linux/generic/patches-3.13/441-block2mtd_probe.patch
target/linux/generic/patches-3.13/442-block2mtd_logmessages.patch [deleted file]
target/linux/generic/patches-3.14/440-block2mtd_init.patch
target/linux/generic/patches-3.14/441-block2mtd_probe.patch
target/linux/generic/patches-3.14/442-block2mtd_logmessages.patch [deleted file]
target/linux/x86/image/Makefile

index 0b2e80c..a9c100d 100644 (file)
 --- a/drivers/mtd/devices/block2mtd.c
 +++ b/drivers/mtd/devices/block2mtd.c
-@@ -234,6 +234,7 @@ static struct block2mtd_dev *add_device(
-               /* We might not have rootfs mounted at this point. Try
-                  to resolve the device name by other means. */
+@@ -7,6 +7,7 @@
+  * Licence: GPL
+  */
+ #include <linux/module.h>
++#include <linux/delay.h>
+ #include <linux/fs.h>
+ #include <linux/blkdev.h>
+ #include <linux/bio.h>
+@@ -211,13 +212,14 @@ static void block2mtd_free_device(struct
  
+ /* FIXME: ensure that mtd->size % erase_size == 0 */
+-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
++static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname, int timeout)
+ {
+       const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
+-      struct block_device *bdev;
++      struct block_device *bdev = ERR_PTR(-ENODEV);
+       struct block2mtd_dev *dev;
+       struct mtd_partition *part;
+       char *name;
++      int i;
+       if (!devname)
+               return NULL;
+@@ -228,15 +230,20 @@ static struct block2mtd_dev *add_device(
+       /* Get a handle on the device */
+       bdev = blkdev_get_by_path(devname, mode, dev);
++
+ #ifndef MODULE
+-      if (IS_ERR(bdev)) {
++      for (i = 0; IS_ERR(bdev) && i <= timeout; i++) {
++              dev_t devt;
+-              /* We might not have rootfs mounted at this point. Try
+-                 to resolve the device name by other means. */
++              if (i)
++                      msleep(1000);
 +              wait_for_device_probe();
-               dev_t devt = name_to_dev_t(devname);
-               if (devt)
-                       bdev = blkdev_get_by_dev(devt, mode, dev);
++
++              devt = name_to_dev_t(devname);
++              if (!devt)
++                      continue;
+-              dev_t devt = name_to_dev_t(devname);
+-              if (devt)
+-                      bdev = blkdev_get_by_dev(devt, mode, dev);
++              bdev = blkdev_get_by_dev(devt, mode, dev);
+       }
+ #endif
+@@ -360,11 +367,12 @@ static char block2mtd_paramline[80 + 12]
+ static int block2mtd_setup2(const char *val)
+ {
+-      char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
++      char buf[80 + 12 + 80 + 8]; /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
+       char *str = buf;
+-      char *token[3];
++      char *token[4];
+       char *name;
+       size_t erase_size = PAGE_SIZE;
++      unsigned long timeout = 0;
+       int i, ret;
+       if (strnlen(val, sizeof(buf)) >= sizeof(buf))
+@@ -373,7 +381,7 @@ static int block2mtd_setup2(const char *
+       strcpy(str, val);
+       kill_final_newline(str);
+-      for (i = 0; i < 3; i++)
++      for (i = 0; i < 4; i++)
+               token[i] = strsep(&str, ",");
+       if (str)
+@@ -395,7 +403,10 @@ static int block2mtd_setup2(const char *
+       if (token[2] && (strlen(token[2]) + 1 > 80))
+               parse_err("mtd device name too long");
+-      add_device(name, erase_size, token[2]);
++      if (token[3] && kstrtoul(token[3], 0, &timeout))
++              parse_err("invalid timeout");
++
++      add_device(name, erase_size, token[2], timeout);
+       return 0;
+ }
+@@ -429,7 +440,7 @@ static int block2mtd_setup(const char *v
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>[,<timeout>]]]\"");
+ static int __init block2mtd_init(void)
+ {
+@@ -462,7 +473,7 @@ static void block2mtd_exit(void)
+ }
+-module_init(block2mtd_init);
++late_initcall(block2mtd_init);
+ module_exit(block2mtd_exit);
+ MODULE_LICENSE("GPL");
index 4617bf4..198d961 100644 (file)
@@ -89,7 +89,7 @@
                }
        }
 +      if (token[2] && (strlen(token[2]) + 1 > 80))
-+              parse_err("mtd device name too long");
++              pr_err("mtd device name too long\n");
  
 -      add_device(name, erase_size);
 +      add_device(name, erase_size, token[2]);
index 28ed2ce..5cfa0b2 100644 (file)
 --- a/drivers/mtd/devices/block2mtd.c
 +++ b/drivers/mtd/devices/block2mtd.c
-@@ -233,6 +233,7 @@ static struct block2mtd_dev *add_device(
-               /* We might not have rootfs mounted at this point. Try
-                  to resolve the device name by other means. */
+@@ -10,6 +10,7 @@
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
+ #include <linux/module.h>
++#include <linux/delay.h>
+ #include <linux/fs.h>
+ #include <linux/blkdev.h>
+ #include <linux/bio.h>
+@@ -210,13 +211,14 @@ static void block2mtd_free_device(struct
+ /* FIXME: ensure that mtd->size % erase_size == 0 */
+-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
++static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname, int timeout)
+ {
+       const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
+-      struct block_device *bdev;
++      struct block_device *bdev = ERR_PTR(-ENODEV);
+       struct block2mtd_dev *dev;
+       struct mtd_partition *part;
+       char *name;
++      int i;
+       if (!devname)
+               return NULL;
+@@ -227,15 +229,20 @@ static struct block2mtd_dev *add_device(
+       /* Get a handle on the device */
+       bdev = blkdev_get_by_path(devname, mode, dev);
++
+ #ifndef MODULE
+-      if (IS_ERR(bdev)) {
++      for (i = 0; IS_ERR(bdev) && i <= timeout; i++) {
++              dev_t devt;
+-              /* We might not have rootfs mounted at this point. Try
+-                 to resolve the device name by other means. */
++              if (i)
++                      msleep(1000);
 +              wait_for_device_probe();
-               dev_t devt = name_to_dev_t(devname);
-               if (devt)
-                       bdev = blkdev_get_by_dev(devt, mode, dev);
++
++              devt = name_to_dev_t(devname);
++              if (!devt)
++                      continue;
+-              dev_t devt = name_to_dev_t(devname);
+-              if (devt)
+-                      bdev = blkdev_get_by_dev(devt, mode, dev);
++              bdev = blkdev_get_by_dev(devt, mode, dev);
+       }
+ #endif
+@@ -354,11 +361,12 @@ static char block2mtd_paramline[80 + 12]
+ static int block2mtd_setup2(const char *val)
+ {
+-      char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
++      char buf[80 + 12 + 80 + 8]; /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
+       char *str = buf;
+-      char *token[3];
++      char *token[4];
+       char *name;
+       size_t erase_size = PAGE_SIZE;
++      unsigned long timeout = 0;
+       int i, ret;
+       if (strnlen(val, sizeof(buf)) >= sizeof(buf)) {
+@@ -369,7 +377,7 @@ static int block2mtd_setup2(const char *
+       strcpy(str, val);
+       kill_final_newline(str);
+-      for (i = 0; i < 3; i++)
++      for (i = 0; i < 4; i++)
+               token[i] = strsep(&str, ",");
+       if (str) {
+@@ -398,7 +406,10 @@ static int block2mtd_setup2(const char *
+       if (token[2] && (strlen(token[2]) + 1 > 80))
+               pr_err("mtd device name too long\n");
+-      add_device(name, erase_size, token[2]);
++      if (token[3] && kstrtoul(token[3], 0, &timeout))
++              pr_err("invalid timeout\n");
++
++      add_device(name, erase_size, token[2], timeout);
+       return 0;
+ }
+@@ -432,7 +443,7 @@ static int block2mtd_setup(const char *v
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>[,<timeout>]]]\"");
+ static int __init block2mtd_init(void)
+ {
+@@ -466,7 +477,7 @@ static void block2mtd_exit(void)
+ }
+-module_init(block2mtd_init);
++late_initcall(block2mtd_init);
+ module_exit(block2mtd_exit);
+ MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/patches-3.12/442-block2mtd_logmessages.patch b/target/linux/generic/patches-3.12/442-block2mtd_logmessages.patch
deleted file mode 100644 (file)
index 07487e1..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -397,7 +397,7 @@ static int block2mtd_setup2(const char *
-               }
-       }
-       if (token[2] && (strlen(token[2]) + 1 > 80))
--              parse_err("mtd device name too long");
-+              pr_err("mtd device name too long\n");
-       add_device(name, erase_size, token[2]);
index 2818bb9..4af7c1b 100644 (file)
@@ -89,7 +89,7 @@
                }
        }
 +      if (token[2] && (strlen(token[2]) + 1 > 80))
-+              parse_err("mtd device name too long");
++              pr_err("mtd device name too long\n");
  
 -      add_device(name, erase_size);
 +      add_device(name, erase_size, token[2]);
index 0b2e80c..3ab9d1a 100644 (file)
 --- a/drivers/mtd/devices/block2mtd.c
 +++ b/drivers/mtd/devices/block2mtd.c
-@@ -234,6 +234,7 @@ static struct block2mtd_dev *add_device(
-               /* We might not have rootfs mounted at this point. Try
-                  to resolve the device name by other means. */
+@@ -10,6 +10,7 @@
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
+ #include <linux/module.h>
++#include <linux/delay.h>
+ #include <linux/fs.h>
+ #include <linux/blkdev.h>
+ #include <linux/bio.h>
+@@ -211,13 +212,14 @@ static void block2mtd_free_device(struct
+ /* FIXME: ensure that mtd->size % erase_size == 0 */
+-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
++static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname, int timeout)
+ {
+       const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
+-      struct block_device *bdev;
++      struct block_device *bdev = ERR_PTR(-ENODEV);
+       struct block2mtd_dev *dev;
+       struct mtd_partition *part;
+       char *name;
++      int i;
+       if (!devname)
+               return NULL;
+@@ -228,15 +230,20 @@ static struct block2mtd_dev *add_device(
+       /* Get a handle on the device */
+       bdev = blkdev_get_by_path(devname, mode, dev);
++
+ #ifndef MODULE
+-      if (IS_ERR(bdev)) {
++      for (i = 0; IS_ERR(bdev) && i <= timeout; i++) {
++              dev_t devt;
+-              /* We might not have rootfs mounted at this point. Try
+-                 to resolve the device name by other means. */
++              if (i)
++                      msleep(1000);
 +              wait_for_device_probe();
-               dev_t devt = name_to_dev_t(devname);
-               if (devt)
-                       bdev = blkdev_get_by_dev(devt, mode, dev);
++
++              devt = name_to_dev_t(devname);
++              if (!devt)
++                      continue;
+-              dev_t devt = name_to_dev_t(devname);
+-              if (devt)
+-                      bdev = blkdev_get_by_dev(devt, mode, dev);
++              bdev = blkdev_get_by_dev(devt, mode, dev);
+       }
+ #endif
+@@ -355,11 +362,12 @@ static char block2mtd_paramline[80 + 12]
+ static int block2mtd_setup2(const char *val)
+ {
+-      char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
++      char buf[80 + 12 + 80 + 8]; /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
+       char *str = buf;
+-      char *token[3];
++      char *token[4];
+       char *name;
+       size_t erase_size = PAGE_SIZE;
++      unsigned long timeout = 0;
+       int i, ret;
+       if (strnlen(val, sizeof(buf)) >= sizeof(buf)) {
+@@ -370,7 +378,7 @@ static int block2mtd_setup2(const char *
+       strcpy(str, val);
+       kill_final_newline(str);
+-      for (i = 0; i < 3; i++)
++      for (i = 0; i < 4; i++)
+               token[i] = strsep(&str, ",");
+       if (str) {
+@@ -399,7 +407,10 @@ static int block2mtd_setup2(const char *
+       if (token[2] && (strlen(token[2]) + 1 > 80))
+               pr_err("mtd device name too long\n");
+-      add_device(name, erase_size, token[2]);
++      if (token[3] && kstrtoul(token[3], 0, &timeout))
++              pr_err("invalid timeout\n");
++
++      add_device(name, erase_size, token[2], timeout);
+       return 0;
+ }
+@@ -433,7 +444,7 @@ static int block2mtd_setup(const char *v
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>[,<timeout>]]]\"");
+ static int __init block2mtd_init(void)
+ {
+@@ -467,7 +478,7 @@ static void block2mtd_exit(void)
+ }
+-module_init(block2mtd_init);
++late_initcall(block2mtd_init);
+ module_exit(block2mtd_exit);
+ MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/patches-3.13/442-block2mtd_logmessages.patch b/target/linux/generic/patches-3.13/442-block2mtd_logmessages.patch
deleted file mode 100644 (file)
index 983106b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -398,7 +398,7 @@ static int block2mtd_setup2(const char *
-               }
-       }
-       if (token[2] && (strlen(token[2]) + 1 > 80))
--              parse_err("mtd device name too long");
-+              pr_err("mtd device name too long\n");
-       add_device(name, erase_size, token[2]);
index 2818bb9..4af7c1b 100644 (file)
@@ -89,7 +89,7 @@
                }
        }
 +      if (token[2] && (strlen(token[2]) + 1 > 80))
-+              parse_err("mtd device name too long");
++              pr_err("mtd device name too long\n");
  
 -      add_device(name, erase_size);
 +      add_device(name, erase_size, token[2]);
index 0b2e80c..3ab9d1a 100644 (file)
 --- a/drivers/mtd/devices/block2mtd.c
 +++ b/drivers/mtd/devices/block2mtd.c
-@@ -234,6 +234,7 @@ static struct block2mtd_dev *add_device(
-               /* We might not have rootfs mounted at this point. Try
-                  to resolve the device name by other means. */
+@@ -10,6 +10,7 @@
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
+ #include <linux/module.h>
++#include <linux/delay.h>
+ #include <linux/fs.h>
+ #include <linux/blkdev.h>
+ #include <linux/bio.h>
+@@ -211,13 +212,14 @@ static void block2mtd_free_device(struct
+ /* FIXME: ensure that mtd->size % erase_size == 0 */
+-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
++static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname, int timeout)
+ {
+       const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
+-      struct block_device *bdev;
++      struct block_device *bdev = ERR_PTR(-ENODEV);
+       struct block2mtd_dev *dev;
+       struct mtd_partition *part;
+       char *name;
++      int i;
+       if (!devname)
+               return NULL;
+@@ -228,15 +230,20 @@ static struct block2mtd_dev *add_device(
+       /* Get a handle on the device */
+       bdev = blkdev_get_by_path(devname, mode, dev);
++
+ #ifndef MODULE
+-      if (IS_ERR(bdev)) {
++      for (i = 0; IS_ERR(bdev) && i <= timeout; i++) {
++              dev_t devt;
+-              /* We might not have rootfs mounted at this point. Try
+-                 to resolve the device name by other means. */
++              if (i)
++                      msleep(1000);
 +              wait_for_device_probe();
-               dev_t devt = name_to_dev_t(devname);
-               if (devt)
-                       bdev = blkdev_get_by_dev(devt, mode, dev);
++
++              devt = name_to_dev_t(devname);
++              if (!devt)
++                      continue;
+-              dev_t devt = name_to_dev_t(devname);
+-              if (devt)
+-                      bdev = blkdev_get_by_dev(devt, mode, dev);
++              bdev = blkdev_get_by_dev(devt, mode, dev);
+       }
+ #endif
+@@ -355,11 +362,12 @@ static char block2mtd_paramline[80 + 12]
+ static int block2mtd_setup2(const char *val)
+ {
+-      char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
++      char buf[80 + 12 + 80 + 8]; /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
+       char *str = buf;
+-      char *token[3];
++      char *token[4];
+       char *name;
+       size_t erase_size = PAGE_SIZE;
++      unsigned long timeout = 0;
+       int i, ret;
+       if (strnlen(val, sizeof(buf)) >= sizeof(buf)) {
+@@ -370,7 +378,7 @@ static int block2mtd_setup2(const char *
+       strcpy(str, val);
+       kill_final_newline(str);
+-      for (i = 0; i < 3; i++)
++      for (i = 0; i < 4; i++)
+               token[i] = strsep(&str, ",");
+       if (str) {
+@@ -399,7 +407,10 @@ static int block2mtd_setup2(const char *
+       if (token[2] && (strlen(token[2]) + 1 > 80))
+               pr_err("mtd device name too long\n");
+-      add_device(name, erase_size, token[2]);
++      if (token[3] && kstrtoul(token[3], 0, &timeout))
++              pr_err("invalid timeout\n");
++
++      add_device(name, erase_size, token[2], timeout);
+       return 0;
+ }
+@@ -433,7 +444,7 @@ static int block2mtd_setup(const char *v
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>[,<timeout>]]]\"");
+ static int __init block2mtd_init(void)
+ {
+@@ -467,7 +478,7 @@ static void block2mtd_exit(void)
+ }
+-module_init(block2mtd_init);
++late_initcall(block2mtd_init);
+ module_exit(block2mtd_exit);
+ MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/patches-3.14/442-block2mtd_logmessages.patch b/target/linux/generic/patches-3.14/442-block2mtd_logmessages.patch
deleted file mode 100644 (file)
index 983106b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/mtd/devices/block2mtd.c
-+++ b/drivers/mtd/devices/block2mtd.c
-@@ -398,7 +398,7 @@ static int block2mtd_setup2(const char *
-               }
-       }
-       if (token[2] && (strlen(token[2]) + 1 > 80))
--              parse_err("mtd device name too long");
-+              pr_err("mtd device name too long\n");
-       add_device(name, erase_size, token[2]);
index 4b40e64..03aa350 100644 (file)
@@ -53,15 +53,15 @@ ifneq ($(CONFIG_GRUB_IMAGES),)
   endef
 
   define Image/cmdline/jffs2-64k
-    block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootwait
+    block2mtd.block2mtd=$(ROOTPART),65536,rootfs,5 root=/dev/mtdblock0 rootfstype=jffs2 rootwait
   endef
 
   define Image/cmdline/jffs2-128k
-    block2mtd.block2mtd=$(ROOTPART),131072,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootwait
+    block2mtd.block2mtd=$(ROOTPART),131072,rootfs,5 root=/dev/mtdblock0 rootfstype=jffs2 rootwait
   endef
 
   define Image/cmdline/squashfs
-    block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=squashfs rootwait
+    block2mtd.block2mtd=$(ROOTPART),65536,rootfs,5 root=/dev/mtdblock0 rootfstype=squashfs rootwait
   endef
 
   define Image/Build/grub2