Re: [PATCH 19/19] nvme-multipath: switch to use libmultipath

John Garry
2026-03-02T16:14:07Z

On 02/03/2026 12:57, Nilay Shroff wrote:
> On 2/25/26 9:10 PM, John Garry wrote:
>>   void nvme_mpath_clear_ctrl_paths(struct nvme_ctrl *ctrl)
>> @@ -277,30 +279,35 @@ void nvme_mpath_clear_ctrl_paths(struct
>> nvme_ctrl *ctrl)
>>       srcu_idx = srcu_read_lock(&ctrl->srcu);
>>       list_for_each_entry_srcu(ns, &ctrl->namespaces, list,
>>                    srcu_read_lock_held(&ctrl->srcu)) {
>> +        struct nvme_ns_head *head = ns->head;
>> +        struct mpath_disk *mpath_disk = head->mpath_disk;
>> +
>> +        if (!mpath_disk)
>> +            continue;
>> +
>>           nvme_mpath_clear_current_path(ns);
>> -        kblockd_schedule_work(&ns->head->requeue_work);
>> +        kblockd_schedule_work(&mpath_disk->mpath_head->requeue_work);
>>       }
>>       srcu_read_unlock(&ctrl->srcu, srcu_idx);
>>   }
>> +static void nvme_mpath_revalidate_paths_cb(struct mpath_device
>> *mpath_device,
>> +                    sector_t capacity)
>> +{
>> +    struct nvme_ns *ns = nvme_mpath_to_ns(mpath_device);
>> +
>> +    if (capacity != get_capacity(ns->disk))
>> +        clear_bit(NVME_NS_READY, &ns->flags);
>> +}
>> +
>
> I don't quite understand the intent of the above function.

This specifically is a callback for when the NVMe driver calls into
libmultipath. It could also be supplied in the function template.

If you check mainline nvme_mpath_revalidate_paths(), it iterates the
paths, and for each part checks capacity and unsets NVME_NS_READY if set.

Now libmultipath manages the paths, so we provide an API for the driver
to call into the iterate the paths to support
nvme_mpath_revalidate_paths(). Since we are doing something
nvme-specific in nvme_mpath_revalidate_paths(), we need the driver to
provide a CB to do this driver-specific functionality.

> Here I see that we compare mpath_disk capacity with per-path
> disk. Do we really have sectors allocated for mpath_disk?

mpath_disk manages the multipath gendisk - it is no longer in
nvme_ns_head.disk

>
> Overall, IMO abstracting out common multipath function into
> a separate library is a good move. But then I just want to
> understand layering here with libmultipath. Does it sit above
> the driver or below?

I would say neither - or it sits above the driver, if anything. It is
just a library for managing multipathed devices.

> I see in some places we have back and forth
> callbacks from driver to libmultipath and then back to the
> driver, for instance:
> nvme_mpath_add_disk          => driver
>  -> mpath_device_set_live    => libmultipath
>   -> mpath_head_add_cdev     => libmultipath
>     -> nvme_mpath_add_cdev   => driver
>
> Does this intentional? Or am I missing overall picture...

Something like nvme_mpath_add_cdev is a callback supplied for
libmultipath to do some driver-specific action. About
nvme_mpath_add_cdev(), I think that this can be pushed into
libmultipath. The only NVMe specific thing it does is the device naming
- so a method for the nvme driver to supply that is required.

Thanks for checking all this.