kernel: improve ubi auto attach code readability
authorMathias Kresin <dev@kresin.me>
Sat, 7 Jul 2018 23:38:08 +0000 (01:38 +0200)
committerMathias Kresin <dev@kresin.me>
Tue, 24 Jul 2018 20:24:21 +0000 (22:24 +0200)
Move the put_mtd_device() called on multiple error conditions to a goto
label to use it later for more error conditions.

The early return on failed open of the mtd device and mismatching mtd
type allows to get rid of one level of indentation. By jumping to the
cleanup code, a refcount bug is fixed for the wrong flash type condition.

While at it, make clear that we only check for the UBI magic if the read
from flash was successful.

Signed-off-by: Mathias Kresin <dev@kresin.me>
target/linux/generic/pending-4.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch
target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch

index 63afabb1d96893205af5aad4c5c7b7ecd1e96504..aa4dc12201d73e9c2b97a1da6609ce9756d4964b 100644 (file)
@@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 
 --- a/drivers/mtd/ubi/build.c
 +++ b/drivers/mtd/ubi/build.c
-@@ -1171,6 +1171,49 @@ static struct mtd_info * __init open_mtd
+@@ -1171,6 +1171,54 @@ static struct mtd_info * __init open_mtd
        return mtd;
  }
  
@@ -20,45 +20,50 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +{
 +      int err;
 +      struct mtd_info *mtd;
++      size_t len;
++      char magic[4];
 +
 +      /* try attaching mtd device named "ubi" or "data" */
 +      mtd = open_mtd_device("ubi");
 +      if (IS_ERR(mtd))
 +              mtd = open_mtd_device("data");
 +
-+      if (!IS_ERR(mtd)) {
-+              size_t len;
-+              char magic[4];
++      if (IS_ERR(mtd))
++              return;
++
++      /* check for a valid ubi magic if read from flash was successful */
++      err = mtd_read(mtd, 0, 4, &len, (void *) magic);
++      if (!err && len == 4 && strncmp(magic, "UBI#", 4)) {
++              pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
++              goto cleanup;
++      }
 +
-+              /* check for a valid ubi magic */
-+              err = mtd_read(mtd, 0, 4, &len, (void *) magic);
-+              if (!err && len == 4 && strncmp(magic, "UBI#", 4)) {
-+                      pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
-+                      put_mtd_device(mtd);
-+                      return;
-+              }
++      /* don't auto-add media types where UBI doesn't makes sense */
++      if (mtd->type != MTD_NANDFLASH &&
++          mtd->type != MTD_NORFLASH &&
++          mtd->type != MTD_DATAFLASH &&
++          mtd->type != MTD_MLCNANDFLASH)
++              goto cleanup;
 +
-+              /* auto-add only media types where UBI makes sense */
-+              if (mtd->type == MTD_NANDFLASH ||
-+                  mtd->type == MTD_NORFLASH ||
-+                  mtd->type == MTD_DATAFLASH ||
-+                  mtd->type == MTD_MLCNANDFLASH) {
-+                      mutex_lock(&ubi_devices_mutex);
-+                      pr_notice("UBI: auto-attach mtd%d\n", mtd->index);
-+                      err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);
-+                      mutex_unlock(&ubi_devices_mutex);
-+                      if (err < 0) {
-+                              pr_err("UBI error: cannot attach mtd%d\n", mtd->index);
-+                              put_mtd_device(mtd);
-+                      }
-+              }
++      mutex_lock(&ubi_devices_mutex);
++      pr_notice("UBI: auto-attach mtd%d\n", mtd->index);
++      err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);
++      mutex_unlock(&ubi_devices_mutex);
++      if (err < 0) {
++              pr_err("UBI error: cannot attach mtd%d\n", mtd->index);
++              goto cleanup;
 +      }
++
++      return;
++
++cleanup:
++      put_mtd_device(mtd);
 +}
 +
  static int __init ubi_init(void)
  {
        int err, i, k;
-@@ -1254,6 +1297,12 @@ static int __init ubi_init(void)
+@@ -1254,6 +1302,12 @@ static int __init ubi_init(void)
                }
        }
  
index 8b37dba034c16c66e015e2cbf6cdb9cff2dda6a4..1436e486ddee54ad98003b94089ba71a0047181b 100644 (file)
@@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 
 --- a/drivers/mtd/ubi/build.c
 +++ b/drivers/mtd/ubi/build.c
-@@ -1226,6 +1226,49 @@ static struct mtd_info * __init open_mtd
+@@ -1226,6 +1226,54 @@ static struct mtd_info * __init open_mtd
        return mtd;
  }
  
@@ -20,45 +20,50 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +{
 +      int err;
 +      struct mtd_info *mtd;
++      size_t len;
++      char magic[4];
 +
 +      /* try attaching mtd device named "ubi" or "data" */
 +      mtd = open_mtd_device("ubi");
 +      if (IS_ERR(mtd))
 +              mtd = open_mtd_device("data");
 +
-+      if (!IS_ERR(mtd)) {
-+              size_t len;
-+              char magic[4];
++      if (IS_ERR(mtd))
++              return;
++
++      /* check for a valid ubi magic if read from flash was successful */
++      err = mtd_read(mtd, 0, 4, &len, (void *) magic);
++      if (!err && len == 4 && strncmp(magic, "UBI#", 4)) {
++              pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
++              goto cleanup;
++      }
 +
-+              /* check for a valid ubi magic */
-+              err = mtd_read(mtd, 0, 4, &len, (void *) magic);
-+              if (!err && len == 4 && strncmp(magic, "UBI#", 4)) {
-+                      pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
-+                      put_mtd_device(mtd);
-+                      return;
-+              }
++      /* don't auto-add media types where UBI doesn't makes sense */
++      if (mtd->type != MTD_NANDFLASH &&
++          mtd->type != MTD_NORFLASH &&
++          mtd->type != MTD_DATAFLASH &&
++          mtd->type != MTD_MLCNANDFLASH)
++              goto cleanup;
 +
-+              /* auto-add only media types where UBI makes sense */
-+              if (mtd->type == MTD_NANDFLASH ||
-+                  mtd->type == MTD_NORFLASH ||
-+                  mtd->type == MTD_DATAFLASH ||
-+                  mtd->type == MTD_MLCNANDFLASH) {
-+                      mutex_lock(&ubi_devices_mutex);
-+                      pr_notice("UBI: auto-attach mtd%d\n", mtd->index);
-+                      err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);
-+                      mutex_unlock(&ubi_devices_mutex);
-+                      if (err < 0) {
-+                              pr_err("UBI error: cannot attach mtd%d\n", mtd->index);
-+                              put_mtd_device(mtd);
-+                      }
-+              }
++      mutex_lock(&ubi_devices_mutex);
++      pr_notice("UBI: auto-attach mtd%d\n", mtd->index);
++      err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);
++      mutex_unlock(&ubi_devices_mutex);
++      if (err < 0) {
++              pr_err("UBI error: cannot attach mtd%d\n", mtd->index);
++              goto cleanup;
 +      }
++
++      return;
++
++cleanup:
++      put_mtd_device(mtd);
 +}
 +
  static int __init ubi_init(void)
  {
        int err, i, k;
-@@ -1309,6 +1352,12 @@ static int __init ubi_init(void)
+@@ -1309,6 +1357,12 @@ static int __init ubi_init(void)
                }
        }