Commit c355aa46 authored by Quentin Schulz's avatar Quentin Schulz Committed by Richard Weinberger

ubi: expose the volume CRC check skip flag

Now that we have the logic for skipping CRC check for static UBI volumes
in the core, let's expose it to users.

This makes use of a padding byte in the volume description data
structure as a flag. This flag only tell for now whether we should skip
the CRC check of a volume.

This checks the UBI volume for which we are trying to skip the CRC check
is static.

Let's also make sure that the flags passed to verify_mkvol_req are
valid.

We voluntarily do not take into account the skip_check flag in
vol_cdev_write() as we want to make sure what we wrote was correctly
written.
Suggested-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: default avatarQuentin Schulz <quentin.schulz@bootlin.com>
Reviewed-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 62652517
...@@ -367,6 +367,10 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf, ...@@ -367,6 +367,10 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
return count; return count;
} }
/*
* We voluntarily do not take into account the skip_check flag
* as we want to make sure what we wrote was correctly written.
*/
err = ubi_check_volume(ubi, vol->vol_id); err = ubi_check_volume(ubi, vol->vol_id);
if (err < 0) if (err < 0)
return err; return err;
...@@ -622,6 +626,13 @@ static int verify_mkvol_req(const struct ubi_device *ubi, ...@@ -622,6 +626,13 @@ static int verify_mkvol_req(const struct ubi_device *ubi,
req->vol_type != UBI_STATIC_VOLUME) req->vol_type != UBI_STATIC_VOLUME)
goto bad; goto bad;
if (req->flags & ~UBI_VOL_VALID_FLGS)
goto bad;
if (req->flags & UBI_VOL_SKIP_CRC_CHECK_FLG &&
req->vol_type != UBI_STATIC_VOLUME)
goto bad;
if (req->alignment > ubi->leb_size) if (req->alignment > ubi->leb_size)
goto bad; goto bad;
......
...@@ -174,6 +174,9 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) ...@@ -174,6 +174,9 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
vol->dev.class = &ubi_class; vol->dev.class = &ubi_class;
vol->dev.groups = volume_dev_groups; vol->dev.groups = volume_dev_groups;
if (req->flags & UBI_VOL_SKIP_CRC_CHECK_FLG)
vol->skip_check = 1;
spin_lock(&ubi->volumes_lock); spin_lock(&ubi->volumes_lock);
if (vol_id == UBI_VOL_NUM_AUTO) { if (vol_id == UBI_VOL_NUM_AUTO) {
/* Find unused volume ID */ /* Find unused volume ID */
......
...@@ -285,6 +285,20 @@ struct ubi_attach_req { ...@@ -285,6 +285,20 @@ struct ubi_attach_req {
__s8 padding[10]; __s8 padding[10];
}; };
/*
* UBI volume flags.
*
* @UBI_VOL_SKIP_CRC_CHECK_FLG: skip the CRC check done on a static volume at
* open time. Only valid for static volumes and
* should only be used if the volume user has a
* way to verify data integrity
*/
enum {
UBI_VOL_SKIP_CRC_CHECK_FLG = 0x1,
};
#define UBI_VOL_VALID_FLGS (UBI_VOL_SKIP_CRC_CHECK_FLG)
/** /**
* struct ubi_mkvol_req - volume description data structure used in * struct ubi_mkvol_req - volume description data structure used in
* volume creation requests. * volume creation requests.
...@@ -292,7 +306,7 @@ struct ubi_attach_req { ...@@ -292,7 +306,7 @@ struct ubi_attach_req {
* @alignment: volume alignment * @alignment: volume alignment
* @bytes: volume size in bytes * @bytes: volume size in bytes
* @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME)
* @padding1: reserved for future, not used, has to be zeroed * @flags: volume flags (%UBI_VOL_SKIP_CRC_CHECK_FLG)
* @name_len: volume name length * @name_len: volume name length
* @padding2: reserved for future, not used, has to be zeroed * @padding2: reserved for future, not used, has to be zeroed
* @name: volume name * @name: volume name
...@@ -321,7 +335,7 @@ struct ubi_mkvol_req { ...@@ -321,7 +335,7 @@ struct ubi_mkvol_req {
__s32 alignment; __s32 alignment;
__s64 bytes; __s64 bytes;
__s8 vol_type; __s8 vol_type;
__s8 padding1; __u8 flags;
__s16 name_len; __s16 name_len;
__s8 padding2[4]; __s8 padding2[4];
char name[UBI_MAX_VOLUME_NAME + 1]; char name[UBI_MAX_VOLUME_NAME + 1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment