ubi: provide a way to skip CRC checks
Some users of static UBI volumes implement their own integrity check, thus making the volume CRC check done at open time useless. For instance, this is the case when one use the ubiblock + dm-verity + squashfs combination, where dm-verity already checks integrity of the block device but this time at the block granularity instead of verifying the whole volume. Skipping this test drastically improves the boot-time. Suggested-by: Boris Brezillon <boris.brezillon@bootlin.com> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com> Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com> Reviewed-by: Richard Weinberger <richard@nod.at> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
a3d218280c
commit
6265251775
|
@ -202,7 +202,7 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
|
||||||
desc->mode = mode;
|
desc->mode = mode;
|
||||||
|
|
||||||
mutex_lock(&ubi->ckvol_mutex);
|
mutex_lock(&ubi->ckvol_mutex);
|
||||||
if (!vol->checked) {
|
if (!vol->checked && !vol->skip_check) {
|
||||||
/* This is the first open - check the volume */
|
/* This is the first open - check the volume */
|
||||||
err = ubi_check_volume(ubi, vol_id);
|
err = ubi_check_volume(ubi, vol_id);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
|
|
|
@ -45,6 +45,11 @@ enum {
|
||||||
* Volume flags used in the volume table record.
|
* Volume flags used in the volume table record.
|
||||||
*
|
*
|
||||||
* @UBI_VTBL_AUTORESIZE_FLG: auto-resize this volume
|
* @UBI_VTBL_AUTORESIZE_FLG: auto-resize this volume
|
||||||
|
* @UBI_VTBL_SKIP_CRC_CHECK_FLG: skip the CRC check done on a static volume at
|
||||||
|
* open time. Should only be set on volumes that
|
||||||
|
* are used by upper layers doing this kind of
|
||||||
|
* check. Main use-case for this flag is
|
||||||
|
* boot-time reduction
|
||||||
*
|
*
|
||||||
* %UBI_VTBL_AUTORESIZE_FLG flag can be set only for one volume in the volume
|
* %UBI_VTBL_AUTORESIZE_FLG flag can be set only for one volume in the volume
|
||||||
* table. UBI automatically re-sizes the volume which has this flag and makes
|
* table. UBI automatically re-sizes the volume which has this flag and makes
|
||||||
|
@ -76,6 +81,7 @@ enum {
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
UBI_VTBL_AUTORESIZE_FLG = 0x01,
|
UBI_VTBL_AUTORESIZE_FLG = 0x01,
|
||||||
|
UBI_VTBL_SKIP_CRC_CHECK_FLG = 0x02,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -327,6 +327,9 @@ struct ubi_eba_leb_desc {
|
||||||
* atomic LEB change
|
* atomic LEB change
|
||||||
*
|
*
|
||||||
* @eba_tbl: EBA table of this volume (LEB->PEB mapping)
|
* @eba_tbl: EBA table of this volume (LEB->PEB mapping)
|
||||||
|
* @skip_check: %1 if CRC check of this static volume should be skipped.
|
||||||
|
* Directly reflects the presence of the
|
||||||
|
* %UBI_VTBL_SKIP_CRC_CHECK_FLG flag in the vtbl entry
|
||||||
* @checked: %1 if this static volume was checked
|
* @checked: %1 if this static volume was checked
|
||||||
* @corrupted: %1 if the volume is corrupted (static volumes only)
|
* @corrupted: %1 if the volume is corrupted (static volumes only)
|
||||||
* @upd_marker: %1 if the update marker is set for this volume
|
* @upd_marker: %1 if the update marker is set for this volume
|
||||||
|
@ -374,6 +377,7 @@ struct ubi_volume {
|
||||||
void *upd_buf;
|
void *upd_buf;
|
||||||
|
|
||||||
struct ubi_eba_table *eba_tbl;
|
struct ubi_eba_table *eba_tbl;
|
||||||
|
unsigned int skip_check:1;
|
||||||
unsigned int checked:1;
|
unsigned int checked:1;
|
||||||
unsigned int corrupted:1;
|
unsigned int corrupted:1;
|
||||||
unsigned int upd_marker:1;
|
unsigned int upd_marker:1;
|
||||||
|
|
|
@ -299,6 +299,10 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
|
||||||
vtbl_rec.vol_type = UBI_VID_DYNAMIC;
|
vtbl_rec.vol_type = UBI_VID_DYNAMIC;
|
||||||
else
|
else
|
||||||
vtbl_rec.vol_type = UBI_VID_STATIC;
|
vtbl_rec.vol_type = UBI_VID_STATIC;
|
||||||
|
|
||||||
|
if (vol->skip_check)
|
||||||
|
vtbl_rec.flags |= UBI_VTBL_SKIP_CRC_CHECK_FLG;
|
||||||
|
|
||||||
memcpy(vtbl_rec.name, vol->name, vol->name_len);
|
memcpy(vtbl_rec.name, vol->name, vol->name_len);
|
||||||
|
|
||||||
err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec);
|
err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec);
|
||||||
|
@ -733,6 +737,11 @@ static int self_check_volume(struct ubi_device *ubi, int vol_id)
|
||||||
ubi_err(ubi, "bad used_bytes");
|
ubi_err(ubi, "bad used_bytes");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vol->skip_check) {
|
||||||
|
ubi_err(ubi, "bad skip_check");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (vol->used_ebs < 0 || vol->used_ebs > vol->reserved_pebs) {
|
if (vol->used_ebs < 0 || vol->used_ebs > vol->reserved_pebs) {
|
||||||
ubi_err(ubi, "bad used_ebs");
|
ubi_err(ubi, "bad used_ebs");
|
||||||
|
|
|
@ -560,6 +560,9 @@ static int init_volumes(struct ubi_device *ubi,
|
||||||
vol->name[vol->name_len] = '\0';
|
vol->name[vol->name_len] = '\0';
|
||||||
vol->vol_id = i;
|
vol->vol_id = i;
|
||||||
|
|
||||||
|
if (vtbl[i].flags & UBI_VTBL_SKIP_CRC_CHECK_FLG)
|
||||||
|
vol->skip_check = 1;
|
||||||
|
|
||||||
if (vtbl[i].flags & UBI_VTBL_AUTORESIZE_FLG) {
|
if (vtbl[i].flags & UBI_VTBL_AUTORESIZE_FLG) {
|
||||||
/* Auto re-size flag may be set only for one volume */
|
/* Auto re-size flag may be set only for one volume */
|
||||||
if (ubi->autoresize_vol_id != -1) {
|
if (ubi->autoresize_vol_id != -1) {
|
||||||
|
|
Loading…
Reference in New Issue