Re: [PATCH v3 03/19] scsi: Move sd_pr_type to header to share

Chaitanya Kulkarni
2022-11-01T05:43:49Z

On 10/26/22 16:19, Mike Christie wrote:
> LIO is going to want to do the same block to/from SCSI pr types as sd.c
> so this moves the sd_pr_type helper to a new file. The next patch will
> then also add a helper to go from the SCSI value to the block one for use
> with PERSISTENT_RESERVE_IN commands.
>
> Signed-off-by: Mike Christie <michael.christie@oracle.com>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> ---
> drivers/scsi/sd.c | 31 +++++++------------------------
> include/scsi/scsi_block_pr.h | 36 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 43 insertions(+), 24 deletions(-)
> create mode 100644 include/scsi/scsi_block_pr.h
>
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index 4dc5c932fbd3..ad9374b07585 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -67,6 +67,7 @@
> #include <scsi/scsi_host.h>
> #include <scsi/scsi_ioctl.h>
> #include <scsi/scsicam.h>
> +#include <scsi/scsi_block_pr.h>
>
> #include "sd.h"
> #include "scsi_priv.h"
> @@ -1694,28 +1695,8 @@ static int sd_get_unique_id(struct gendisk *disk, u8 id[16],
> return ret;
> }
>
> -static char sd_pr_type(enum pr_type type)
> -{
> - switch (type) {
> - case PR_WRITE_EXCLUSIVE:
> - return 0x01;
> - case PR_EXCLUSIVE_ACCESS:
> - return 0x03;
> - case PR_WRITE_EXCLUSIVE_REG_ONLY:
> - return 0x05;
> - case PR_EXCLUSIVE_ACCESS_REG_ONLY:
> - return 0x06;
> - case PR_WRITE_EXCLUSIVE_ALL_REGS:
> - return 0x07;
> - case PR_EXCLUSIVE_ACCESS_ALL_REGS:
> - return 0x08;
> - default:
> - return 0;
> - }
> -};
> -
> static int sd_pr_out_command(struct block_device *bdev, u8 sa,
> - u64 key, u64 sa_key, u8 type, u8 flags)
> + u64 key, u64 sa_key, enum scsi_pr_type type, u8 flags)
> {
> struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk);
> struct scsi_device *sdev = sdkp->device;
> @@ -1778,19 +1759,21 @@ static int sd_pr_reserve(struct block_device *bdev, u64 key, enum pr_type type,
> {
> if (flags)
> return -EOPNOTSUPP;
> - return sd_pr_out_command(bdev, 0x01, key, 0, sd_pr_type(type), 0);
> + return sd_pr_out_command(bdev, 0x01, key, 0,
> + block_pr_type_to_scsi(type), 0);
> }
>
> static int sd_pr_release(struct block_device *bdev, u64 key, enum pr_type type)
> {
> - return sd_pr_out_command(bdev, 0x02, key, 0, sd_pr_type(type), 0);
> + return sd_pr_out_command(bdev, 0x02, key, 0,
> + block_pr_type_to_scsi(type), 0);
> }
>
> static int sd_pr_preempt(struct block_device *bdev, u64 old_key, u64 new_key,
> enum pr_type type, bool abort)
> {
> return sd_pr_out_command(bdev, abort ? 0x05 : 0x04, old_key, new_key,
> - sd_pr_type(type), 0);
> + block_pr_type_to_scsi(type), 0);
> }
>
> static int sd_pr_clear(struct block_device *bdev, u64 key)
> diff --git a/include/scsi/scsi_block_pr.h b/include/scsi/scsi_block_pr.h
> new file mode 100644
> index 000000000000..6e99f844330d
> --- /dev/null
> +++ b/include/scsi/scsi_block_pr.h
> @@ -0,0 +1,36 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _SCSI_BLOCK_PR_H
> +#define _SCSI_BLOCK_PR_H
> +
> +#include <uapi/linux/pr.h>
> +
> +enum scsi_pr_type {
> + SCSI_PR_WRITE_EXCLUSIVE = 0x01,
> + SCSI_PR_EXCLUSIVE_ACCESS = 0x03,
> + SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY = 0x05,
> + SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY = 0x06,
> + SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS = 0x07,
> + SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS = 0x08,
> +};
> +
> +static inline enum scsi_pr_type block_pr_type_to_scsi(enum pr_type type)
> +{
> + switch (type) {
> + case PR_WRITE_EXCLUSIVE:
> + return SCSI_PR_WRITE_EXCLUSIVE;
> + case PR_EXCLUSIVE_ACCESS:
> + return SCSI_PR_EXCLUSIVE_ACCESS;
> + case PR_WRITE_EXCLUSIVE_REG_ONLY:
> + return SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY;
> + case PR_EXCLUSIVE_ACCESS_REG_ONLY:
> + return SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY;
> + case PR_WRITE_EXCLUSIVE_ALL_REGS:
> + return SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS;
> + case PR_EXCLUSIVE_ACCESS_ALL_REGS:
> + return SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS;
> + default:
> + return 0;
> + }
> +};

do we need above semicolon ?

how about not using switch case pattern totally untested below ?

static inline enum scsi_pr_type block_pr_type_to_scsi(enum pr_type type)
{
enum pr_type pr_to_scsi_pr[] = {
[PR_WRITE_EXCLUSIVE] = SCSI_PR_WRITE_EXCLUSIVE,
[PR_EXCLUSIVE_ACCESS] = SCSI_PR_EXCLUSIVE_ACCESS,
[PR_WRITE_EXCLUSIVE_REG_ONLY] =
SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY,
[PR_EXCLUSIVE_ACCESS_REG_ONLY] =
SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY,
[PR_WRITE_EXCLUSIVE_ALL_REGS] =
SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS,
[PR_EXCLUSIVE_ACCESS_ALL_REGS] =
SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS,
};

if (type > ARRAY_SIZE(pr_to_scsi_pr))
return 0;
return pr_to_scsi_pr[type];
}

-ck