diff options
author | Artem Bityutskiy <dedekind1@gmail.com> | 2010-07-17 20:08:33 +0300 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2010-07-26 08:37:00 +0300 |
commit | f1e870c3e9a1a80be7a1d886d61ccac0f8e97e10 (patch) | |
tree | 6860d01fa73cba0bb5de6fcf4a19b7a2ac007e55 /ubi-utils/src | |
parent | 05f56bf49ee0de8979c29c11f61a01e30e964444 (diff) |
libmtd: support MEMERASE64
This patch is base on Kevin Cernekee's patch posted to the MTD mailing
list. It adds MEMERASE64 support to the 'mtd_erase()' call. Now it
first tries to use MEMERASE64, and if that is not supported, falls
back to the old MEMERASE ioctl.
This patch also introduces an 'offs64_ioctl' flag to the libmtd
descriptor. However, we cannot initialize it in 'libmtd_open()',
because we need an MTD device node, which we do not have in
'libmtd_open()'. Thus, we firs mark this flag as "uninitialized",
and at the first invocation of 'mtd_erase()' we initialize it.
This also means that we have to pass the limbtd descriptor to
'mtd_erase()', to save the flag value. This, in turn, requires
tweaking 'mtd_erase()' users.
This is not very nice, but good enough so far.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'ubi-utils/src')
-rw-r--r-- | ubi-utils/src/ubiformat.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/ubi-utils/src/ubiformat.c b/ubi-utils/src/ubiformat.c index 6052a35..4e27e4f 100644 --- a/ubi-utils/src/ubiformat.c +++ b/ubi-utils/src/ubiformat.c @@ -441,8 +441,8 @@ static int mark_bad(const struct mtd_dev_info *mtd, struct ubi_scan_info *si, in return consecutive_bad_check(eb); } -static int flash_image(const struct mtd_dev_info *mtd, const struct ubigen_info *ui, - struct ubi_scan_info *si) +static int flash_image(libmtd_t libmtd, const struct mtd_dev_info *mtd, + const struct ubigen_info *ui, struct ubi_scan_info *si) { int fd, img_ebs, eb, written_ebs = 0, divisor; off_t st_size; @@ -488,7 +488,7 @@ static int flash_image(const struct mtd_dev_info *mtd, const struct ubigen_info fflush(stdout); } - err = mtd_erase(mtd, args.node_fd, eb); + err = mtd_erase(libmtd, mtd, args.node_fd, eb); if (err) { if (!args.quiet) printf("\n"); @@ -543,7 +543,7 @@ static int flash_image(const struct mtd_dev_info *mtd, const struct ubigen_info if (errno != EIO) goto out_close; - err = mtd_torture(mtd, args.node_fd, eb); + err = mtd_torture(libmtd, mtd, args.node_fd, eb); if (err) { if (mark_bad(mtd, si, eb)) goto out_close; @@ -564,8 +564,9 @@ out_close: return -1; } -static int format(const struct mtd_dev_info *mtd, const struct ubigen_info *ui, - struct ubi_scan_info *si, int start_eb, int novtbl) +static int format(libmtd_t libmtd, const struct mtd_dev_info *mtd, + const struct ubigen_info *ui, struct ubi_scan_info *si, + int start_eb, int novtbl) { int eb, err, write_size; struct ubi_ec_hdr *hdr; @@ -606,7 +607,7 @@ static int format(const struct mtd_dev_info *mtd, const struct ubigen_info *ui, fflush(stdout); } - err = mtd_erase(mtd, args.node_fd, eb); + err = mtd_erase(libmtd, mtd, args.node_fd, eb); if (err) { if (!args.quiet) printf("\n"); @@ -652,7 +653,7 @@ static int format(const struct mtd_dev_info *mtd, const struct ubigen_info *ui, goto out_free; } - err = mtd_torture(mtd, args.node_fd, eb); + err = mtd_torture(libmtd, mtd, args.node_fd, eb); if (err) { if (mark_bad(mtd, si, eb)) goto out_free; @@ -922,15 +923,15 @@ int main(int argc, char * const argv[]) } if (args.image) { - err = flash_image(&mtd, &ui, si); + err = flash_image(libmtd, &mtd, &ui, si); if (err < 0) goto out_free; - err = format(&mtd, &ui, si, err, 1); + err = format(libmtd, &mtd, &ui, si, err, 1); if (err) goto out_free; } else { - err = format(&mtd, &ui, si, 0, args.novtbl); + err = format(libmtd, &mtd, &ui, si, 0, args.novtbl); if (err) goto out_free; } |