mirror of https://gitee.com/openkylin/linux.git
UBI: set correct gluebi device size
In case of static volumes, make emulated MTD device size to be equivalent to data size, rather then volume size. Reported-by: John Smith <john@arrows.demon.co.uk> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
parent
4ab60a0d7c
commit
941dfb07ed
|
@ -397,6 +397,7 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
|
|||
vol->corrupted = 1;
|
||||
}
|
||||
vol->checked = 1;
|
||||
ubi_gluebi_updated(vol);
|
||||
revoke_exclusive(desc, UBI_READWRITE);
|
||||
}
|
||||
|
||||
|
|
|
@ -282,7 +282,6 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol)
|
|||
mtd->flags = MTD_WRITEABLE;
|
||||
mtd->writesize = ubi->min_io_size;
|
||||
mtd->owner = THIS_MODULE;
|
||||
mtd->size = vol->usable_leb_size * vol->reserved_pebs;
|
||||
mtd->erasesize = vol->usable_leb_size;
|
||||
mtd->read = gluebi_read;
|
||||
mtd->write = gluebi_write;
|
||||
|
@ -290,6 +289,15 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol)
|
|||
mtd->get_device = gluebi_get_device;
|
||||
mtd->put_device = gluebi_put_device;
|
||||
|
||||
/*
|
||||
* In case of dynamic volume, MTD device size is just volume size. In
|
||||
* case of a static volume the size is equivalent to the amount of data
|
||||
* bytes, which is zero at this moment and will be changed after volume
|
||||
* update.
|
||||
*/
|
||||
if (vol->vol_type == UBI_DYNAMIC_VOLUME)
|
||||
mtd->size = vol->usable_leb_size * vol->reserved_pebs;
|
||||
|
||||
if (add_mtd_device(mtd)) {
|
||||
ubi_err("cannot not add MTD device\n");
|
||||
kfree(mtd->name);
|
||||
|
@ -321,3 +329,20 @@ int ubi_destroy_gluebi(struct ubi_volume *vol)
|
|||
kfree(mtd->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ubi_gluebi_updated - UBI volume was updated notifier.
|
||||
* @vol: volume description object
|
||||
*
|
||||
* This function is called every time an UBI volume is updated. This function
|
||||
* does nothing if volume @vol is dynamic, and changes MTD device size if the
|
||||
* volume is static. This is needed because static volumes cannot be read past
|
||||
* data they contain.
|
||||
*/
|
||||
void ubi_gluebi_updated(struct ubi_volume *vol)
|
||||
{
|
||||
struct mtd_info *mtd = &vol->gluebi_mtd;
|
||||
|
||||
if (vol->vol_type == UBI_STATIC_VOLUME)
|
||||
mtd->size = vol->used_bytes;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ static int paranoid_check_si(const struct ubi_device *ubi,
|
|||
static struct ubi_ec_hdr *ech;
|
||||
static struct ubi_vid_hdr *vidh;
|
||||
|
||||
/*
|
||||
/**
|
||||
* add_to_list - add physical eraseblock to a list.
|
||||
* @si: scanning information
|
||||
* @pnum: physical eraseblock number to add
|
||||
|
|
|
@ -374,9 +374,11 @@ void ubi_calculate_reserved(struct ubi_device *ubi);
|
|||
#ifdef CONFIG_MTD_UBI_GLUEBI
|
||||
int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol);
|
||||
int ubi_destroy_gluebi(struct ubi_volume *vol);
|
||||
void ubi_gluebi_updated(struct ubi_volume *vol);
|
||||
#else
|
||||
#define ubi_create_gluebi(ubi, vol) 0
|
||||
#define ubi_destroy_gluebi(vol) 0
|
||||
#define ubi_gluebi_updated(vol)
|
||||
#endif
|
||||
|
||||
/* eba.c */
|
||||
|
|
Loading…
Reference in New Issue