diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2009-01-16 12:08:43 -0500 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2009-01-18 07:27:44 -0500 |
commit | 3013ee31b6c5fd9a49a81816d6c13e1cdb7a1288 (patch) | |
tree | 96cb10bb6576c4cbeb9843831a56c371174b29dc /drivers/mtd | |
parent | f429b2ea8eadb5a576542a70f7fd6f5c2a7455e1 (diff) |
UBI: use nicer 64-bit math
Get rid of 'do_div()' and use more user-friendly primitives from
'linux/math64.h'.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/ubi/cdev.c | 20 | ||||
-rw-r--r-- | drivers/mtd/ubi/gluebi.c | 11 | ||||
-rw-r--r-- | drivers/mtd/ubi/scan.c | 8 | ||||
-rw-r--r-- | drivers/mtd/ubi/upd.c | 21 | ||||
-rw-r--r-- | drivers/mtd/ubi/vmt.c | 17 |
5 files changed, 25 insertions, 52 deletions
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index 0a2d835fec80..f9631eb3fef3 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c | |||
@@ -41,8 +41,8 @@ | |||
41 | #include <linux/capability.h> | 41 | #include <linux/capability.h> |
42 | #include <linux/uaccess.h> | 42 | #include <linux/uaccess.h> |
43 | #include <linux/compat.h> | 43 | #include <linux/compat.h> |
44 | #include <linux/math64.h> | ||
44 | #include <mtd/ubi-user.h> | 45 | #include <mtd/ubi-user.h> |
45 | #include <asm/div64.h> | ||
46 | #include "ubi.h" | 46 | #include "ubi.h" |
47 | 47 | ||
48 | /** | 48 | /** |
@@ -195,7 +195,6 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count, | |||
195 | int err, lnum, off, len, tbuf_size; | 195 | int err, lnum, off, len, tbuf_size; |
196 | size_t count_save = count; | 196 | size_t count_save = count; |
197 | void *tbuf; | 197 | void *tbuf; |
198 | uint64_t tmp; | ||
199 | 198 | ||
200 | dbg_gen("read %zd bytes from offset %lld of volume %d", | 199 | dbg_gen("read %zd bytes from offset %lld of volume %d", |
201 | count, *offp, vol->vol_id); | 200 | count, *offp, vol->vol_id); |
@@ -225,10 +224,7 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count, | |||
225 | return -ENOMEM; | 224 | return -ENOMEM; |
226 | 225 | ||
227 | len = count > tbuf_size ? tbuf_size : count; | 226 | len = count > tbuf_size ? tbuf_size : count; |
228 | 227 | lnum = div_u64_rem(*offp, vol->usable_leb_size, &off); | |
229 | tmp = *offp; | ||
230 | off = do_div(tmp, vol->usable_leb_size); | ||
231 | lnum = tmp; | ||
232 | 228 | ||
233 | do { | 229 | do { |
234 | cond_resched(); | 230 | cond_resched(); |
@@ -279,7 +275,6 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf, | |||
279 | int lnum, off, len, tbuf_size, err = 0; | 275 | int lnum, off, len, tbuf_size, err = 0; |
280 | size_t count_save = count; | 276 | size_t count_save = count; |
281 | char *tbuf; | 277 | char *tbuf; |
282 | uint64_t tmp; | ||
283 | 278 | ||
284 | dbg_gen("requested: write %zd bytes to offset %lld of volume %u", | 279 | dbg_gen("requested: write %zd bytes to offset %lld of volume %u", |
285 | count, *offp, vol->vol_id); | 280 | count, *offp, vol->vol_id); |
@@ -287,10 +282,7 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf, | |||
287 | if (vol->vol_type == UBI_STATIC_VOLUME) | 282 | if (vol->vol_type == UBI_STATIC_VOLUME) |
288 | return -EROFS; | 283 | return -EROFS; |
289 | 284 | ||
290 | tmp = *offp; | 285 | lnum = div_u64_rem(*offp, vol->usable_leb_size, &off); |
291 | off = do_div(tmp, vol->usable_leb_size); | ||
292 | lnum = tmp; | ||
293 | |||
294 | if (off & (ubi->min_io_size - 1)) { | 286 | if (off & (ubi->min_io_size - 1)) { |
295 | dbg_err("unaligned position"); | 287 | dbg_err("unaligned position"); |
296 | return -EINVAL; | 288 | return -EINVAL; |
@@ -882,7 +874,6 @@ static long ubi_cdev_ioctl(struct file *file, unsigned int cmd, | |||
882 | case UBI_IOCRSVOL: | 874 | case UBI_IOCRSVOL: |
883 | { | 875 | { |
884 | int pebs; | 876 | int pebs; |
885 | uint64_t tmp; | ||
886 | struct ubi_rsvol_req req; | 877 | struct ubi_rsvol_req req; |
887 | 878 | ||
888 | dbg_gen("re-size volume"); | 879 | dbg_gen("re-size volume"); |
@@ -902,9 +893,8 @@ static long ubi_cdev_ioctl(struct file *file, unsigned int cmd, | |||
902 | break; | 893 | break; |
903 | } | 894 | } |
904 | 895 | ||
905 | tmp = req.bytes; | 896 | pebs = div_u64(req.bytes + desc->vol->usable_leb_size - 1, |
906 | pebs = !!do_div(tmp, desc->vol->usable_leb_size); | 897 | desc->vol->usable_leb_size); |
907 | pebs += tmp; | ||
908 | 898 | ||
909 | mutex_lock(&ubi->volumes_mutex); | 899 | mutex_lock(&ubi->volumes_mutex); |
910 | err = ubi_resize_volume(desc, pebs); | 900 | err = ubi_resize_volume(desc, pebs); |
diff --git a/drivers/mtd/ubi/gluebi.c b/drivers/mtd/ubi/gluebi.c index 6dd4f5e77f82..49cd55ade9c8 100644 --- a/drivers/mtd/ubi/gluebi.c +++ b/drivers/mtd/ubi/gluebi.c | |||
@@ -28,7 +28,7 @@ | |||
28 | * eraseblock size is equivalent to the logical eraseblock size of the volume. | 28 | * eraseblock size is equivalent to the logical eraseblock size of the volume. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <asm/div64.h> | 31 | #include <linux/math64.h> |
32 | #include "ubi.h" | 32 | #include "ubi.h" |
33 | 33 | ||
34 | /** | 34 | /** |
@@ -109,7 +109,6 @@ static int gluebi_read(struct mtd_info *mtd, loff_t from, size_t len, | |||
109 | int err = 0, lnum, offs, total_read; | 109 | int err = 0, lnum, offs, total_read; |
110 | struct ubi_volume *vol; | 110 | struct ubi_volume *vol; |
111 | struct ubi_device *ubi; | 111 | struct ubi_device *ubi; |
112 | uint64_t tmp = from; | ||
113 | 112 | ||
114 | dbg_gen("read %zd bytes from offset %lld", len, from); | 113 | dbg_gen("read %zd bytes from offset %lld", len, from); |
115 | 114 | ||
@@ -119,9 +118,7 @@ static int gluebi_read(struct mtd_info *mtd, loff_t from, size_t len, | |||
119 | vol = container_of(mtd, struct ubi_volume, gluebi_mtd); | 118 | vol = container_of(mtd, struct ubi_volume, gluebi_mtd); |
120 | ubi = vol->ubi; | 119 | ubi = vol->ubi; |
121 | 120 | ||
122 | offs = do_div(tmp, mtd->erasesize); | 121 | lnum = div_u64_rem(from, mtd->erasesize, &offs); |
123 | lnum = tmp; | ||
124 | |||
125 | total_read = len; | 122 | total_read = len; |
126 | while (total_read) { | 123 | while (total_read) { |
127 | size_t to_read = mtd->erasesize - offs; | 124 | size_t to_read = mtd->erasesize - offs; |
@@ -160,7 +157,6 @@ static int gluebi_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
160 | int err = 0, lnum, offs, total_written; | 157 | int err = 0, lnum, offs, total_written; |
161 | struct ubi_volume *vol; | 158 | struct ubi_volume *vol; |
162 | struct ubi_device *ubi; | 159 | struct ubi_device *ubi; |
163 | uint64_t tmp = to; | ||
164 | 160 | ||
165 | dbg_gen("write %zd bytes to offset %lld", len, to); | 161 | dbg_gen("write %zd bytes to offset %lld", len, to); |
166 | 162 | ||
@@ -173,8 +169,7 @@ static int gluebi_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
173 | if (ubi->ro_mode) | 169 | if (ubi->ro_mode) |
174 | return -EROFS; | 170 | return -EROFS; |
175 | 171 | ||
176 | offs = do_div(tmp, mtd->erasesize); | 172 | lnum = div_u64_rem(to, mtd->erasesize, &offs); |
177 | lnum = tmp; | ||
178 | 173 | ||
179 | if (len % mtd->writesize || offs % mtd->writesize) | 174 | if (len % mtd->writesize || offs % mtd->writesize) |
180 | return -EINVAL; | 175 | return -EINVAL; |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index ecde202a5a12..c3d653ba5ca0 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
@@ -42,7 +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 <linux/math64.h> |
46 | #include "ubi.h" | 46 | #include "ubi.h" |
47 | 47 | ||
48 | #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID | 48 | #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID |
@@ -904,10 +904,8 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi) | |||
904 | dbg_msg("scanning is finished"); | 904 | dbg_msg("scanning is finished"); |
905 | 905 | ||
906 | /* Calculate mean erase counter */ | 906 | /* Calculate mean erase counter */ |
907 | if (si->ec_count) { | 907 | if (si->ec_count) |
908 | do_div(si->ec_sum, si->ec_count); | 908 | si->mean_ec = div_u64(si->ec_sum, si->ec_count); |
909 | si->mean_ec = si->ec_sum; | ||
910 | } | ||
911 | 909 | ||
912 | if (si->is_empty) | 910 | if (si->is_empty) |
913 | ubi_msg("empty MTD device detected"); | 911 | ubi_msg("empty MTD device detected"); |
diff --git a/drivers/mtd/ubi/upd.c b/drivers/mtd/ubi/upd.c index 8b89cc18ff0b..6b4d1ae891ae 100644 --- a/drivers/mtd/ubi/upd.c +++ b/drivers/mtd/ubi/upd.c | |||
@@ -40,7 +40,7 @@ | |||
40 | 40 | ||
41 | #include <linux/err.h> | 41 | #include <linux/err.h> |
42 | #include <linux/uaccess.h> | 42 | #include <linux/uaccess.h> |
43 | #include <asm/div64.h> | 43 | #include <linux/math64.h> |
44 | #include "ubi.h" | 44 | #include "ubi.h" |
45 | 45 | ||
46 | /** | 46 | /** |
@@ -89,7 +89,6 @@ static int clear_update_marker(struct ubi_device *ubi, struct ubi_volume *vol, | |||
89 | long long bytes) | 89 | long long bytes) |
90 | { | 90 | { |
91 | int err; | 91 | int err; |
92 | uint64_t tmp; | ||
93 | struct ubi_vtbl_record vtbl_rec; | 92 | struct ubi_vtbl_record vtbl_rec; |
94 | 93 | ||
95 | dbg_gen("clear update marker for volume %d", vol->vol_id); | 94 | dbg_gen("clear update marker for volume %d", vol->vol_id); |
@@ -101,9 +100,9 @@ static int clear_update_marker(struct ubi_device *ubi, struct ubi_volume *vol, | |||
101 | 100 | ||
102 | if (vol->vol_type == UBI_STATIC_VOLUME) { | 101 | if (vol->vol_type == UBI_STATIC_VOLUME) { |
103 | vol->corrupted = 0; | 102 | vol->corrupted = 0; |
104 | vol->used_bytes = tmp = bytes; | 103 | vol->used_bytes = bytes; |
105 | vol->last_eb_bytes = do_div(tmp, vol->usable_leb_size); | 104 | vol->used_ebs = div_u64_rem(bytes, vol->usable_leb_size, |
106 | vol->used_ebs = tmp; | 105 | &vol->last_eb_bytes); |
107 | if (vol->last_eb_bytes) | 106 | if (vol->last_eb_bytes) |
108 | vol->used_ebs += 1; | 107 | vol->used_ebs += 1; |
109 | else | 108 | else |
@@ -131,7 +130,6 @@ int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol, | |||
131 | long long bytes) | 130 | long long bytes) |
132 | { | 131 | { |
133 | int i, err; | 132 | int i, err; |
134 | uint64_t tmp; | ||
135 | 133 | ||
136 | dbg_gen("start update of volume %d, %llu bytes", vol->vol_id, bytes); | 134 | dbg_gen("start update of volume %d, %llu bytes", vol->vol_id, bytes); |
137 | ubi_assert(!vol->updating && !vol->changing_leb); | 135 | ubi_assert(!vol->updating && !vol->changing_leb); |
@@ -161,9 +159,8 @@ int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol, | |||
161 | if (!vol->upd_buf) | 159 | if (!vol->upd_buf) |
162 | return -ENOMEM; | 160 | return -ENOMEM; |
163 | 161 | ||
164 | tmp = bytes; | 162 | vol->upd_ebs = div_u64(bytes + vol->usable_leb_size - 1, |
165 | vol->upd_ebs = !!do_div(tmp, vol->usable_leb_size); | 163 | vol->usable_leb_size); |
166 | vol->upd_ebs += tmp; | ||
167 | vol->upd_bytes = bytes; | 164 | vol->upd_bytes = bytes; |
168 | vol->upd_received = 0; | 165 | vol->upd_received = 0; |
169 | return 0; | 166 | return 0; |
@@ -282,7 +279,6 @@ static int write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum, | |||
282 | int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol, | 279 | int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol, |
283 | const void __user *buf, int count) | 280 | const void __user *buf, int count) |
284 | { | 281 | { |
285 | uint64_t tmp; | ||
286 | int lnum, offs, err = 0, len, to_write = count; | 282 | int lnum, offs, err = 0, len, to_write = count; |
287 | 283 | ||
288 | dbg_gen("write %d of %lld bytes, %lld already passed", | 284 | dbg_gen("write %d of %lld bytes, %lld already passed", |
@@ -291,10 +287,7 @@ int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol, | |||
291 | if (ubi->ro_mode) | 287 | if (ubi->ro_mode) |
292 | return -EROFS; | 288 | return -EROFS; |
293 | 289 | ||
294 | tmp = vol->upd_received; | 290 | lnum = div_u64_rem(vol->upd_received, vol->usable_leb_size, &offs); |
295 | offs = do_div(tmp, vol->usable_leb_size); | ||
296 | lnum = tmp; | ||
297 | |||
298 | if (vol->upd_received + count > vol->upd_bytes) | 291 | if (vol->upd_received + count > vol->upd_bytes) |
299 | to_write = count = vol->upd_bytes - vol->upd_received; | 292 | to_write = count = vol->upd_bytes - vol->upd_received; |
300 | 293 | ||
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c index 22e1d7398fce..df5483562b7a 100644 --- a/drivers/mtd/ubi/vmt.c +++ b/drivers/mtd/ubi/vmt.c | |||
@@ -24,7 +24,7 @@ | |||
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
27 | #include <asm/div64.h> | 27 | #include <linux/math64.h> |
28 | #include "ubi.h" | 28 | #include "ubi.h" |
29 | 29 | ||
30 | #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID | 30 | #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID |
@@ -205,7 +205,6 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) | |||
205 | int i, err, vol_id = req->vol_id, do_free = 1; | 205 | int i, err, vol_id = req->vol_id, do_free = 1; |
206 | struct ubi_volume *vol; | 206 | struct ubi_volume *vol; |
207 | struct ubi_vtbl_record vtbl_rec; | 207 | struct ubi_vtbl_record vtbl_rec; |
208 | uint64_t bytes; | ||
209 | dev_t dev; | 208 | dev_t dev; |
210 | 209 | ||
211 | if (ubi->ro_mode) | 210 | if (ubi->ro_mode) |
@@ -255,10 +254,8 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) | |||
255 | 254 | ||
256 | /* Calculate how many eraseblocks are requested */ | 255 | /* Calculate how many eraseblocks are requested */ |
257 | vol->usable_leb_size = ubi->leb_size - ubi->leb_size % req->alignment; | 256 | vol->usable_leb_size = ubi->leb_size - ubi->leb_size % req->alignment; |
258 | bytes = req->bytes; | 257 | vol->reserved_pebs += div_u64(req->bytes + vol->usable_leb_size - 1, |
259 | if (do_div(bytes, vol->usable_leb_size)) | 258 | vol->usable_leb_size); |
260 | vol->reserved_pebs = 1; | ||
261 | vol->reserved_pebs += bytes; | ||
262 | 259 | ||
263 | /* Reserve physical eraseblocks */ | 260 | /* Reserve physical eraseblocks */ |
264 | if (vol->reserved_pebs > ubi->avail_pebs) { | 261 | if (vol->reserved_pebs > ubi->avail_pebs) { |
@@ -301,10 +298,10 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) | |||
301 | vol->used_bytes = | 298 | vol->used_bytes = |
302 | (long long)vol->used_ebs * vol->usable_leb_size; | 299 | (long long)vol->used_ebs * vol->usable_leb_size; |
303 | } else { | 300 | } else { |
304 | bytes = vol->used_bytes; | 301 | vol->used_ebs = div_u64_rem(vol->used_bytes, |
305 | vol->last_eb_bytes = do_div(bytes, vol->usable_leb_size); | 302 | vol->usable_leb_size, |
306 | vol->used_ebs = bytes; | 303 | &vol->last_eb_bytes); |
307 | if (vol->last_eb_bytes) | 304 | if (vol->last_eb_bytes != 0) |
308 | vol->used_ebs += 1; | 305 | vol->used_ebs += 1; |
309 | else | 306 | else |
310 | vol->last_eb_bytes = vol->usable_leb_size; | 307 | vol->last_eb_bytes = vol->usable_leb_size; |