On Thu, Dec 13, 2018 at 10:18:40AM +0100, Hannes Reinecke wrote: > On 12/6/18 5:48 PM, Thadeu Lima de Souza Cascardo wrote: > > Without this exposure, lsblk will fail as it tries to find out the > > device's dev_t numbers. This causes a real problem for nvme multipath > > devices, as their slaves are hidden. > > > > Exposing them fixes the problem, even though trying to open the devices > > returns an error in the case of nvme multipath. So, right now, it's the > > driver's responsibility to return a failure to open hidden devices. > > > > Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@xxxxxxxxxxxxx> > > --- > > block/genhd.c | 9 ++++----- > > 1 file changed, 4 insertions(+), 5 deletions(-) > > > > diff --git a/block/genhd.c b/block/genhd.c > > index 7674fce32fca..65a7fa664188 100644 > > --- a/block/genhd.c > > +++ b/block/genhd.c > > @@ -687,6 +687,7 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, > > disk_alloc_events(disk); > > + disk_to_dev(disk)->devt = devt; > > if (disk->flags & GENHD_FL_HIDDEN) { > > /* > > * Don't let hidden disks show up in /proc/partitions, > > @@ -698,13 +699,12 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, > > int ret; > > /* Register BDI before referencing it from bdev */ > > - disk_to_dev(disk)->devt = devt; > > ret = bdi_register_owner(disk->queue->backing_dev_info, > > disk_to_dev(disk)); > > WARN_ON(ret); > > - blk_register_region(disk_devt(disk), disk->minors, NULL, > > - exact_match, exact_lock, disk); > > } > > + blk_register_region(disk_devt(disk), disk->minors, NULL, > > + exact_match, exact_lock, disk); > > register_disk(parent, disk, groups); > > if (register_queue) > > blk_register_queue(disk); > > @@ -776,8 +776,7 @@ void del_gendisk(struct gendisk *disk) > > WARN_ON(1); > > } > > - if (!(disk->flags & GENHD_FL_HIDDEN)) > > - blk_unregister_region(disk_devt(disk), disk->minors); > > + blk_unregister_region(disk_devt(disk), disk->minors); > > kobject_put(disk->part0.holder_dir); > > kobject_put(disk->slave_dir); > > > Welll ... this is not just 'lsblk', but more importantly this will force > udev to create _block_ device nodes for the hidden devices, essentially > 'unhide' them. > > Is this what we want? > Christoph? > I thought the entire _point_ of having hidden devices is that the are ... > well ... hidden ... > I knew this would be the most controversial patch. And I had other solutions as well, but preferred this one. So, the other alternative would be just not use GENHD_FL_HIDDEN for the nvme devices, which would leave that flag without a single user in the kernel. That would still fix the two problems (initramfs-tools and lsblk), and not create any other problem I know of. That patch would still fail to open the underlying devices when there is a head/multipath associated with it. So, the only thing GENHD_FL_HIDDEN gives us is saving some resources, like bdi, for example. And we could also use it to fail open when blkdev_get* is called. Of couse, that would still imply that its name should be changed, but as we already have an attribute named after that, I find it hard to suggest such a change. Cascardo. > Cheers, > > Hannes > -- > Dr. Hannes Reinecke Teamlead Storage & Networking > hare@xxxxxxx +49 911 74053 688 > SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg > GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton > HRB 21284 (AG Nürnberg)