}
static sense_reason_t
-core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
+core_scsi3_emulate_pro_release_execute(struct se_cmd *cmd, int type, int scope,
u64 res_key)
{
struct se_device *dev = cmd->se_dev;
return ret;
}
+static sense_reason_t
+core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
+ u64 res_key)
+{
+ struct se_device *dev = cmd->se_dev;
+ sense_reason_t ret;
+
+ if (dev->transport->pr_ops && dev->transport->pr_ops->pr_release) {
+ if (scope != PR_SCOPE_LU_SCOPE) {
+ pr_err("SPC-3 PR: Illegal SCOPE: 0x%02x\n", scope);
+ return TCM_INVALID_PARAMETER_LIST;
+ }
+ ret = dev->transport->pr_ops->pr_release(cmd, type, res_key);
+ } else {
+ ret = core_scsi3_emulate_pro_release_execute(cmd, type, scope,
+ res_key);
+ }
+ return ret;
+}
+
static sense_reason_t
core_scsi3_emulate_pro_clear(struct se_cmd *cmd, u64 res_key)
{
u64 new_key, bool aptpl, bool all_tg_pt,
bool spec_i_pt, bool ignore_existing);
sense_reason_t (*pr_reserve)(struct se_cmd *cmd, int type, u64 key);
+ sense_reason_t (*pr_release)(struct se_cmd *cmd, int type, u64 key);
/* persistent reservation (in) API not proposed for block layer yet */
sense_reason_t (*pr_read_keys)(struct se_cmd *cmd, unsigned char *buf,
u32 buf_len);