[PATCH] mtd: ubi: Use UBI_METAONLY constraint for renames
Andrew Murray
amurray at embedded-bits.co.uk
Mon Oct 20 04:32:45 PDT 2014
On 20 October 2014 12:06, Richard Weinberger <richard at nod.at> wrote:
> Am 19.10.2014 um 22:26 schrieb Andrew Murray:
>> Renaming a volume does not alter nor read volume data - thus the existing
>> UBI_READWRITE constraint can be weakened. This patch provides a new
>> UBI_METAONLY constraint and updates the UBI rename logic to use it.
>>
>> This change permits the rename of a mounted volume which enables support
>> for additional methods of firmware upgrade - see discussion at
>> https://patchwork.ozlabs.org/patch/398784
>>
>> This patch differs from that of the original discussion through the addition
>> on an additional 'break' statement.
>
> Thanks for pointing out. I fat-fingered that.
>
>> Cc: Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
>> Tested-by: Andrew Murray <amurray at embedded-bits.co.uk>
>> Signed-off-by: Richard Weinberger <richard at nod.at>
>> Signed-off-by: Andrew Murray <amurray at embedded-bits.co.uk>
>
> This is not a valid SoB chain. You are not the author of this patch
> nor went it thought me. Please don't resend patches as your work.
>
Apologies that wasn't my intention - I got this wrong. I attempted to
clearly attribute the author through the patch description and
patchwork history and through the signed-off (I'll ask next time). I
added my sign-off due to my (very trivial) addition.
> While the patch works it needs some more thoughts.
> So far I had no time to review all code paths.
> Also the naming might need an update we have to differentiate between
> touching volume data and the volume metadata.
> i.e. exclusive access currently touches both. Maybe we need to interfere
> with UBI_METAONLY too.
Yes I can see this now as well.
Thanks,
Andrew Murray
>
> Thanks,
> //richard
>
>> ---
>> drivers/mtd/ubi/cdev.c | 2 +-
>> drivers/mtd/ubi/kapi.c | 12 +++++++++++-
>> drivers/mtd/ubi/ubi.h | 5 ++++-
>> include/linux/mtd/ubi.h | 3 ++-
>> 4 files changed, 18 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
>> index 7646220..4c4c455 100644
>> --- a/drivers/mtd/ubi/cdev.c
>> +++ b/drivers/mtd/ubi/cdev.c
>> @@ -731,7 +731,7 @@ static int rename_volumes(struct ubi_device *ubi,
>> goto out_free;
>> }
>>
>> - re->desc = ubi_open_volume(ubi->ubi_num, vol_id, UBI_READWRITE);
>> + re->desc = ubi_open_volume(ubi->ubi_num, vol_id, UBI_METAONLY);
>> if (IS_ERR(re->desc)) {
>> err = PTR_ERR(re->desc);
>> ubi_err("cannot open volume %d, error %d", vol_id, err);
>> diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c
>> index 3aac1ac..b470619 100644
>> --- a/drivers/mtd/ubi/kapi.c
>> +++ b/drivers/mtd/ubi/kapi.c
>> @@ -137,7 +137,7 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
>> return ERR_PTR(-EINVAL);
>>
>> if (mode != UBI_READONLY && mode != UBI_READWRITE &&
>> - mode != UBI_EXCLUSIVE)
>> + mode != UBI_EXCLUSIVE && mode != UBI_METAONLY)
>> return ERR_PTR(-EINVAL);
>>
>> /*
>> @@ -186,6 +186,12 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
>> goto out_unlock;
>> vol->exclusive = 1;
>> break;
>> +
>> + case UBI_METAONLY:
>> + if (vol->metaonly)
>> + goto out_unlock;
>> + vol->metaonly = 1;
>> + break;
>> }
>> get_device(&vol->dev);
>> vol->ref_count += 1;
>> @@ -343,6 +349,10 @@ void ubi_close_volume(struct ubi_volume_desc *desc)
>> break;
>> case UBI_EXCLUSIVE:
>> vol->exclusive = 0;
>> + break;
>> + case UBI_METAONLY:
>> + vol->metaonly = 0;
>> + break;
>> }
>> vol->ref_count -= 1;
>> spin_unlock(&ubi->volumes_lock);
>> diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
>> index 7bf4163..629973f 100644
>> --- a/drivers/mtd/ubi/ubi.h
>> +++ b/drivers/mtd/ubi/ubi.h
>> @@ -260,6 +260,7 @@ struct ubi_fm_pool {
>> * @readers: number of users holding this volume in read-only mode
>> * @writers: number of users holding this volume in read-write mode
>> * @exclusive: whether somebody holds this volume in exclusive mode
>> + * @metaonly: whether somebody is altering only meta data of this volume
>> *
>> * @reserved_pebs: how many physical eraseblocks are reserved for this volume
>> * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME)
>> @@ -308,6 +309,7 @@ struct ubi_volume {
>> int readers;
>> int writers;
>> int exclusive;
>> + int metaonly;
>>
>> int reserved_pebs;
>> int vol_type;
>> @@ -389,7 +391,8 @@ struct ubi_debug_info {
>> * @volumes_lock: protects @volumes, @rsvd_pebs, @avail_pebs, beb_rsvd_pebs,
>> * @beb_rsvd_level, @bad_peb_count, @good_peb_count, @vol_count,
>> * @vol->readers, @vol->writers, @vol->exclusive,
>> - * @vol->ref_count, @vol->mapping and @vol->eba_tbl.
>> + * @vol->metaonly, @vol->ref_count, @vol->mapping and
>> + * @vol->eba_tbl.
>> * @ref_count: count of references on the UBI device
>> * @image_seq: image sequence number recorded on EC headers
>> *
>> diff --git a/include/linux/mtd/ubi.h b/include/linux/mtd/ubi.h
>> index c3918a0..1ace519 100644
>> --- a/include/linux/mtd/ubi.h
>> +++ b/include/linux/mtd/ubi.h
>> @@ -38,7 +38,8 @@
>> enum {
>> UBI_READONLY = 1,
>> UBI_READWRITE,
>> - UBI_EXCLUSIVE
>> + UBI_EXCLUSIVE,
>> + UBI_METAONLY
>> };
>>
>> /**
>>
--
Andrew Murray, Director
Embedded Bits Limited
www.embedded-bits.co.uk
Embedded Bits Limited is a company registered in England and Wales
with company number 08178608 and VAT number 140658911. Registered
office: Embedded Bits Limited c/o InTouch Accounting Ltd. Bristol and
West House Post Office Road Bournemouth Dorset BH1 1BL
More information about the linux-mtd
mailing list