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@xxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- > 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