[PATCH 15/20] block: merge struct block_device and struct hd_struct
Christoph Hellwig
hch at lst.de
Fri Nov 20 04:15:46 EST 2020
On Thu, Nov 19, 2020 at 03:39:21PM +0100, Jan Kara wrote:
> This patch is kind of difficult to review due to the size of mostly
> mechanical changes mixed with not completely mechanical changes. Can we
> perhaps split out the mechanical bits? E.g. the rq->part => rq->bdev
> renaming is mechanical and notable part of the patch. Similarly the
> part->foo => part->bd_foo bits...
We'd end with really weird patches that way. Never mind that I'm not
even sure how we could mechnically do the renaming.
>
> Also I'm kind of wondering: AFAIU the new lifetime rules, gendisk holds
> bdev reference and bdev is created on gendisk allocation so bdev lifetime is
> strictly larger than gendisk lifetime. But what now keeps bdev->bd_disk
> reference safe in presence device hot unplug? In most cases we are still
> protected by gendisk reference taken in __blkdev_get() but how about
> disk->lookup_sem and disk->flags dereferences before we actually grab the
> reference?
Good question. I'll need to think about this a bit more.
> Also I find it rather non-obvious (although elegant ;) that bdev->bd_device
> rules the lifetime of gendisk. Can you perhaps explain this in the
> changelog and probably also add somewhere to source a documentation about
> the new lifetime rules?
Yes.
> > -struct hd_struct *__disk_get_part(struct gendisk *disk, int partno);
> > +static inline struct block_device *__bdget_disk(struct gendisk *disk,
> > + int partno)
> > +{
> > + struct disk_part_tbl *ptbl = rcu_dereference(disk->part_tbl);
> > +
> > + if (unlikely(partno < 0 || partno >= ptbl->len))
> > + return NULL;
> > + return rcu_dereference(ptbl->part[partno]);
> > +}
>
> I understand this is lower-level counterpart of bdget_disk() but it is
> confusing to me that this has 'bdget' in the name and returns no bdev
> reference. Can we call it like __bdev_from_disk() or something like that?
Sure.
More information about the linux-mtd
mailing list