Message ID | 20230324181741.13908-5-michael.christie@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Use block pr_ops in LIO | expand |
On 3/24/23 11:17, Mike Christie wrote: > diff --git a/include/scsi/scsi_block_pr.h b/include/scsi/scsi_block_pr.h > new file mode 100644 > index 000000000000..44766d7a81d8 > --- /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; > + } > + > + return 0; > +} > + > +#endif Hi Mike, Has it been considered to move enum scsi_pr_type into include/scsi/scsi_common.h and block_pr_type_to_scsi() into drivers/scsi/scsi_common.c? Other definitions that are shared between SCSI initiator and SCSI target code exist in these files. Thanks, Bart.
On 3/24/23 1:25 PM, Bart Van Assche wrote: > On 3/24/23 11:17, Mike Christie wrote: >> diff --git a/include/scsi/scsi_block_pr.h b/include/scsi/scsi_block_pr.h >> new file mode 100644 >> index 000000000000..44766d7a81d8 >> --- /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; >> + } >> + >> + return 0; >> +} >> + >> +#endif > > Hi Mike, > > Has it been considered to move enum scsi_pr_type into include/scsi/scsi_common.h and block_pr_type_to_scsi() into drivers/scsi/scsi_common.c? Other definitions that are shared between SCSI initiator and SCSI target code exist in these files. Nice. I didn't know that existed. Will move them.
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 00b9b6145fbc..7ebf59114da1 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" @@ -1692,26 +1693,6 @@ 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_scsi_to_pr_err(struct scsi_sense_hdr *sshdr, int result) { switch (host_byte(result)) { @@ -1742,8 +1723,8 @@ static int sd_scsi_to_pr_err(struct scsi_sense_hdr *sshdr, int result) } } -static int sd_pr_out_command(struct block_device *bdev, u8 sa, - u64 key, u64 sa_key, u8 type, u8 flags) +static int sd_pr_out_command(struct block_device *bdev, u8 sa, 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; @@ -1795,19 +1776,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..44766d7a81d8 --- /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; + } + + return 0; +} + +#endif