Re: [PATCH RFC] nvme: fix NS head cdev lifetime

John Garry <[email protected]>
Newsgroups org.infradead.lists.linux-nvme
Organization Oracle Corporation
Message-ID <[email protected]>
On 08/07/2026 17:18, Christoph Hellwig wrote:
> On Wed, Jul 08, 2026 at 10:57:02AM +0100, John Garry wrote:
>> If we put the nvne_ns_head (vs nvme_ns) in the driver data, then I can't
>> see a check to know is the driver data points to a nvne_ns_head or nvme_ns.
>> Unless we keep NULL for one, but that is not so nice.
> I think NULL just for one is fine, and I'm pretty sure we already do
> something like this in the nvme code (or at least used to in the
> past).

I mentioned in a follow up mail that we have this same issue for the NS 
cdev, so we need to do similar reference taking there.

So using a NULL check would look like this:

static void nvme_cdev_rel(struct device *dev)
{
	ida_free(&nvme_ns_chr_minor_ida, MINOR(dev->devt));
	if (dev->driver_data)
		nvme_put_ns_head(container_of(dev, struct nvme_ns_head,
			cdev_device));
	else
		nvme_put_ns(container_of(dev, struct nvme_ns, cdev_device));
}


Another idea is:

static void nvme_cdev_rel(struct device *dev)
{
	ida_free(&nvme_ns_chr_minor_ida, MINOR(dev->devt));
	if (dev->parent->class == &nvme_class)
		nvme_put_ns(container_of(dev, struct nvme_ns, cdev_device));
	else
		nvme_put_ns_head(container_of(dev, struct nvme_ns_head,
cdev_device));
}

any preference?

A nicer check would be cdev->fops == nvme_ns_chr_fops, but the cdev 
pointer cannot be looked up from the dev release handler and it's too 
late to even ref the cdev at this point.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.