From 9d54c8a33eec78289b1b3f6e10874719c27ce0a7 Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Tue, 25 Feb 2014 13:25:22 -0300 Subject: UBI: R/O block driver on top of UBI volumes This commit introduces read-only block device emulation on top of UBI volumes. Given UBI takes care of wear leveling and bad block management it's possible to add a thin layer to enable block device access to UBI volumes. This allows to use a block-oriented filesystem on a flash device. The UBI block devices are meant to be used in conjunction with any regular, block-oriented file system (e.g. ext4), although it's primarily targeted at read-only file systems, such as squashfs. Block devices are created upon user request through new ioctls: UBI_IOCVOLATTBLK to attach and UBI_IOCVOLDETBLK to detach. Also, a new UBI module parameter is added 'ubi.block'. This parameter is needed in order to attach a block device on boot-up time, allowing to mount the rootfs on a ubiblock device. For instance, you could have these kernel parameters: ubi.mtd=5 ubi.block=0,0 root=/dev/ubiblock0_0 Or, if you compile ubi as a module: $ modprobe ubi mtd=/dev/mtd5 block=/dev/ubi0_0 Artem: amend commentaries and massage the patch a little bit. Signed-off-by: Ezequiel Garcia Signed-off-by: Artem Bityutskiy --- include/uapi/mtd/ubi-user.h | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'include') diff --git a/include/uapi/mtd/ubi-user.h b/include/uapi/mtd/ubi-user.h index 723c324590c1..b98585ad3346 100644 --- a/include/uapi/mtd/ubi-user.h +++ b/include/uapi/mtd/ubi-user.h @@ -134,6 +134,13 @@ * used. A pointer to a &struct ubi_set_vol_prop_req object is expected to be * passed. The object describes which property should be set, and to which value * it should be set. + * + * Block devices on UBI volumes + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * To attach or detach a block device from an UBI volume the %UBI_IOCVOLATTBLK + * and %UBI_IOCVOLDETBLK ioctl commands should be used, respectively. + * These commands take no arguments. */ /* @@ -191,6 +198,10 @@ /* Set an UBI volume property */ #define UBI_IOCSETVOLPROP _IOW(UBI_VOL_IOC_MAGIC, 6, \ struct ubi_set_vol_prop_req) +/* Attach a block device to an UBI volume */ +#define UBI_IOCVOLATTBLK _IO(UBI_VOL_IOC_MAGIC, 7) +/* Detach a block device from an UBI volume */ +#define UBI_IOCVOLDETBLK _IO(UBI_VOL_IOC_MAGIC, 8) /* Maximum MTD device name length supported by UBI */ #define MAX_UBI_MTD_NAME_LEN 127 -- cgit v1.2.3 From 8af871887fcba470ff9265c65cff7d14d9e0e3f9 Mon Sep 17 00:00:00 2001 From: Artem Bityutskiy Date: Wed, 5 Mar 2014 13:01:56 +0200 Subject: UBI: rename block device ioctls Rename the UBI_IOCVOLATTBLK and UBI_IOCVOLDETBLK to UBI_IOCVOLCRBLK and UBI_IOCVOLRMBLK, because we do not use terms "attach" and "detach" for the R/O block devices on top of UBI volumes. Instead, we use terms "create" and "remove". This patch also amends the related commentaries. Signed-off-by: Artem Bityutskiy Acked-by: Ezequiel Garcia --- drivers/mtd/ubi/block.c | 2 +- drivers/mtd/ubi/cdev.c | 8 ++++---- include/uapi/mtd/ubi-user.h | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) (limited to 'include') diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c index 16e67318acf3..69a74fd07978 100644 --- a/drivers/mtd/ubi/block.c +++ b/drivers/mtd/ubi/block.c @@ -32,7 +32,7 @@ * This feature is compiled in the UBI core, and adds a 'block' parameter * to allow early creation of block devices on top of UBI volumes. Runtime * block creation/removal for UBI volumes is provided through two UBI ioctls: - * UBI_IOCVOLATTBLK and UBI_IOCVOLDETBLK. + * UBI_IOCVOLCRBLK and UBI_IOCVOLRMBLK. */ #include diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index 11c847349642..f54562a5998e 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c @@ -561,8 +561,8 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd, break; } - /* Attach a block device to an UBI volume */ - case UBI_IOCVOLATTBLK: + /* Create a R/O block device on top of the UBI volume */ + case UBI_IOCVOLCRBLK: { struct ubi_volume_info vi; @@ -571,8 +571,8 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd, break; } - /* Dettach a block device from an UBI volume */ - case UBI_IOCVOLDETBLK: + /* Remove the R/O block device */ + case UBI_IOCVOLRMBLK: { struct ubi_volume_info vi; diff --git a/include/uapi/mtd/ubi-user.h b/include/uapi/mtd/ubi-user.h index b98585ad3346..9c885e26cc0f 100644 --- a/include/uapi/mtd/ubi-user.h +++ b/include/uapi/mtd/ubi-user.h @@ -138,9 +138,9 @@ * Block devices on UBI volumes * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - * To attach or detach a block device from an UBI volume the %UBI_IOCVOLATTBLK - * and %UBI_IOCVOLDETBLK ioctl commands should be used, respectively. - * These commands take no arguments. + * To create or remove a R/O block device on top of an UBI volume the + * %UBI_IOCVOLCRBLK and %UBI_IOCVOLRMBLK ioctl commands should be used, + * respectively. These commands take no arguments. */ /* @@ -198,10 +198,10 @@ /* Set an UBI volume property */ #define UBI_IOCSETVOLPROP _IOW(UBI_VOL_IOC_MAGIC, 6, \ struct ubi_set_vol_prop_req) -/* Attach a block device to an UBI volume */ -#define UBI_IOCVOLATTBLK _IO(UBI_VOL_IOC_MAGIC, 7) -/* Detach a block device from an UBI volume */ -#define UBI_IOCVOLDETBLK _IO(UBI_VOL_IOC_MAGIC, 8) +/* Create a R/O block device on top of an UBI volume */ +#define UBI_IOCVOLCRBLK _IO(UBI_VOL_IOC_MAGIC, 7) +/* Remove the R/O block device */ +#define UBI_IOCVOLRMBLK _IO(UBI_VOL_IOC_MAGIC, 8) /* Maximum MTD device name length supported by UBI */ #define MAX_UBI_MTD_NAME_LEN 127 -- cgit v1.2.3 From 463c5eedb4a13b9aa91f05498a0f2c20bd03f8c4 Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Wed, 5 Mar 2014 11:16:14 -0300 Subject: UBI: make UBI_IOCVOLCRBLK take a parameter for future usage In order to allow a future ioctl parameter, such as a creation flag, we change the UBI_IOCVOLCRBLK so it accepts a struct ubi_blkcreate_req. For the time being the structure is not in use, but fully reserved. This ABI change is still possible and harmless, because the ioctl has just been introduced and there's no userspace program which uses it. Signed-off-by: Ezequiel Garcia Signed-off-by: Artem Bityutskiy --- include/uapi/mtd/ubi-user.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/uapi/mtd/ubi-user.h b/include/uapi/mtd/ubi-user.h index 9c885e26cc0f..1927b0d78a99 100644 --- a/include/uapi/mtd/ubi-user.h +++ b/include/uapi/mtd/ubi-user.h @@ -138,9 +138,12 @@ * Block devices on UBI volumes * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - * To create or remove a R/O block device on top of an UBI volume the - * %UBI_IOCVOLCRBLK and %UBI_IOCVOLRMBLK ioctl commands should be used, - * respectively. These commands take no arguments. + * To create a R/O block device on top of an UBI volume the %UBI_IOCVOLCRBLK + * should be used. A pointer to a &struct ubi_blkcreate_req object is expected + * to be passed, which is not used and reserved for future usage. + * + * Conversely, to remove a block device the %UBI_IOCVOLRMBLK should be used, + * which takes no arguments. */ /* @@ -199,7 +202,7 @@ #define UBI_IOCSETVOLPROP _IOW(UBI_VOL_IOC_MAGIC, 6, \ struct ubi_set_vol_prop_req) /* Create a R/O block device on top of an UBI volume */ -#define UBI_IOCVOLCRBLK _IO(UBI_VOL_IOC_MAGIC, 7) +#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) @@ -431,4 +434,12 @@ struct ubi_set_vol_prop_req { __u64 value; } __packed; +/** + * struct ubi_blkcreate_req - a data structure used in block creation requests. + * @padding: reserved for future, not used, has to be zeroed + */ +struct ubi_blkcreate_req { + __s8 padding[128]; +} __packed; + #endif /* __UBI_USER_H__ */ -- cgit v1.2.3