diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2007-12-25 12:17:00 -0500 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2007-12-26 12:15:17 -0500 |
commit | d1f3dd6cc00f5bf744118fb2820ecdf09a1f4b73 (patch) | |
tree | 48663606422eda9245c3a53f1437f9c4458b8aa7 /drivers/mtd | |
parent | 783b273afab43437dca731a229d53d72faf77fd3 (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>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/ubi/build.c | 36 |
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 | */ |
876 | static struct mtd_info * __init open_mtd_device(const char *mtd_dev) | 875 | static 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 | } |