]> www.infradead.org Git - mtd-utils.git/commitdiff
libmtd: amend interface
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sat, 18 Apr 2009 13:01:40 +0000 (16:01 +0300)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sat, 18 Apr 2009 13:05:50 +0000 (16:05 +0300)
Remove the fd field from the mtd information data structure,
because libmtd does not really know the device node file name,
and serves only as a place to save the descriptor. The callers
should find a better place.

This patch improves code readability and prepares for further
changes.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
ubi-utils/include/libmtd.h
ubi-utils/include/libscan.h
ubi-utils/src/libmtd.c
ubi-utils/src/libscan.c
ubi-utils/src/ubiformat.c

index c50059d9ab6beed715d10d652b06869338c92161..9c7a6e3ac806cf3abbe2f9f9ac10d74b9c591e2f 100644 (file)
@@ -41,7 +41,6 @@ extern "C" {
  * @subpage_size: sub-page size (not set by 'mtd_get_info()'!!!)
  * @rdonly: non-zero if the device is read-only
  * @allows_bb: non-zero if the MTD device may have bad eraseblocks
- * @fd: descriptor of the opened MTD character device node
  */
 struct mtd_info
 {
@@ -57,7 +56,6 @@ struct mtd_info
        int subpage_size;
        unsigned int rdonly:1;
        unsigned int allows_bb:1;
-       int fd;
 };
 
 /**
@@ -74,36 +72,40 @@ int mtd_get_info(const char *node, struct mtd_info *mtd);
 /**
  * mtd_erase - erase an eraseblock.
  * @mtd: MTD device description object
+ * @fd: MTD device node file descriptor
  * @eb: eraseblock to erase
  *
- * This function erases the eraseblock and returns %0 in case of success and
- * %-1 in case of failure.
+ * This function erases eraseblock @eb of MTD device decribed by @fd. Returns
+ * %0 in case of success and %-1 in case of failure.
  */
-int mtd_erase(const struct mtd_info *mtd, int eb);
+int mtd_erase(const struct mtd_info *mtd, int fd, int eb);
 
 /**
  * mtd_is_bad - check if eraseblock is bad.
  * @mtd: MTD device description object
+ * @fd: MTD device node file descriptor
  * @eb: eraseblock to check
  *
  * This function checks if eraseblock @eb is bad. Returns %0 if not, %1 if yes,
  * and %-1 in case of failure.
  */
-int mtd_is_bad(const struct mtd_info *mtd, int eb);
+int mtd_is_bad(const struct mtd_info *mtd, int fd, int eb);
 
 /**
  * mtd_mark_bad - marks the block as bad.
  * @mtd: MTD device description object
+ * @fd: MTD device node file descriptor
  * @eb: eraseblock to mark bad
  *
  * This function marks the eraseblock @eb as bad. Returns %0 if success
  * %-1 if failure
  */
-int mtd_mark_bad(const struct mtd_info *mtd, int eb);
+int mtd_mark_bad(const struct mtd_info *mtd, int fd, int eb);
 
 /**
  * mtd_read - read data from an MTD device.
  * @mtd: MTD device description object
+ * @fd: MTD device node file descriptor
  * @eb: eraseblock to read from
  * @offs: offset withing the eraseblock to read from
  * @buf: buffer to read data to
@@ -113,11 +115,13 @@ int mtd_mark_bad(const struct mtd_info *mtd, int eb);
  * of the MTD device defined by @mtd and stores the read data at buffer @buf.
  * Returns %0 in case of success and %-1 in case of failure.
  */
-int mtd_read(const struct mtd_info *mtd, int eb, int offs, void *buf, int len);
+int mtd_read(const struct mtd_info *mtd, int fd, int eb, int offs, void *buf,
+            int len);
 
 /**
  * mtd_write - write data to an MTD device.
  * @mtd: MTD device description object
+ * @fd: MTD device node file descriptor
  * @eb: eraseblock to write to
  * @offs: offset withing the eraseblock to write to
  * @buf: buffer to write
@@ -127,7 +131,8 @@ int mtd_read(const struct mtd_info *mtd, int eb, int offs, void *buf, int len);
  * of the MTD device defined by @mtd. Returns %0 in case of success and %-1 in
  * case of failure.
  */
-int mtd_write(const struct mtd_info *mtd, int eb, int offs, void *buf, int len);
+int mtd_write(const struct mtd_info *mtd, int fd, int eb, int offs, void *buf,
+             int len);
 
 #ifdef __cplusplus
 }
