[PATCH RFC v2] UBI: New ioctl() to support ubidump
Richard Weinberger
richard.weinberger at gmail.com
Tue Jul 29 09:37:05 PDT 2014
On Tue, Jul 29, 2014 at 11:26 AM, hujianyang <hujianyang at huawei.com> wrote:
> An ioctl() return pnum of a specified leb.
>
>
> Signed-off-by: hujianyang <hujianyang at huawei.com>
> ---
> drivers/mtd/ubi/cdev.c | 26 ++++++++++++++++++++++++++
> include/uapi/mtd/ubi-user.h | 12 ++++++++++++
> 2 files changed, 38 insertions(+)
>
> diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
> index 7646220..6fa7346 100644
> --- a/drivers/mtd/ubi/cdev.c
> +++ b/drivers/mtd/ubi/cdev.c
> @@ -581,6 +581,32 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd,
> break;
> }
>
> + /* Get pnum of a specified leb command */
> + case UBI_IOCEBGETPNUM:
> + {
> + struct ubi_lnum2pnum_req req;
> + int pnum;
> +
> + err = copy_from_user(&req, argp,
> + sizeof(struct ubi_lnum2pnum_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;
Isn't this racy?
i.e. If a LEB change happens between ubi_is_mapped() and "pnum =
vol->eba_tbl[req.lnum]".
> + err = copy_to_user(argp, &req,
> + sizeof(struct ubi_lnum2pnum_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..fc41ddb 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)
> +/* Get pnum of a specified leb */
> +#define UBI_IOCEBGETPNUM _IOW(UBI_VOL_IOC_MAGIC, 9, struct ubi_lnum2pnum_req)
>
> /* Maximum MTD device name length supported by UBI */
> #define MAX_UBI_MTD_NAME_LEN 127
> @@ -442,4 +444,14 @@ struct ubi_blkcreate_req {
> __s8 padding[128];
> } __packed;
>
> +/**
> + * struct ubi_lnum2pnum_req - a data structure used in lnum translate requests.
> + * @lnum: logical eraseblock num to translate
> + * @pnum: physical eraseblock num @lnum mapped
> + */
> +struct ubi_lnum2pnum_req {
> + __s32 lnum;
> + __s32 pnum;
> +} __packed;
> +
> #endif /* __UBI_USER_H__ */
> --
> 1.8.1.4
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
--
Thanks,
//richard
More information about the linux-mtd
mailing list