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.