index 5afc93e3a626631e9dd4d7055b55b5ac9f518c3e..8597b98d25d7440db7d7bbe826493ae894b31b01 100644 (file)
@@ -92,11 +92,13 @@ struct mtd_info;
 /**
  * ubi_scan - scan an MTD device.
  * @mtd: information about the MTD device to scan
+ * @fd: MTD device node file descriptor
  * @info: the result of the scanning is returned here
  * @verbose: verbose mode: %0 - be silent, %1 - output progress information,
  *           2 - debugging output mode
  */
-int ubi_scan(struct mtd_info *mtd, struct ubi_scan_info **info, int verbose);
+int ubi_scan(struct mtd_info *mtd, int fd, struct ubi_scan_info **info,
+            int verbose);
 
 /**
  * ubi_scan_free - free scanning information.
index 4cc9bdb24d0e768245df338594f7aa0452564ff2..127d0ec59cdd733732f9c300c19eb3870242d089 100644 (file)
@@ -37,7 +37,7 @@ int mtd_get_info(const char *node, struct mtd_info *mtd)
 {
        struct stat st;
        struct mtd_info_user ui;
-       int ret;
+       int fd, ret;
        loff_t offs = 0;
 
        if (stat(node, &st))
@@ -60,16 +60,16 @@ int mtd_get_info(const char *node, struct mtd_info *mtd)
        mtd->num = mtd->minor / 2;
        mtd->rdonly = mtd->minor & 1;
 
-       mtd->fd = open(node, O_RDWR);
-       if (mtd->fd == -1)
+       fd = open(node, O_RDWR);
+       if (fd == -1)
                return sys_errmsg("cannot open \"%s\"", node);
 
-       if (ioctl(mtd->fd, MEMGETINFO, &ui)) {
+       if (ioctl(fd, MEMGETINFO, &ui)) {
                sys_errmsg("MEMGETINFO ioctl request failed");
                goto out_close;
        }
 
-       ret = ioctl(mtd->fd, MEMGETBADBLOCK, &offs);
+       ret = ioctl(fd, MEMGETBADBLOCK, &offs);
        if (ret == -1) {
                if (errno != EOPNOTSUPP) {
                        sys_errmsg("MEMGETBADBLOCK ioctl failed");
@@ -133,23 +133,24 @@ int mtd_get_info(const char *node, struct mtd_info *mtd)
        if (!(ui.flags & MTD_WRITEABLE))
                mtd->rdonly = 1;
 
+       close(fd);
        return 0;
 
 out_close:
-       close(mtd->fd);
+       close(fd);
        return -1;
 }
 
-int mtd_erase(const struct mtd_info *mtd, int eb)
+int mtd_erase(const struct mtd_info *mtd, int fd, int eb)
 {
        struct erase_info_user ei;
 
        ei.start = eb * mtd->eb_size;;
        ei.length = mtd->eb_size;
-       return ioctl(mtd->fd, MEMERASE, &ei);
+       return ioctl(fd, MEMERASE, &ei);
 }
 
-int mtd_is_bad(const struct mtd_info *mtd, int eb)
+int mtd_is_bad(const struct mtd_info *mtd, int fd, int eb)
 {
        int ret;
        loff_t seek;
@@ -165,14 +166,14 @@ int mtd_is_bad(const struct mtd_info *mtd, int eb)
                return 0;
 
        seek = (loff_t)eb * mtd->eb_size;
-       ret = ioctl(mtd->fd, MEMGETBADBLOCK, &seek);
+       ret = ioctl(fd, MEMGETBADBLOCK, &seek);
        if (ret == -1)
                return sys_errmsg("MEMGETBADBLOCK ioctl failed for "
                                  "eraseblock %d (mtd%d)", eb, mtd->num);
        return ret;
 }
 
-int mtd_mark_bad(const struct mtd_info *mtd, int eb)
+int mtd_mark_bad(const struct mtd_info *mtd, int fd, int eb)
 {
        int ret;
        loff_t seek;
@@ -190,14 +191,15 @@ int mtd_mark_bad(const struct mtd_info *mtd, int eb)
        }
 
        seek = (loff_t)eb * mtd->eb_size;
-       ret = ioctl(mtd->fd, MEMSETBADBLOCK, &seek);
+       ret = ioctl(fd, MEMSETBADBLOCK, &seek);
        if (ret == -1)
                return sys_errmsg("MEMSETBADBLOCK ioctl failed for "
                                  "eraseblock %d (mtd%d)", eb, mtd->num);
        return 0;
 }
 
-int mtd_read(const struct mtd_info *mtd, int eb, int offs, void *buf, int len)
+int mtd_read(const struct mtd_info *mtd, int fd, int eb, int offs, void *buf,
+            int len)
 {
        int ret, rd = 0;
        off_t seek;
@@ -217,12 +219,12 @@ int mtd_read(const struct mtd_info *mtd, int eb, int offs, void *buf, int len)
 
        /* Seek to the beginning of the eraseblock */
        seek = (off_t)eb * mtd->eb_size + offs;
