[PATCH 19/24] scsi: sd: add multipath PR support
From: John Garry
Date: Wed Feb 25 2026 - 10:49:20 EST
Add sd_mpath_pr_ops, which callbacks which call into disk variant of sd PR
ops.
Signed-off-by: John Garry <john.g.garry@xxxxxxxxxx>
---
drivers/scsi/sd.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index b807452a4bdc3..f94a3b696dcab 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -4081,6 +4081,61 @@ static int sd_mpath_ioctl(struct scsi_device *sdp, blk_mode_t mode,
return sd_ioctl(bdev, mode, cmd, arg);
}
+static int sd_mpath_pr_register(struct scsi_device *sdp, u64 old_key,
+ u64 new_key, u32 flags)
+{
+ return sd_pr_register_disk(dev_get_drvdata(&sdp->sdev_gendev), old_key,
+ new_key, flags);
+}
+
+static int sd_mpath_pr_reserve(struct scsi_device *sdp, u64 key,
+ enum pr_type type, u32 flags)
+{
+ return sd_pr_reserve_disk(dev_get_drvdata(&sdp->sdev_gendev), key, type,
+ flags);
+}
+
+static int sd_mpath_pr_release(struct scsi_device *sdp, u64 key,
+ enum pr_type type)
+{
+ return sd_pr_release_disk(dev_get_drvdata(&sdp->sdev_gendev), key, type);
+}
+
+static int sd_mpath_pr_preempt(struct scsi_device *sdp, u64 old,
+ u64 new, enum pr_type type, bool abort)
+{
+ return sd_pr_preempt_disk(dev_get_drvdata(&sdp->sdev_gendev), old, new,
+ type, abort);
+}
+
+static int sd_mpath_pr_clear(struct scsi_device *sdp, u64 key)
+{
+ return sd_pr_clear_disk(dev_get_drvdata(&sdp->sdev_gendev), key);
+}
+
+static int sd_mpath_pr_read_keys(struct scsi_device *sdp,
+ struct pr_keys *keys_info)
+{
+ return sd_pr_read_keys_disk(dev_get_drvdata(&sdp->sdev_gendev),
+ keys_info);
+}
+
+static int sd_mpath_pr_read_reservation(struct scsi_device *sdp,
+ struct pr_held_reservation *resv)
+{
+ return sd_pr_read_reservation_disk(dev_get_drvdata(&sdp->sdev_gendev),
+ resv);
+}
+
+static const struct scsi_mpath_pr_ops sd_mpath_pr_ops = {
+ .pr_register = sd_mpath_pr_register,
+ .pr_reserve = sd_mpath_pr_reserve,
+ .pr_release = sd_mpath_pr_release,
+ .pr_preempt = sd_mpath_pr_preempt,
+ .pr_clear = sd_mpath_pr_clear,
+ .pr_read_keys = sd_mpath_pr_read_keys,
+ .pr_read_reservation = sd_mpath_pr_read_reservation,
+};
#else /* CONFIG_SCSI_MULTIPATH */
#endif
/**
@@ -4536,6 +4591,7 @@ static struct scsi_driver sd_template = {
.mpath_start_cmd = sd_mpath_start_command,
.mpath_end_cmd = sd_mpath_end_command,
.mpath_ioctl = sd_mpath_ioctl,
+ .mpath_pr_ops = &sd_mpath_pr_ops,
#endif
.done = sd_done,
.eh_action = sd_eh_action,
--
2.43.5