aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-25 12:17:00 -0500
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-26 12:15:17 -0500
commitd1f3dd6cc00f5bf744118fb2820ecdf09a1f4b73 (patch)
tree48663606422eda9245c3a53f1437f9c4458b8aa7
parent783b273afab43437dca731a229d53d72faf77fd3 (diff)
UBI: fix mtd device string parsing
UBI allows to specify MTD device name or number when the module is being loaded. When parsing MTD device identity string, it first tries to treat it as device NAME, and if that fails, it treats it as device number. Make it vice-versa as this is more logical and makes less troubles when you have an MTD device named "1" and try to load mtd1 which has different name. This is especially easy to hit when gluebi is enabled. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r--drivers/mtd/ubi/build.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index 6ac133994f94..0ed8105f9c11 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -867,38 +867,26 @@ static void ltree_entry_ctor(struct kmem_cache *cache, void *obj)
867 * find_mtd_device - open an MTD device by its name or number. 867 * find_mtd_device - open an MTD device by its name or number.
868 * @mtd_dev: name or number of the device 868 * @mtd_dev: name or number of the device
869 * 869 *
870 * This function tries to open and MTD device with name @mtd_dev, and if it 870 * This function tries to open and MTD device described by @mtd_dev string,
871 * fails, then it tries to interpret the @mtd_dev string as an ASCII-coded 871 * which is first treated as an ASCII number, and if it is not true, it is
872 * integer and open an MTD device with this number. Returns MTD device 872 * treated as MTD device name. Returns MTD device description object in case of
873 * description object in case of success and a negative error code in case of 873 * success and a negative error code in case of failure.
874 * failure.
875 */ 874 */
876static struct mtd_info * __init open_mtd_device(const char *mtd_dev) 875static struct mtd_info * __init open_mtd_device(const char *mtd_dev)
877{ 876{
878 struct mtd_info *mtd; 877 struct mtd_info *mtd;
878 int mtd_num;
879 char *endp;
879 880
880 mtd = get_mtd_device_nm(mtd_dev); 881 mtd_num = simple_strtoul(mtd_dev, &endp, 0);
881 if (IS_ERR(mtd)) { 882 if (*endp != '\0' || mtd_dev == endp) {
882 int mtd_num;
883 char *endp;
884
885 if (PTR_ERR(mtd) != -ENODEV)
886 return mtd;
887
888 /* 883 /*
889 * Probably this is not MTD device name but MTD device number - 884 * This does not look like an ASCII integer, probably this is
890 * check this out. 885 * MTD device name.
891 */ 886 */
892 mtd_num = simple_strtoul(mtd_dev, &endp, 0); 887 mtd = get_mtd_device_nm(mtd_dev);
893 if (*endp != '\0' || mtd_dev == endp) { 888 } else
894 ubi_err("incorrect MTD device: \"%s\"", mtd_dev);
895 return ERR_PTR(-ENODEV);
896 }
897
898 mtd = get_mtd_device(NULL, mtd_num); 889 mtd = get_mtd_device(NULL, mtd_num);
899 if (IS_ERR(mtd))
900 return mtd;
901 }
902 890
903 return mtd; 891 return mtd;
904} 892}