-       if (lseek(mtd->fd, seek, SEEK_SET) != seek)
+       if (lseek(fd, seek, SEEK_SET) != seek)
                return sys_errmsg("cannot seek mtd%d to offset %llu",
                                  mtd->num, (unsigned long long)seek);
 
        while (rd < len) {
-               ret = read(mtd->fd, buf, len);
+               ret = read(fd, buf, len);
                if (ret < 0)
                        return sys_errmsg("cannot read %d bytes from mtd%d (eraseblock %d, offset %d)",
                                          len, mtd->num, eb, offs);
@@ -232,7 +234,8 @@ int mtd_read(const struct mtd_info *mtd, int eb, int offs, void *buf, int len)
        return 0;
 }
 
-int mtd_write(const struct mtd_info *mtd, int eb, int offs, void *buf, int len)
+int mtd_write(const struct mtd_info *mtd, int fd, int eb, int offs, void *buf,
+             int len)
 {
        int ret;
        off_t seek;
@@ -266,11 +269,11 @@ int mtd_write(const struct mtd_info *mtd, int eb, int offs, void *buf, int len)
 
        /* Seek to the beginning of the eraseblock */
        seek = (off_t)eb * mtd->eb_size + offs;
-       if (lseek(mtd->fd, seek, SEEK_SET) != seek)
+       if (lseek(fd, seek, SEEK_SET) != seek)
                return sys_errmsg("cannot seek mtd%d to offset %llu",
                                  mtd->num, (unsigned long long)seek);
 
-       ret = write(mtd->fd, buf, len);
+       ret = write(fd, buf, len);
        if (ret != len)
                return sys_errmsg("cannot write %d bytes to mtd%d (eraseblock %d, offset %d)",
                                  len, mtd->num, eb, offs);
index dc1f0839eb449ceb79d21d3061a042f3c5d2616f..4d64bca8683e665d759f46738f191fa3ac41ea72 100644 (file)
@@ -48,7 +48,7 @@ static int all_ff(const void *buf, int len)
        return 1;
 }
 
-int ubi_scan(struct mtd_info *mtd, struct ubi_scan_info **info, int verbose)
+int ubi_scan(struct mtd_info *mtd, int fd, struct ubi_scan_info **info, int verbose)
 {
        int eb, v = (verbose == 2), pr = (verbose == 1);
        struct ubi_scan_info *si;
@@ -85,7 +85,7 @@ int ubi_scan(struct mtd_info *mtd, struct ubi_scan_info **info, int verbose)
                        fflush(stdout);
                }
 
-               ret = mtd_is_bad(mtd, eb);
+               ret = mtd_is_bad(mtd, fd, eb);
                if (ret == -1)
                        goto out_ec;
                if (ret) {
@@ -96,7 +96,7 @@ int ubi_scan(struct mtd_info *mtd, struct ubi_scan_info **info, int verbose)
                        continue;
                }
 
-               ret = mtd_read(mtd, eb, 0, &hdr, sizeof(struct ubi_ec_hdr));;
+               ret = mtd_read(mtd, fd, eb, 0, &hdr, sizeof(struct ubi_ec_hdr));
                if (ret < 0)
                        goto out_ec;
 
index 3a1b19887aa6020cc5bdc95d6033c90659bfd498..2226a759cccc0165248ea6e1f35b5c811c35c3ff 100644 (file)
@@ -62,6 +62,7 @@ struct args {
        long long ec;
        const char *image;
        const char *node;
+       int node_fd;
 };
 
 static struct args args =
@@ -412,7 +413,7 @@ static int mark_bad(const struct mtd_info *mtd, struct ubi_scan_info *si, int eb
                return errmsg("bad blocks not supported by this flash");
        }
 
-       err = mtd_mark_bad(mtd, eb);
+       err = mtd_mark_bad(mtd, args.node_fd, eb);
        if (err)
                return err;
 
@@ -468,7 +469,7 @@ static int flash_image(const struct mtd_info *mtd, struct ubi_scan_info *si)
                        fflush(stdout);
                }
 
