Re: [PATCH V3] block: no show partitions if partno corrupted

From: Edward Adam Davis
Date: Tue Jan 14 2025 - 10:16:00 EST


On Tue, 14 Jan 2025 08:02:15 -0700, Jens Axboe wrote:
> > diff --git a/block/genhd.c b/block/genhd.c
> > index 9130e163e191..3a9c36ad6bbd 100644
> > --- a/block/genhd.c
> > +++ b/block/genhd.c
> > @@ -890,6 +890,9 @@ static int show_partition(struct seq_file *seqf, void *v)
> >
> > rcu_read_lock();
> > xa_for_each(&sgp->part_tbl, idx, part) {
> > + int partno = bdev_partno(part);
> > +
> > + WARN_ON_ONCE(partno >= DISK_MAX_PARTS);
> > if (!bdev_nr_sectors(part))
> > continue;
> > seq_printf(seqf, "%4d %7d %10llu %pg\n",
>
> Surely you still want to continue for that condition?
No.
But like following, ok?
diff --git a/block/genhd.c b/block/genhd.c
index 9130e163e191..142b13620f0c 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -890,7 +890,10 @@ static int show_partition(struct seq_file *seqf, void *v)

rcu_read_lock();
xa_for_each(&sgp->part_tbl, idx, part) {
- if (!bdev_nr_sectors(part))
+ int partno = bdev_partno(part);
+
+ WARN_ON_ONCE(partno >= DISK_MAX_PARTS);
+ if (!bdev_nr_sectors(part) || partno >= DISK_MAX_PARTS)
continue;
seq_printf(seqf, "%4d %7d %10llu %pg\n",
MAJOR(part->bd_dev), MINOR(part->bd_dev),