On Thu, 27 Oct 2016 14:14:00 -0500 Zach Brown <zach.br...@ni.com> wrote:
> From: Jeff Westfahl <jeff.westf...@ni.com> > > If implemented, 'max_bad_blocks' returns the maximum number of bad > blocks to reserve for an MTD. An implementation for NAND is coming soon. > > Signed-off-by: Jeff Westfahl <jeff.westf...@ni.com> > Signed-off-by: Zach Brown <zach.br...@ni.com> > --- > drivers/mtd/mtdpart.c | 12 ++++++++++++ > include/linux/mtd/mtd.h | 1 + > 2 files changed, 13 insertions(+) > > diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c > index fccdd49..565f0dd 100644 > --- a/drivers/mtd/mtdpart.c > +++ b/drivers/mtd/mtdpart.c > @@ -349,6 +349,16 @@ static const struct mtd_ooblayout_ops part_ooblayout_ops > = { > .free = part_ooblayout_free, > }; > > +static int part_max_bad_blocks(struct mtd_info *mtd, loff_t ofs, size_t len) > +{ > + struct mtd_part *part = mtd_to_part(mtd); > + > + if ((len + ofs) > mtd->size) > + return -EINVAL; > + return part->master->_max_bad_blocks(part->master, > + ofs + part->offset, len); > +} > + > static inline void free_partition(struct mtd_part *p) > { > kfree(p->mtd.name); > @@ -481,6 +491,8 @@ static struct mtd_part *allocate_partition(struct > mtd_info *master, > if (master->_put_device) > slave->mtd._put_device = part_put_device; > > + if (master->_max_bad_blocks) > + slave->mtd._max_bad_blocks = part_max_bad_blocks; > slave->mtd._erase = part_erase; > slave->master = master; > slave->offset = part->offset; > diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h > index 13f8052..bd277eb 100644 > --- a/include/linux/mtd/mtd.h > +++ b/include/linux/mtd/mtd.h > @@ -322,6 +322,7 @@ struct mtd_info { > int (*_block_isreserved) (struct mtd_info *mtd, loff_t ofs); > int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs); > int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs); > + int (*_max_bad_blocks) (struct mtd_info *mtd, loff_t ofs, size_t len); Please provide an helper function around this hook, so that you can call the helper in patch 3 and won't have to test the ->_max_bad_blocks field directly. This helper should return -ENOTSUPP if ->_max_bad_blocks is not implemented. > int (*_suspend) (struct mtd_info *mtd); > void (*_resume) (struct mtd_info *mtd); > void (*_reboot) (struct mtd_info *mtd);