-               err = mtd_erase(mtd, eb);
+               err = mtd_erase(mtd, args.node_fd, eb);
                if (err) {
                        if (!args.quiet)
                                printf("\n");
@@ -518,7 +519,7 @@ static int flash_image(const struct mtd_info *mtd, struct ubi_scan_info *si)
 
                new_len = drop_ffs(mtd, buf, mtd->eb_size);
 
-               err = mtd_write(mtd, eb, 0, buf, new_len);
+               err = mtd_write(mtd, args.node_fd, eb, 0, buf, new_len);
                if (err) {
                        if (!args.quiet)
                                printf("\n");
@@ -565,7 +566,6 @@ static int format(const struct mtd_info *mtd, const struct ubigen_info *ui,
        hdr = malloc(write_size);
        if (!hdr)
                return sys_errmsg("cannot allocate %d bytes of memory", write_size);
-
        memset(hdr, 0xFF, write_size);
 
        for (eb = start_eb; eb < mtd->eb_cnt; eb++) {
@@ -593,7 +593,7 @@ static int format(const struct mtd_info *mtd, const struct ubigen_info *ui,
                        fflush(stdout);
                }
 
-               err = mtd_erase(mtd, eb);
+               err = mtd_erase(mtd, args.node_fd, eb);
                if (err) {
                        if (!args.quiet)
                                printf("\n");
@@ -625,7 +625,7 @@ static int format(const struct mtd_info *mtd, const struct ubigen_info *ui,
                        fflush(stdout);
                }
 
-               err = mtd_write(mtd, eb, 0, hdr, write_size);
+               err = mtd_write(mtd, args.node_fd, eb, 0, hdr, write_size);
                if (err) {
                        if (!args.quiet && !args.verbose)
                                printf("\n");
@@ -662,7 +662,8 @@ static int format(const struct mtd_info *mtd, const struct ubigen_info *ui,
                if (!vtbl)
                        goto out_free;
 
-               err = ubigen_write_layout_vol(ui, eb1, eb2, ec1,  ec2, vtbl, mtd->fd);
+               err = ubigen_write_layout_vol(ui, eb1, eb2, ec1,  ec2, vtbl,
+                                             args.node_fd);
                free(vtbl);
                if (err) {
                        errmsg("cannot write layout volume");
@@ -694,17 +695,21 @@ int main(int argc, char * const argv[])
        if (err)
                return errmsg("cannot get information about \"%s\"", args.node);
 
+       args.node_fd = open(args.node, O_RDWR);
+       if (args.node_fd == -1)
+               return sys_errmsg("cannot open \"%s\"", args.node);
+
        if (args.subpage_size == 0)
                args.subpage_size = mtd.min_io_size;
        else {
                if (args.subpage_size > mtd.min_io_size) {
                        errmsg("sub-page cannot be larger than min. I/O unit");
-                       goto out_close;
+                       goto out;
                }
 
                if (mtd.min_io_size % args.subpage_size) {
                        errmsg("min. I/O unit size should be multiple of sub-page size");
-                       goto out_close;
+                       goto out;
                }
        }
 
@@ -712,11 +717,11 @@ int main(int argc, char * const argv[])
        if (args.vid_hdr_offs != 0) {
                if (args.vid_hdr_offs % 8) {
                        errmsg("VID header offset has to be multiple of min. I/O unit size");
-                       goto out_close;
+                       goto out;
                }
                if (args.vid_hdr_offs + (int)UBI_VID_HDR_SIZE > mtd.eb_size) {
                        errmsg("bad VID header offset");
-                       goto out_close;
+                       goto out;
                }
        }
 
@@ -729,7 +734,7 @@ int main(int argc, char * const argv[])
 
        if (mtd.rdonly) {
                errmsg("mtd%d (%s) is a read-only device", mtd.num, args.node);
-               goto out_close;
+               goto out;
        }
 
        /* Make sure this MTD device is not attached to UBI */
@@ -742,7 +747,7 @@ int main(int argc, char * const argv[])
                if (!err) {
                        errmsg("please, first detach mtd%d (%s) from ubi%d",
                               mtd.num, args.node, ubi_dev_num);
-                       goto out_close;
+                       goto out;
                }
        }
 
@@ -760,10 +765,10 @@ int main(int argc, char * const argv[])
                verbose = 2;
        else
                verbose = 1;
-       err = ubi_scan(&mtd, &si, verbose);
+       err = ubi_scan(&mtd, args.node_fd, &si, verbose);
        if (err) {
                errmsg("failed to scan mtd%d (%s)", mtd.num, args.node);
-               goto out_close;
+               goto out;
        }
 
        if (si->good_cnt == 0) {
@@ -877,12 +882,12 @@ int main(int argc, char * const argv[])
        }
 
        ubi_scan_free(si);
-       close(mtd.fd);
+       close(args.node_fd);
        return 0;
 
 out_free:
        ubi_scan_free(si);
-out_close:
-       close(mtd.fd);
+out:
+       close(args.node_fd);
        return -1;
 }