From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Date: Mon, 19 Nov 2018 13:40:25 +0100 Subject: [U-Boot] [PATCH 1/9] mtd: Add a function to report when the MTD dev list has been updated In-Reply-To: <20181119115121.7699-1-boris.brezillon@bootlin.com> References: <20181119115121.7699-1-boris.brezillon@bootlin.com> Message-ID: <20181119134025.6810af67@bbrezillon> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Crap! I forgot to pass -v2 to git format patch. On Mon, 19 Nov 2018 12:51:13 +0100 Boris Brezillon wrote: > We need to parse mtdparts/mtids again everytime a device has been > added/removed from the MTD list, but there's currently no way to know > when such an update has been done. > > Add an ->updated field to the idr struct that we set to true every time > a device is added/removed and expose a function returning the value > of this field and resetting it to false. > > Signed-off-by: Boris Brezillon > --- > Changes in v2: > - None > --- > drivers/mtd/mtdcore.c | 16 +++++++++++++++- > include/linux/mtd/mtd.h | 1 + > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c > index fb6c779abbfe..7a15ded8c883 100644 > --- a/drivers/mtd/mtdcore.c > +++ b/drivers/mtd/mtdcore.c > @@ -87,14 +87,17 @@ struct idr_layer { > > struct idr { > struct idr_layer id[MAX_IDR_ID]; > + bool updated; > }; > > #define DEFINE_IDR(name) struct idr name; > > void idr_remove(struct idr *idp, int id) > { > - if (idp->id[id].used) > + if (idp->id[id].used) { > idp->id[id].used = 0; > + idp->updated = true; > + } > > return; > } > @@ -134,6 +137,7 @@ int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask) > if (idl->used == 0) { > idl->used = 1; > idl->ptr = ptr; > + idp->updated = true; > return i; > } > i++; > @@ -155,6 +159,16 @@ struct mtd_info *__mtd_next_device(int i) > } > EXPORT_SYMBOL_GPL(__mtd_next_device); > > +bool mtd_dev_list_updated(void) > +{ > + if (mtd_idr.updated) { > + mtd_idr.updated = false; > + return true; > + } > + > + return false; > +} > + > #ifndef __UBOOT__ > static LIST_HEAD(mtd_notifiers); > > diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h > index 68e591532492..d20ebd820289 100644 > --- a/include/linux/mtd/mtd.h > +++ b/include/linux/mtd/mtd.h > @@ -581,6 +581,7 @@ int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off, > void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset, > const uint64_t length, uint64_t *len_incl_bad, > int *truncated); > +bool mtd_dev_list_updated(void); > > /* drivers/mtd/mtd_uboot.c */ > int mtd_search_alternate_name(const char *mtdname, char *altname,