aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2008-04-23 04:57:25 -0400
committerDavid Woodhouse <dwmw2@infradead.org>2008-04-23 04:57:25 -0400
commite43fe686e48835ca027559a068bbe0b6d264a254 (patch)
treedef98b52b111ba384a2fd01955465f813ca299e4
parent986ee0139a91ab8b6b07d29d7a112c8033b5f8e0 (diff)
parent434b825e1fc9ef7971fc962734278ffbab36a1ab (diff)
Merge git://git.infradead.org/~dedekind/ubi-2.6
-rw-r--r--Documentation/ABI/stable/sysfs-class-ubi212
-rw-r--r--drivers/mtd/ubi/Kconfig9
-rw-r--r--drivers/mtd/ubi/build.c37
-rw-r--r--drivers/mtd/ubi/debug.h2
-rw-r--r--drivers/mtd/ubi/gluebi.c5
-rw-r--r--drivers/mtd/ubi/io.c4
-rw-r--r--drivers/mtd/ubi/scan.c41
-rw-r--r--drivers/mtd/ubi/scan.h2
-rw-r--r--drivers/mtd/ubi/ubi-media.h (renamed from include/mtd/ubi-header.h)8
-rw-r--r--drivers/mtd/ubi/ubi.h3
-rw-r--r--include/mtd/Kbuild1
11 files changed, 260 insertions, 64 deletions
diff --git a/Documentation/ABI/stable/sysfs-class-ubi b/Documentation/ABI/stable/sysfs-class-ubi
new file mode 100644
index 000000000000..18d471d9faea
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-class-ubi
@@ -0,0 +1,212 @@
1What: /sys/class/ubi/
2Date: July 2006
3KernelVersion: 2.6.22
4Contact: Artem Bityutskiy <dedekind@infradead.org>
5Description:
6 The ubi/ class sub-directory belongs to the UBI subsystem and
7 provides general UBI information, per-UBI device information
8 and per-UBI volume information.
9
10What: /sys/class/ubi/version
11Date: July 2006
12KernelVersion: 2.6.22
13Contact: Artem Bityutskiy <dedekind@infradead.org>
14Description:
15 This file contains version of the latest supported UBI on-media
16 format. Currently it is 1, and there is no plan to change this.
17 However, if in the future UBI needs on-flash format changes
18 which cannot be done in a compatible manner, a new format
19 version will be added. So this is a mechanism for possible
20 future backward-compatible (but forward-incompatible)
21 improvements.
22
23What: /sys/class/ubiX/
24Date: July 2006
25KernelVersion: 2.6.22
26Contact: Artem Bityutskiy <dedekind@infradead.org>
27Description:
28 The /sys/class/ubi0, /sys/class/ubi1, etc directories describe
29 UBI devices (UBI device 0, 1, etc). They contain general UBI
30 device information and per UBI volume information (each UBI
31 device may have many UBI volumes)
32
33What: /sys/class/ubi/ubiX/avail_eraseblocks
34Date: July 2006
35KernelVersion: 2.6.22
36Contact: Artem Bityutskiy <dedekind@infradead.org>
37Description:
38 Amount of available logical eraseblock. For example, one may
39 create a new UBI volume which has this amount of logical
40 eraseblocks.
41
42What: /sys/class/ubi/ubiX/bad_peb_count
43Date: July 2006
44KernelVersion: 2.6.22
45Contact: Artem Bityutskiy <dedekind@infradead.org>
46Description:
47 Count of bad physical eraseblocks on the underlying MTD device.
48
49What: /sys/class/ubi/ubiX/bgt_enabled
50Date: July 2006
51KernelVersion: 2.6.22
52Contact: Artem Bityutskiy <dedekind@infradead.org>
53Description:
54 Contains ASCII "0\n" if the UBI background thread is disabled,
55 and ASCII "1\n" if it is enabled.
56
57What: /sys/class/ubi/ubiX/dev
58Date: July 2006
59KernelVersion: 2.6.22
60Contact: Artem Bityutskiy <dedekind@infradead.org>
61Description:
62 Major and minor numbers of the character device corresponding
63 to this UBI device (in <major>:<minor> format).
64
65What: /sys/class/ubi/ubiX/eraseblock_size
66Date: July 2006
67KernelVersion: 2.6.22
68Contact: Artem Bityutskiy <dedekind@infradead.org>
69Description:
70 Maximum logical eraseblock size this UBI device may provide. UBI
71 volumes may have smaller logical eraseblock size because of their
72 alignment.
73
74What: /sys/class/ubi/ubiX/max_ec
75Date: July 2006
76KernelVersion: 2.6.22
77Contact: Artem Bityutskiy <dedekind@infradead.org>
78Description:
79 Maximum physical eraseblock erase counter value.
80
81What: /sys/class/ubi/ubiX/max_vol_count
82Date: July 2006
83KernelVersion: 2.6.22
84Contact: Artem Bityutskiy <dedekind@infradead.org>
85Description:
86 Maximum number of volumes which this UBI device may have.
87
88What: /sys/class/ubi/ubiX/min_io_size
89Date: July 2006
90KernelVersion: 2.6.22
91Contact: Artem Bityutskiy <dedekind@infradead.org>
92Description:
93 Minimum input/output unit size. All the I/O may only be done
94 in fractions of the contained number.
95
96What: /sys/class/ubi/ubiX/mtd_num
97Date: January 2008
98KernelVersion: 2.6.25
99Contact: Artem Bityutskiy <dedekind@infradead.org>
100Description:
101 Number of the underlying MTD device.
102
103What: /sys/class/ubi/ubiX/reserved_for_bad
104Date: July 2006
105KernelVersion: 2.6.22
106Contact: Artem Bityutskiy <dedekind@infradead.org>
107Description:
108 Number of physical eraseblocks reserved for bad block handling.
109
110What: /sys/class/ubi/ubiX/total_eraseblocks
111Date: July 2006
112KernelVersion: 2.6.22
113Contact: Artem Bityutskiy <dedekind@infradead.org>
114Description:
115 Total number of good (not marked as bad) physical eraseblocks on
116 the underlying MTD device.
117
118What: /sys/class/ubi/ubiX/volumes_count
119Date: July 2006
120KernelVersion: 2.6.22
121Contact: Artem Bityutskiy <dedekind@infradead.org>
122Description:
123 Count of volumes on this UBI device.
124
125What: /sys/class/ubi/ubiX/ubiX_Y/
126Date: July 2006
127KernelVersion: 2.6.22
128Contact: Artem Bityutskiy <dedekind@infradead.org>
129Description:
130 The /sys/class/ubi/ubiX/ubiX_0/, /sys/class/ubi/ubiX/ubiX_1/,
131 etc directories describe UBI volumes on UBI device X (volumes
132 0, 1, etc).
133
134What: /sys/class/ubi/ubiX/ubiX_Y/alignment
135Date: July 2006
136KernelVersion: 2.6.22
137Contact: Artem Bityutskiy <dedekind@infradead.org>
138Description:
139 Volume alignment - the value the logical eraseblock size of
140 this volume has to be aligned on. For example, 2048 means that
141 logical eraseblock size is multiple of 2048. In other words,
142 volume logical eraseblock size is UBI device logical eraseblock
143 size aligned to the alignment value.
144
145What: /sys/class/ubi/ubiX/ubiX_Y/corrupted
146Date: July 2006
147KernelVersion: 2.6.22
148Contact: Artem Bityutskiy <dedekind@infradead.org>
149Description:
150 Contains ASCII "0\n" if the UBI volume is OK, and ASCII "1\n"
151 if it is corrupted (e.g., due to an interrupted volume update).
152
153What: /sys/class/ubi/ubiX/ubiX_Y/data_bytes
154Date: July 2006
155KernelVersion: 2.6.22
156Contact: Artem Bityutskiy <dedekind@infradead.org>
157Description:
158 The amount of data this volume contains. This value makes sense
159 only for static volumes, and for dynamic volume it equivalent
160 to the total volume size in bytes.
161
162What: /sys/class/ubi/ubiX/ubiX_Y/dev
163Date: July 2006
164KernelVersion: 2.6.22
165Contact: Artem Bityutskiy <dedekind@infradead.org>
166Description:
167 Major and minor numbers of the character device corresponding
168 to this UBI volume (in <major>:<minor> format).
169
170What: /sys/class/ubi/ubiX/ubiX_Y/name
171Date: July 2006
172KernelVersion: 2.6.22
173Contact: Artem Bityutskiy <dedekind@infradead.org>
174Description:
175 Volume name.
176
177What: /sys/class/ubi/ubiX/ubiX_Y/reserved_ebs
178Date: July 2006
179KernelVersion: 2.6.22
180Contact: Artem Bityutskiy <dedekind@infradead.org>
181Description:
182 Count of physical eraseblock reserved for this volume.
183 Equivalent to the volume size in logical eraseblocks.
184
185What: /sys/class/ubi/ubiX/ubiX_Y/type
186Date: July 2006
187KernelVersion: 2.6.22
188Contact: Artem Bityutskiy <dedekind@infradead.org>
189Description:
190 Volume type. Contains ASCII "dynamic\n" for dynamic volumes and
191 "static\n" for static volumes.
192
193What: /sys/class/ubi/ubiX/ubiX_Y/upd_marker
194Date: July 2006
195KernelVersion: 2.6.22
196Contact: Artem Bityutskiy <dedekind@infradead.org>
197Description:
198 Contains ASCII "0\n" if the update marker is not set for this
199 volume, and "1\n" if it is set. The update marker is set when
200 volume update starts, and cleaned when it ends. So the presence
201 of the update marker indicates that the volume is being updated
202 at the moment of the update was interrupted. The later may be
203 checked using the "corrupted" sysfs file.
204
205What: /sys/class/ubi/ubiX/ubiX_Y/usable_eb_size
206Date: July 2006
207KernelVersion: 2.6.22
208Contact: Artem Bityutskiy <dedekind@infradead.org>
209Description:
210 Logical eraseblock size of this volume. Equivalent to logical
211 eraseblock size of the device aligned on the volume alignment
212 value.
diff --git a/drivers/mtd/ubi/Kconfig b/drivers/mtd/ubi/Kconfig
index b9daf159a4a7..3f063108e95f 100644
--- a/drivers/mtd/ubi/Kconfig
+++ b/drivers/mtd/ubi/Kconfig
@@ -24,8 +24,13 @@ config MTD_UBI_WL_THRESHOLD
24 erase counter value and the lowest erase counter value of eraseblocks 24 erase counter value and the lowest erase counter value of eraseblocks
25 of UBI devices. When this threshold is exceeded, UBI starts performing 25 of UBI devices. When this threshold is exceeded, UBI starts performing
26 wear leveling by means of moving data from eraseblock with low erase 26 wear leveling by means of moving data from eraseblock with low erase
27 counter to eraseblocks with high erase counter. Leave the default 27 counter to eraseblocks with high erase counter.
28 value if unsure. 28
29 The default value should be OK for SLC NAND flashes, NOR flashes and
30 other flashes which have eraseblock life-cycle 100000 or more.
31 However, in case of MLC NAND flashes which typically have eraseblock
32 life-cycle less then 10000, the threshold should be lessened (e.g.,
33 to 128 or 256, although it does not have to be power of 2).
29 34
30config MTD_UBI_BEB_RESERVE 35config MTD_UBI_BEB_RESERVE
31 int "Percentage of reserved eraseblocks for bad eraseblocks handling" 36 int "Percentage of reserved eraseblocks for bad eraseblocks handling"
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index 275960462970..e8578ca422ff 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -606,8 +606,16 @@ static int io_init(struct ubi_device *ubi)
606 ubi->ro_mode = 1; 606 ubi->ro_mode = 1;
607 } 607 }
608 608
609 dbg_msg("leb_size %d", ubi->leb_size); 609 ubi_msg("physical eraseblock size: %d bytes (%d KiB)",
610 dbg_msg("ro_mode %d", ubi->ro_mode); 610 ubi->peb_size, ubi->peb_size >> 10);
611 ubi_msg("logical eraseblock size: %d bytes", ubi->leb_size);
612 ubi_msg("smallest flash I/O unit: %d", ubi->min_io_size);
613 if (ubi->hdrs_min_io_size != ubi->min_io_size)
614 ubi_msg("sub-page size: %d",
615 ubi->hdrs_min_io_size);
616 ubi_msg("VID header offset: %d (aligned %d)",
617 ubi->vid_hdr_offset, ubi->vid_hdr_aloffset);
618 ubi_msg("data offset: %d", ubi->leb_start);
611 619
612 /* 620 /*
613 * Note, ideally, we have to initialize ubi->bad_peb_count here. But 621 * Note, ideally, we have to initialize ubi->bad_peb_count here. But
@@ -804,15 +812,8 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
804 ubi_msg("attached mtd%d to ubi%d", mtd->index, ubi_num); 812 ubi_msg("attached mtd%d to ubi%d", mtd->index, ubi_num);
805 ubi_msg("MTD device name: \"%s\"", mtd->name); 813 ubi_msg("MTD device name: \"%s\"", mtd->name);
806 ubi_msg("MTD device size: %llu MiB", ubi->flash_size >> 20); 814 ubi_msg("MTD device size: %llu MiB", ubi->flash_size >> 20);
807 ubi_msg("physical eraseblock size: %d bytes (%d KiB)",
808 ubi->peb_size, ubi->peb_size >> 10);
809 ubi_msg("logical eraseblock size: %d bytes", ubi->leb_size);
810 ubi_msg("number of good PEBs: %d", ubi->good_peb_count); 815 ubi_msg("number of good PEBs: %d", ubi->good_peb_count);
811 ubi_msg("number of bad PEBs: %d", ubi->bad_peb_count); 816 ubi_msg("number of bad PEBs: %d", ubi->bad_peb_count);
812 ubi_msg("smallest flash I/O unit: %d", ubi->min_io_size);
813 ubi_msg("VID header offset: %d (aligned %d)",
814 ubi->vid_hdr_offset, ubi->vid_hdr_aloffset);
815 ubi_msg("data offset: %d", ubi->leb_start);
816 ubi_msg("max. allowed volumes: %d", ubi->vtbl_slots); 817 ubi_msg("max. allowed volumes: %d", ubi->vtbl_slots);
817 ubi_msg("wear-leveling threshold: %d", CONFIG_MTD_UBI_WL_THRESHOLD); 818 ubi_msg("wear-leveling threshold: %d", CONFIG_MTD_UBI_WL_THRESHOLD);
818 ubi_msg("number of internal volumes: %d", UBI_INT_VOL_COUNT); 819 ubi_msg("number of internal volumes: %d", UBI_INT_VOL_COUNT);
@@ -950,8 +951,7 @@ static int __init ubi_init(void)
950 BUILD_BUG_ON(sizeof(struct ubi_vid_hdr) != 64); 951 BUILD_BUG_ON(sizeof(struct ubi_vid_hdr) != 64);
951 952
952 if (mtd_devs > UBI_MAX_DEVICES) { 953 if (mtd_devs > UBI_MAX_DEVICES) {
953 printk(KERN_ERR "UBI error: too many MTD devices, " 954 ubi_err("too many MTD devices, maximum is %d", UBI_MAX_DEVICES);
954 "maximum is %d\n", UBI_MAX_DEVICES);
955 return -EINVAL; 955 return -EINVAL;
956 } 956 }
957 957
@@ -959,25 +959,25 @@ static int __init ubi_init(void)
959 ubi_class = class_create(THIS_MODULE, UBI_NAME_STR); 959 ubi_class = class_create(THIS_MODULE, UBI_NAME_STR);
960 if (IS_ERR(ubi_class)) { 960 if (IS_ERR(ubi_class)) {
961 err = PTR_ERR(ubi_class); 961 err = PTR_ERR(ubi_class);
962 printk(KERN_ERR "UBI error: cannot create UBI class\n"); 962 ubi_err("cannot create UBI class");
963 goto out; 963 goto out;
964 } 964 }
965 965
966 err = class_create_file(ubi_class, &ubi_version); 966 err = class_create_file(ubi_class, &ubi_version);
967 if (err) { 967 if (err) {
968 printk(KERN_ERR "UBI error: cannot create sysfs file\n"); 968 ubi_err("cannot create sysfs file");
969 goto out_class; 969 goto out_class;
970 } 970 }
971 971
972 err = misc_register(&ubi_ctrl_cdev); 972 err = misc_register(&ubi_ctrl_cdev);
973 if (err) { 973 if (err) {
974 printk(KERN_ERR "UBI error: cannot register device\n"); 974 ubi_err("cannot register device");
975 goto out_version; 975 goto out_version;
976 } 976 }
977 977
978 ubi_wl_entry_slab = kmem_cache_create("ubi_wl_entry_slab", 978 ubi_wl_entry_slab = kmem_cache_create("ubi_wl_entry_slab",
979 sizeof(struct ubi_wl_entry), 979 sizeof(struct ubi_wl_entry),
980 0, 0, NULL); 980 0, 0, NULL);
981 if (!ubi_wl_entry_slab) 981 if (!ubi_wl_entry_slab)
982 goto out_dev_unreg; 982 goto out_dev_unreg;
983 983
@@ -1000,8 +1000,7 @@ static int __init ubi_init(void)
1000 mutex_unlock(&ubi_devices_mutex); 1000 mutex_unlock(&ubi_devices_mutex);
1001 if (err < 0) { 1001 if (err < 0) {
1002 put_mtd_device(mtd); 1002 put_mtd_device(mtd);
1003 printk(KERN_ERR "UBI error: cannot attach mtd%d\n", 1003 ubi_err("cannot attach mtd%d", mtd->index);
1004 mtd->index);
1005 goto out_detach; 1004 goto out_detach;
1006 } 1005 }
1007 } 1006 }
@@ -1023,7 +1022,7 @@ out_version:
1023out_class: 1022out_class:
1024 class_destroy(ubi_class); 1023 class_destroy(ubi_class);
1025out: 1024out:
1026 printk(KERN_ERR "UBI error: cannot initialize UBI, error %d\n", err); 1025 ubi_err("UBI error: cannot initialize UBI, error %d", err);
1027 return err; 1026 return err;
1028} 1027}
1029module_init(ubi_init); 1028module_init(ubi_init);
diff --git a/drivers/mtd/ubi/debug.h b/drivers/mtd/ubi/debug.h
index 8ac7d87dc85b..8ea99d8c9e1f 100644
--- a/drivers/mtd/ubi/debug.h
+++ b/drivers/mtd/ubi/debug.h
@@ -99,8 +99,10 @@ void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
99#ifdef CONFIG_MTD_UBI_DEBUG_MSG_BLD 99#ifdef CONFIG_MTD_UBI_DEBUG_MSG_BLD
100/* Initialization and build messages */ 100/* Initialization and build messages */
101#define dbg_bld(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) 101#define dbg_bld(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__)
102#define UBI_IO_DEBUG 1
102#else 103#else
103#define dbg_bld(fmt, ...) ({}) 104#define dbg_bld(fmt, ...) ({})
105#define UBI_IO_DEBUG 0
104#endif 106#endif
105 107
106#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_BITFLIPS 108#ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_BITFLIPS
diff --git a/drivers/mtd/ubi/gluebi.c b/drivers/mtd/ubi/gluebi.c
index d397219238d3..e909b390069a 100644
--- a/drivers/mtd/ubi/gluebi.c
+++ b/drivers/mtd/ubi/gluebi.c
@@ -291,11 +291,12 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol)
291 /* 291 /*
292 * In case of dynamic volume, MTD device size is just volume size. In 292 * In case of dynamic volume, MTD device size is just volume size. In
293 * case of a static volume the size is equivalent to the amount of data 293 * case of a static volume the size is equivalent to the amount of data
294 * bytes, which is zero at this moment and will be changed after volume 294 * bytes.
295 * update.
296 */ 295 */
297 if (vol->vol_type == UBI_DYNAMIC_VOLUME) 296 if (vol->vol_type == UBI_DYNAMIC_VOLUME)
298 mtd->size = vol->usable_leb_size * vol->reserved_pebs; 297 mtd->size = vol->usable_leb_size * vol->reserved_pebs;
298 else
299 mtd->size = vol->used_bytes;
299 300
300 if (add_mtd_device(mtd)) { 301 if (add_mtd_device(mtd)) {
301 ubi_err("cannot not add MTD device\n"); 302 ubi_err("cannot not add MTD device\n");
diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c
index db3efdef2433..4ac11df7b048 100644
--- a/drivers/mtd/ubi/io.c
+++ b/drivers/mtd/ubi/io.c
@@ -631,6 +631,8 @@ int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
631 631
632 dbg_io("read EC header from PEB %d", pnum); 632 dbg_io("read EC header from PEB %d", pnum);
633 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); 633 ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
634 if (UBI_IO_DEBUG)
635 verbose = 1;
634 636
635 err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE); 637 err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
636 if (err) { 638 if (err) {
@@ -904,6 +906,8 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
904 906
905 dbg_io("read VID header from PEB %d", pnum); 907 dbg_io("read VID header from PEB %d", pnum);
906 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); 908 ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
909 if (UBI_IO_DEBUG)
910 verbose = 1;
907 911
908 p = (char *)vid_hdr - ubi->vid_hdr_shift; 912 p = (char *)vid_hdr - ubi->vid_hdr_shift;
909 err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset, 913 err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c
index 05aa3e7daba1..96d410e106ab 100644
--- a/drivers/mtd/ubi/scan.c
+++ b/drivers/mtd/ubi/scan.c
@@ -42,6 +42,7 @@
42 42
43#include <linux/err.h> 43#include <linux/err.h>
44#include <linux/crc32.h> 44#include <linux/crc32.h>
45#include <asm/div64.h>
45#include "ubi.h" 46#include "ubi.h"
46 47
47#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID 48#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
@@ -92,27 +93,6 @@ static int add_to_list(struct ubi_scan_info *si, int pnum, int ec,
92} 93}
93 94
94/** 95/**
95 * commit_to_mean_value - commit intermediate results to the final mean erase
96 * counter value.
97 * @si: scanning information
98 *
99 * This is a helper function which calculates partial mean erase counter mean
100 * value and adds it to the resulting mean value. As we can work only in
101 * integer arithmetic and we want to calculate the mean value of erase counter
102 * accurately, we first sum erase counter values in @si->ec_sum variable and
103 * count these components in @si->ec_count. If this temporary @si->ec_sum is
104 * going to overflow, we calculate the partial mean value
105 * (@si->ec_sum/@si->ec_count) and add it to @si->mean_ec.
106 */
107static void commit_to_mean_value(struct ubi_scan_info *si)
108{
109 si->ec_sum /= si->ec_count;
110 if (si->ec_sum % si->ec_count >= si->ec_count / 2)
111 si->mean_ec += 1;
112 si->mean_ec += si->ec_sum;
113}
114
115/**
116 * validate_vid_hdr - check that volume identifier header is correct and 96 * validate_vid_hdr - check that volume identifier header is correct and
117 * consistent. 97 * consistent.
118 * @vid_hdr: the volume identifier header to check 98 * @vid_hdr: the volume identifier header to check
@@ -901,15 +881,8 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, int pnum
901 881
902adjust_mean_ec: 882adjust_mean_ec:
903 if (!ec_corr) { 883 if (!ec_corr) {
904 if (si->ec_sum + ec < ec) { 884 si->ec_sum += ec;
905 commit_to_mean_value(si); 885 si->ec_count += 1;
906 si->ec_sum = 0;
907 si->ec_count = 0;
908 } else {
909 si->ec_sum += ec;
910 si->ec_count += 1;
911 }
912
913 if (ec > si->max_ec) 886 if (ec > si->max_ec)
914 si->max_ec = ec; 887 si->max_ec = ec;
915 if (ec < si->min_ec) 888 if (ec < si->min_ec)
@@ -965,9 +938,11 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi)
965 938
966 dbg_msg("scanning is finished"); 939 dbg_msg("scanning is finished");
967 940
968 /* Finish mean erase counter calculations */ 941 /* Calculate mean erase counter */
969 if (si->ec_count) 942 if (si->ec_count) {
970 commit_to_mean_value(si); 943 do_div(si->ec_sum, si->ec_count);
944 si->mean_ec = si->ec_sum;
945 }
971 946
972 if (si->is_empty) 947 if (si->is_empty)
973 ubi_msg("empty MTD device detected"); 948 ubi_msg("empty MTD device detected");
diff --git a/drivers/mtd/ubi/scan.h b/drivers/mtd/ubi/scan.h
index 46d444af471a..966b9b682a42 100644
--- a/drivers/mtd/ubi/scan.h
+++ b/drivers/mtd/ubi/scan.h
@@ -124,7 +124,7 @@ struct ubi_scan_info {
124 int max_ec; 124 int max_ec;
125 unsigned long long max_sqnum; 125 unsigned long long max_sqnum;
126 int mean_ec; 126 int mean_ec;
127 int ec_sum; 127 uint64_t ec_sum;
128 int ec_count; 128 int ec_count;
129}; 129};
130 130
diff --git a/include/mtd/ubi-header.h b/drivers/mtd/ubi/ubi-media.h
index 292f916ea564..c3185d9fd048 100644
--- a/include/mtd/ubi-header.h
+++ b/drivers/mtd/ubi/ubi-media.h
@@ -24,11 +24,11 @@
24 24
25/* 25/*
26 * This file defines the layout of UBI headers and all the other UBI on-flash 26 * This file defines the layout of UBI headers and all the other UBI on-flash
27 * data structures. May be included by user-space. 27 * data structures.
28 */ 28 */
29 29
30#ifndef __UBI_HEADER_H__ 30#ifndef __UBI_MEDIA_H__
31#define __UBI_HEADER_H__ 31#define __UBI_MEDIA_H__
32 32
33#include <asm/byteorder.h> 33#include <asm/byteorder.h>
34 34
@@ -369,4 +369,4 @@ struct ubi_vtbl_record {
369 __be32 crc; 369 __be32 crc;
370} __attribute__ ((packed)); 370} __attribute__ ((packed));
371 371
372#endif /* !__UBI_HEADER_H__ */ 372#endif /* !__UBI_MEDIA_H__ */
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index 8f095cb87108..67dcbd11c15c 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -37,10 +37,9 @@
37#include <linux/string.h> 37#include <linux/string.h>
38#include <linux/vmalloc.h> 38#include <linux/vmalloc.h>
39#include <linux/mtd/mtd.h> 39#include <linux/mtd/mtd.h>
40
41#include <mtd/ubi-header.h>
42#include <linux/mtd/ubi.h> 40#include <linux/mtd/ubi.h>
43 41
42#include "ubi-media.h"
44#include "scan.h" 43#include "scan.h"
45#include "debug.h" 44#include "debug.h"
46 45
diff --git a/include/mtd/Kbuild b/include/mtd/Kbuild
index 4d46b3bdebd8..8eb018f96002 100644
--- a/include/mtd/Kbuild
+++ b/include/mtd/Kbuild
@@ -3,5 +3,4 @@ header-y += jffs2-user.h
3header-y += mtd-abi.h 3header-y += mtd-abi.h
4header-y += mtd-user.h 4header-y += mtd-user.h
5header-y += nftl-user.h 5header-y += nftl-user.h
6header-y += ubi-header.h
7header-y += ubi-user.h 6header-y += ubi-user.h