[PATCH 1/7] UBI: Add a new ioctl to support ubidump
hujianyang
hujianyang at huawei.com
Mon Jul 7 00:17:47 PDT 2014
Add a new ioctl to dump EC header and VID header to user space. This
ioctl is called without lock so I think users *should not* run ubidump
when volume is mounted.
Struct ubi_ebdump_req is used to transfer data between user space and
kernel space. Can I find a way to set buffer length from '64' to
UBI_VID_HDR_SIZE and UBI_EC_HDR_SIZE?
Signed-off-by: hujianyang <hujianyang at huawei.com>
---
drivers/mtd/ubi/cdev.c | 50 +++++++++++++++++++++++++++++++++++++++++++++
include/uapi/mtd/ubi-user.h | 15 ++++++++++++++
2 files changed, 65 insertions(+)
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
index 7646220..5b94323 100644
--- a/drivers/mtd/ubi/cdev.c
+++ b/drivers/mtd/ubi/cdev.c
@@ -581,6 +581,56 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd,
break;
}
+ case UBI_IOCEBDUMP:
+ {
+ int pnum;
+ struct ubi_ebdump_req req;
+ struct ubi_ec_hdr *ec_hdr;
+ struct ubi_vid_hdr *vid_hdr;
+
+ err = copy_from_user(&req, argp,
+ sizeof(struct ubi_ebdump_req));
+ if (err) {
+ err = -EFAULT;
+ break;
+ }
+
+ err = ubi_is_mapped(desc, req.lnum);
+ if (err <= 0)
+ break;
+ pnum = vol->eba_tbl[req.lnum];
+ req.pnum = pnum;
+
+ /*
+ * No need to check return value of ubi_io_read(),
+ * we will confirm the date in user space.
+ */
+ ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_NOFS);
+ if (!ec_hdr) {
+ err = -ENOMEM;
+ break;
+ }
+ ubi_io_read_ec_hdr(ubi, pnum, ec_hdr, 0);
+ memcpy(req.ec_hdr, ec_hdr, UBI_EC_HDR_SIZE);
+ kfree(ec_hdr);
+
+ vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS);
+ if (!vid_hdr) {
+ err = -ENOMEM;
+ break;
+ }
+ ubi_io_read_vid_hdr(ubi, pnum, vid_hdr, 1);
+ memcpy(req.vid_hdr, vid_hdr, UBI_VID_HDR_SIZE);
+ ubi_free_vid_hdr(ubi, vid_hdr);
+
+ err = copy_to_user(argp, &req,
+ sizeof(struct ubi_ebdump_req));
+ if (err)
+ err = -EFAULT;
+
+ break;
+ }
+
default:
err = -ENOTTY;
break;
diff --git a/include/uapi/mtd/ubi-user.h b/include/uapi/mtd/ubi-user.h
index 1927b0d..76ff035 100644
--- a/include/uapi/mtd/ubi-user.h
+++ b/include/uapi/mtd/ubi-user.h
@@ -205,6 +205,8 @@
#define UBI_IOCVOLCRBLK _IOW(UBI_VOL_IOC_MAGIC, 7, struct ubi_blkcreate_req)
/* Remove the R/O block device */
#define UBI_IOCVOLRMBLK _IO(UBI_VOL_IOC_MAGIC, 8)
+/* Dump LEB header */
+#define UBI_IOCEBDUMP _IOW(UBI_VOL_IOC_MAGIC, 9, struct ubi_ebdump_req)
/* Maximum MTD device name length supported by UBI */
#define MAX_UBI_MTD_NAME_LEN 127
@@ -442,4 +444,17 @@ struct ubi_blkcreate_req {
__s8 padding[128];
} __packed;
+/**
+ * struct ubi_ebdump_req - a data structure used in dump eraseblock header.
+ * @lnum: logical eraseblock num to dump
+ * @ec_hdr: ec_hdr to set
+ * @vid_hdr: vid_hdr to set
+ */
+struct ubi_ebdump_req {
+ __s32 lnum;
+ __s32 pnum;
+ char ec_hdr[64];
+ char vid_hdr[64];
+} __packed;
+
#endif /* __UBI_USER_H__ */
--
1.8.1.4
More information about the linux-mtd
mailing list