On Wed, 2017-08-30 at 19:47 +0300, Sagi Grimberg wrote: > > > If we get to choose, my preference would be to restore the old behavior > > > because currently existing nvme transports keep their internal ctrl > > > representation in the tagset->driver_data as they implement > > > init/exit_request. Bouncing in nvme core would require to change that > > > and always keep struct nvme_ctrl as the tagset->driver_data and convert > > > it on every handler... > > > > > > Everything is doable but it seems like an unneeded hassle to me... > > > > Sorry but I'm not convinced that it would be necessary to change what > > tagset->driver_data points at. How about moving blk_mq_reinit_tagset() from > > the block layer core to the NVMe core, to rename it and to pass a pointer > > to the nvme_ctrl data structure to that function instead of only block layer > > information? > > That would mean that I need to open-code the tagset iteration in nvme > which does not feel like something a driver should do. How about renaming blk_mq_reinit_tagset() into blk_mq_tagset_iter() and to make the argument list of blk_mq_tagset_iter() more similar to that of blk_mq_queue_tag_busy_iter() such that callers of blk_mq_tagset_iter() can pass a pointer to any structure through the @priv argument? That would make this function more general and maybe also more useful to other block drivers. Bart.