Commit 941dfb07 authored by Artem Bityutskiy's avatar Artem Bityutskiy

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: default avatarJohn Smith <john@arrows.demon.co.uk>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
parent 4ab60a0d
...@@ -397,6 +397,7 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf, ...@@ -397,6 +397,7 @@ static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
vol->corrupted = 1; vol->corrupted = 1;
} }
vol->checked = 1; vol->checked = 1;
ubi_gluebi_updated(vol);
revoke_exclusive(desc, UBI_READWRITE); revoke_exclusive(desc, UBI_READWRITE);
} }
......
...@@ -282,7 +282,6 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol) ...@@ -282,7 +282,6 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol)
mtd->flags = MTD_WRITEABLE; mtd->flags = MTD_WRITEABLE;
mtd->writesize = ubi->min_io_size; mtd->writesize = ubi->min_io_size;
mtd->owner = THIS_MODULE; mtd->owner = THIS_MODULE;
mtd->size = vol->usable_leb_size * vol->reserved_pebs;
mtd->erasesize = vol->usable_leb_size; mtd->erasesize = vol->usable_leb_size;
mtd->read = gluebi_read; mtd->read = gluebi_read;
mtd->write = gluebi_write; mtd->write = gluebi_write;
...@@ -290,6 +289,15 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol) ...@@ -290,6 +289,15 @@ int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol)
mtd->get_device = gluebi_get_device; mtd->get_device = gluebi_get_device;
mtd->put_device = gluebi_put_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)) { if (add_mtd_device(mtd)) {
ubi_err("cannot not add MTD device\n"); ubi_err("cannot not add MTD device\n");
kfree(mtd->name); kfree(mtd->name);
...@@ -321,3 +329,20 @@ int ubi_destroy_gluebi(struct ubi_volume *vol) ...@@ -321,3 +329,20 @@ int ubi_destroy_gluebi(struct ubi_volume *vol)
kfree(mtd->name); kfree(mtd->name);
return 0; 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, ...@@ -55,7 +55,7 @@ static int paranoid_check_si(const struct ubi_device *ubi,
static struct ubi_ec_hdr *ech; static struct ubi_ec_hdr *ech;
static struct ubi_vid_hdr *vidh; static struct ubi_vid_hdr *vidh;
/* /**
* add_to_list - add physical eraseblock to a list. * add_to_list - add physical eraseblock to a list.
* @si: scanning information * @si: scanning information
* @pnum: physical eraseblock number to add * @pnum: physical eraseblock number to add
......
...@@ -374,9 +374,11 @@ void ubi_calculate_reserved(struct ubi_device *ubi); ...@@ -374,9 +374,11 @@ void ubi_calculate_reserved(struct ubi_device *ubi);
#ifdef CONFIG_MTD_UBI_GLUEBI #ifdef CONFIG_MTD_UBI_GLUEBI
int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol); int ubi_create_gluebi(struct ubi_device *ubi, struct ubi_volume *vol);
int ubi_destroy_gluebi(struct ubi_volume *vol); int ubi_destroy_gluebi(struct ubi_volume *vol);
void ubi_gluebi_updated(struct ubi_volume *vol);
#else #else
#define ubi_create_gluebi(ubi, vol) 0 #define ubi_create_gluebi(ubi, vol) 0
#define ubi_destroy_gluebi(vol) 0 #define ubi_destroy_gluebi(vol) 0
#define ubi_gluebi_updated(vol)
#endif #endif
/* eba.c */ /* eba.c */
......
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