8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * CDDL HEADER START
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * The contents of this file are subject to the terms of the
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Common Development and Distribution License (the "License").
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * You may not use this file except in compliance with the License.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * or http://www.opensolaris.org/os/licensing.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * See the License for the specific language governing permissions
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * and limitations under the License.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * When distributing Covered Code, include this CDDL HEADER in each
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * If applicable, add the following below this CDDL HEADER, with the
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * fields enclosed by brackets "[]" replaced with your own identifying
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * information: Portions Copyright [yyyy] [name of copyright owner]
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * CDDL HEADER END
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/*
f4e76ddf09a338dc23da0904866290ac36274a5bNattuvetty Bhavyan * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#include <sys/atomic.h>
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#include <sys/conf.h>
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#include <sys/byteorder.h>
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#include <sys/scsi/scsi_types.h>
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#include <sys/scsi/generic/persist.h>
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include <sys/lpif.h>
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include <sys/stmf.h>
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include <sys/stmf_ioctl.h>
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include <sys/portif.h>
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include <sys/stmf_sbd_ioctl.h>
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "stmf_sbd.h"
4558d122136f151d62acbbc02ddb42df89a5ef66Viswanathan Kannappan#include "sbd_impl.h"
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define MAX_PGR_PARAM_LIST_LENGTH (256 * 1024)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoint sbd_pgr_reservation_conflict(scsi_task_t *);
450396635f70344c58b6b1e4db38cf17ff34445cJohn Fortevoid sbd_pgr_reset(sbd_lu_t *);
f4e76ddf09a338dc23da0904866290ac36274a5bNattuvetty Bhavyanvoid sbd_pgr_initialize_it(scsi_task_t *, sbd_it_data_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid sbd_handle_pgr_in_cmd(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid sbd_handle_pgr_out_cmd(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid sbd_handle_pgr_out_data(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid sbd_pgr_keylist_dealloc(sbd_lu_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetochar *sbd_get_devid_string(sbd_lu_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyansbd_status_t sbd_pgr_meta_init(sbd_lu_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_status_t sbd_pgr_meta_load(sbd_lu_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_status_t sbd_pgr_meta_write(sbd_lu_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_swap_pgr_info(sbd_pgr_info_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_swap_pgrkey_info(sbd_pgr_key_info_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_key_free(sbd_pgr_key_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_remove_key(sbd_lu_t *, sbd_pgr_key_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic uint32_t sbd_pgr_remove_keys(sbd_lu_t *, sbd_it_data_t *,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *, uint64_t, boolean_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic boolean_t sbd_pgr_key_compare(sbd_pgr_key_t *, scsi_devid_desc_t *,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic sbd_pgr_key_t *sbd_pgr_key_alloc(scsi_devid_desc_t *,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_transport_id_t *, int16_t, int16_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_set_pgr_check_flag(sbd_lu_t *, boolean_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_set_ua_conditions(sbd_lu_t *, sbd_it_data_t *, uint8_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_in_read_keys(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_in_report_capabilities(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_in_read_reservation(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_in_read_full_status(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_out_register(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_out_reserve(scsi_task_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_out_release(scsi_task_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_out_clear(scsi_task_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_out_preempt(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_out_register_and_move(scsi_task_t *, stmf_data_buf_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic sbd_pgr_key_t *sbd_pgr_do_register(sbd_lu_t *, sbd_it_data_t *,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_devid_desc_t *, stmf_remote_port_t *, uint8_t, uint64_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_do_unregister(sbd_lu_t *, sbd_it_data_t *, sbd_pgr_key_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_do_release(sbd_lu_t *, sbd_it_data_t *, uint8_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void sbd_pgr_do_reserve(sbd_pgr_t *, sbd_pgr_key_t *, sbd_it_data_t *it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsi_session_t *, scsi_cdb_prout_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern sbd_status_t sbd_write_meta_section(sbd_lu_t *, sm_section_hdr_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern sbd_status_t sbd_read_meta_section(sbd_lu_t *, sm_section_hdr_t **,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint16_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern void sbd_swap_section_hdr(sm_section_hdr_t *);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern void sbd_handle_short_write_transfers(scsi_task_t *task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_data_buf_t *dbuf, uint32_t cdb_xfer_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern void sbd_handle_short_read_transfers(scsi_task_t *task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_data_buf_t *dbuf, uint8_t *p, uint32_t cdb_xfer_size,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t cmd_xfer_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern uint16_t stmf_scsilib_get_lport_rtid(scsi_devid_desc_t *devid);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoextern scsi_devid_desc_t *stmf_scsilib_get_devid_desc(uint16_t rtpid);
70c284ca5360ed73476d9e94223d4905dd80b1adPeter Cudhea - Sun Microsystems - Burlington, MA United Statesextern char sbd_ctoi(char c);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-----------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |sl_it_list
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |---------------------------------------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | sbd_lu_t | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-----+-----+ V
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * V | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-----------+ pgr_key_list +------>| |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |------------+ +-->(NULL) | +- ---|sbd_it |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | | | | _data |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | sbd_pgr_t | V | | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | +-------+ | | +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |---+ | | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | |sbd_pgr|---------+ | v
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-----------+ | | _key_t|<----------+ +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | +-------+ +--------| |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |^ | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | || | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | v| | +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | +-------+ | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | v
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |ALL_TG_|<-------+ +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |PT = 1 |<---------+ | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | |---+ | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | +------| |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * (pgr_rsvholder +-------+ V | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * pgr_flags& |^ (NUll) | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * RSVD_ONE) || +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | v| |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | +-------+ v
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | not | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |claimed|---+ | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | +----| unreg |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | V | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | +-------+ (NUll) V | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |^ (NUll) +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | || |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | v| v
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | +-------+ +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | |reserv-|<----------------| |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +----->| ation|---------------->| |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * |holder | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * |key | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-------+ +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * |^ |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * || v
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * v| +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-------+ | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | not |---+ +----| unreg |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * |claimed| | | | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | V V | |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | | (NUll) (NUll) +-------+
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * +-------+ |
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * | v
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * v (NULL)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * (NULL)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_CONFLICT_FREE_CMDS(cdb) ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* ----------------------- */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* SPC-3 (rev 23) Table 31 */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* ----------------------- */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_INQUIRY) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_LOG_SENSE_G1) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_PERSISTENT_RESERVE_IN) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_REPORT_LUNS) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_REQUEST_SENSE) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_TEST_UNIT_READY) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* PREVENT ALLOW MEDIUM REMOVAL with prevent == 0 */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((((cdb[0]) == SCMD_DOORLOCK) && (((cdb[4]) & 0x3) == 0))) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* SERVICE ACTION IN with READ MEDIA SERIAL NUMBER (0x01) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[0]) == SCMD_SVC_ACTION_IN_G5) && ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[1]) & 0x1F) == 0x01)) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* MAINTENANCE IN with service actions REPORT ALIASES (0x0Bh) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* REPORT DEVICE IDENTIFIER (0x05) REPORT PRIORITY (0x0Eh) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* REPORT TARGET PORT GROUPS (0x0A) REPORT TIMESTAMP (0x0F) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[0]) == SCMD_MAINTENANCE_IN) && ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == 0x0B) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == 0x05) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == 0x0E) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == 0x0A) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == 0x0F))) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* REGISTER and REGISTER_AND_IGNORE_EXISTING_KEY */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* actions for PERSISTENT RESERVE OUT command */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[0]) == SCMD_PERSISTENT_RESERVE_OUT) && ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == PR_OUT_REGISTER))) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* ----------------------- */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* SBC-3 (rev 17) Table 3 */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* ----------------------- */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* READ CAPACITY(10) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[0]) == SCMD_READ_CAPACITY) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* READ CAPACITY(16) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[0]) == SCMD_SVC_ACTION_IN_G4) && ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((cdb[1]) & 0x1F) == 0x10)) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* START STOP UNIT with START bit 0 and POWER CONDITION 0 */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[0]) == SCMD_START_STOP) && ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[4]) & 0xF0) == 0) && (((cdb[4]) & 0x01) == 0))))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/* End of PGR_CONFLICT_FREE_CMDS */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/* Commands allowed for registered IT nexues but not reservation holder */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_REGISTERED_POSSIBLE_CMDS(cdb) ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[0]) == SCMD_PERSISTENT_RESERVE_OUT) && ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == PR_OUT_RELEASE) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == PR_OUT_CLEAR) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == PR_OUT_PREEMPT) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (((cdb[1]) & 0x1F) == PR_OUT_PREEMPT_ABORT))))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/* List of commands allowed when WR_EX type reservation held */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_READ_POSSIBLE_CMDS(c) ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_READ) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_READ_G1) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_READ_G4) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_READ_G5) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* READ FETCH (10) (16) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_READ_POSITION) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == 0x90) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* READ DEFECT DATA */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_READ_DEFECT_LIST) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == 0xB7) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* VERIFY (10) (16) (12) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_VERIFY) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_VERIFY_G4) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == SCMD_VERIFY_G5) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* XDREAD (10) */ \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((c) == 0x52))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_RESERVATION_HOLDER(pgr, key, it) ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((pgr)->pgr_flags & SBD_PGR_RSVD_ALL_REGISTRANTS) || ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((pgr)->pgr_rsvholder) && ((pgr)->pgr_rsvholder == (key)) && \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((key)->pgr_key_it) && ((key)->pgr_key_it == (it))))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_SET_FLAG(flg, val) (atomic_or_8(&(flg), (val)))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_CLEAR_FLAG(flg, val) (atomic_and_8(&(flg), ~(val)))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_CLEAR_RSV_FLAG(flg) (atomic_and_8(&(flg), \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (~(SBD_PGR_RSVD_ALL_REGISTRANTS | SBD_PGR_RSVD_ONE))))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_VALID_SCOPE(scope) ((scope) == PR_LU_SCOPE)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto#define PGR_VALID_TYPE(type) ( \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((type) == PGR_TYPE_WR_EX) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((type) == PGR_TYPE_EX_AC) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((type) == PGR_TYPE_WR_EX_RO) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((type) == PGR_TYPE_EX_AC_RO) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((type) == PGR_TYPE_WR_EX_AR) || \
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ((type) == PGR_TYPE_EX_AC_AR))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan#define ALIGNED_TO_8BYTE_BOUNDARY(i) (((i) + 7) & ~7)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_swap_pgr_info(sbd_pgr_info_t *spi)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_swap_section_hdr(&spi->pgr_sms_header);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (spi->pgr_data_order == SMS_DATA_ORDER)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_sms_header.sms_chksum += SMS_DATA_ORDER - spi->pgr_data_order;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_rsvholder_indx = BSWAP_32(spi->pgr_rsvholder_indx);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_numkeys = BSWAP_32(spi->pgr_numkeys);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_swap_pgrkey_info(sbd_pgr_key_info_t *key)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key = BSWAP_64(key->pgr_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_len = BSWAP_16(key->pgr_key_lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_rpt_len = BSWAP_16(key->pgr_key_rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyansbd_status_t
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyansbd_pgr_meta_init(sbd_lu_t *slu)
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan{
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan sbd_pgr_info_t *spi = NULL;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan uint32_t sz;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan sbd_status_t ret;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan sz = sizeof (sbd_pgr_info_t);
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan spi = (sbd_pgr_info_t *)kmem_zalloc(sz, KM_SLEEP);
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan spi->pgr_data_order = SMS_DATA_ORDER;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan spi->pgr_sms_header.sms_size = sz;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan spi->pgr_sms_header.sms_id = SMS_ID_PGR_INFO;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan spi->pgr_sms_header.sms_data_order = SMS_DATA_ORDER;
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan ret = sbd_write_meta_section(slu, (sm_section_hdr_t *)spi);
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan kmem_free(spi, sz);
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan return (ret);
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan}
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_status_t
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_meta_load(sbd_lu_t *slu)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_info_t *spi = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key, *last_key = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_info_t *spi_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_status_t ret = SBD_SUCCESS;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_devid_desc_t *lpt;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint8_t *ptr, *keyoffset, *endoffset;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t i, sz;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ret = sbd_read_meta_section(slu, (sm_section_hdr_t **)&spi,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SMS_ID_PGR_INFO);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (ret != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* No PGR section found, means volume made before PGR support */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (ret == SBD_NOT_FOUND) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* So just create a default PGR section */
7145ae3ec9b6b40ec13b508a7bb1718ce67f4588Nattuvetty Bhavyan ret = sbd_pgr_meta_init(slu);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (ret);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (spi->pgr_data_order != SMS_DATA_ORDER) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_swap_pgr_info(spi);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_flags = spi->pgr_flags;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_type = spi->pgr_rsv_type;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_scope = spi->pgr_rsv_scope;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_RSV_FLAG(pgr->pgr_flags);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_FLAG(slu->sl_pgr->pgr_flags, SBD_PGR_ALL_KEYS_HAS_IT);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto endoffset = (uint8_t *)spi;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto endoffset += spi->pgr_sms_header.sms_size;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto keyoffset = (uint8_t *)(spi + 1);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (i = 1; i <= spi->pgr_numkeys; i++) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi_key = (sbd_pgr_key_info_t *)keyoffset;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (spi->pgr_data_order != SMS_DATA_ORDER) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_swap_pgrkey_info(spi_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Calculate the size and next offset */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sz = ALIGNED_TO_8BYTE_BOUNDARY(sizeof (sbd_pgr_key_info_t) - 1 +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi_key->pgr_key_lpt_len + spi_key->pgr_key_rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto keyoffset += sz;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Validate the key fields */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (spi_key->pgr_key_rpt_len == 0 || endoffset < keyoffset ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (spi_key->pgr_key_lpt_len == 0 &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto !(spi_key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT))) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan ret = SBD_META_CORRUPTED;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan goto sbd_pgr_meta_load_failed;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt = (scsi_devid_desc_t *)spi_key->pgr_key_it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ptr = (uint8_t *)spi_key->pgr_key_it + spi_key->pgr_key_lpt_len;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (spi_key->pgr_key_flags & SBD_PGR_KEY_TPT_ID_FLAG) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint16_t tpd_len = 0;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (!stmf_scsilib_tptid_validate(
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (scsi_transport_id_t *)ptr,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan spi_key->pgr_key_rpt_len, &tpd_len)) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan ret = SBD_META_CORRUPTED;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan goto sbd_pgr_meta_load_failed;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (tpd_len != spi_key->pgr_key_rpt_len) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan ret = SBD_META_CORRUPTED;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan goto sbd_pgr_meta_load_failed;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key = sbd_pgr_key_alloc(lpt, (scsi_transport_id_t *)ptr,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan spi_key->pgr_key_lpt_len, spi_key->pgr_key_rpt_len);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan } else {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *rpt = NULL;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /*
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan * This block is executed only if the metadata was
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan * stored before the implementation of Transport ID
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan * support.
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rpt = stmf_scsilib_devid_to_remote_port(
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (scsi_devid_desc_t *)ptr);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (rpt == NULL) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan ret = SBD_META_CORRUPTED;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan goto sbd_pgr_meta_load_failed;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key = sbd_pgr_key_alloc(lpt, rpt->rport_tptid,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan spi_key->pgr_key_lpt_len, rpt->rport_tptid_sz);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_free(rpt);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key = spi_key->pgr_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_flags = spi_key->pgr_key_flags;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_prev = last_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (last_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto last_key->pgr_key_next = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto last_key = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if ((pgr->pgr_flags & SBD_PGR_RSVD_ONE) &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (i == spi->pgr_rsvholder_indx)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(spi, spi->pgr_sms_header.sms_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (ret);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyansbd_pgr_meta_load_failed:
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan char *lun_name = sbd_get_devid_string(slu);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sbd_pgr_keylist_dealloc(slu);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(spi, spi->pgr_sms_header.sms_size);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan cmn_err(CE_WARN, "sbd_pgr_meta_load: Failed to load PGR meta data "
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan "for lun %s.", lun_name);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(lun_name, strlen(lun_name) + 1);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan return (ret);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_status_t
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_meta_write(sbd_lu_t *slu)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_info_t *spi;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_info_t *spi_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_status_t ret = SBD_SUCCESS;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t sz, totalsz;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Calculate total pgr meta section size needed */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sz = sizeof (sbd_pgr_info_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto while (key != NULL) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sz = ALIGNED_TO_8BYTE_BOUNDARY(sz +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sizeof (sbd_pgr_key_info_t) - 1 +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_len + key->pgr_key_rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto totalsz = sz;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi = (sbd_pgr_info_t *)kmem_zalloc(totalsz, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_flags = pgr->pgr_flags;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_rsv_type = pgr->pgr_rsv_type;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_rsv_scope = pgr->pgr_rsv_scope;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_data_order = SMS_DATA_ORDER;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_numkeys = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_sms_header.sms_size = totalsz;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_sms_header.sms_id = SMS_ID_PGR_INFO;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_sms_header.sms_data_order = SMS_DATA_ORDER;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint8_t *ptr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sz = sizeof (sbd_pgr_info_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto while (key != NULL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi_key = (sbd_pgr_key_info_t *)((uint8_t *)spi + sz);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi_key->pgr_key = key->pgr_key;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan spi_key->pgr_key_flags = key->pgr_key_flags;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi_key->pgr_key_lpt_len = key->pgr_key_lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi_key->pgr_key_rpt_len = key->pgr_key_rpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ptr = spi_key->pgr_key_it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto bcopy(key->pgr_key_lpt_id, ptr, key->pgr_key_lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ptr += key->pgr_key_lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto bcopy(key->pgr_key_rpt_id, ptr, key->pgr_key_rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_numkeys++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key == pgr->pgr_rsvholder) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto spi->pgr_rsvholder_indx = spi->pgr_numkeys;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sz = ALIGNED_TO_8BYTE_BOUNDARY(sz +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sizeof (sbd_pgr_key_info_t) - 1 +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_len + key->pgr_key_rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ret = sbd_write_meta_section(slu, (sm_section_hdr_t *)spi);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(spi, totalsz);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (ret != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *tmp_list;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto tmp_list = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_meta_load(slu) != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto char *lun_name = sbd_get_devid_string(slu);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cmn_err(CE_WARN, "sbd_pgr_meta_write: Failed to revert "
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto "back to existing PGR state after meta write "
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto "failure, may cause PGR inconsistancy for lun %s.",
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lun_name);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(lun_name, strlen(lun_name) + 1);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = tmp_list;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = tmp_list;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_set_pgr_check_flag(slu, B_TRUE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_keylist_dealloc(slu);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (ret);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic sbd_pgr_key_t *
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyansbd_pgr_key_alloc(scsi_devid_desc_t *lptid, scsi_transport_id_t *rptid,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan int16_t lpt_len, int16_t rpt_len)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = (sbd_pgr_key_t *)kmem_zalloc(sizeof (sbd_pgr_key_t), KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (lptid && lpt_len >= sizeof (scsi_devid_desc_t)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_len = lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_id = (scsi_devid_desc_t *)kmem_zalloc(
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt_len, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto bcopy(lptid, key->pgr_key_lpt_id, lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (rptid && rpt_len >= sizeof (scsi_transport_id_t)) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key->pgr_key_flags |= SBD_PGR_KEY_TPT_ID_FLAG;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_rpt_len = rpt_len;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key->pgr_key_rpt_id = (scsi_transport_id_t *)kmem_zalloc(
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rpt_len, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto bcopy(rptid, key->pgr_key_rpt_id, rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_key_free(sbd_pgr_key_t *key)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_lpt_id) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(key->pgr_key_lpt_id, key->pgr_key_lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_rpt_id) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(key->pgr_key_rpt_id, key->pgr_key_rpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(key, sizeof (sbd_pgr_key_t));
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_keylist_dealloc(sbd_lu_t *slu)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = slu->sl_it_list; it != NULL; it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto while (pgr->pgr_keylist != NULL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_free(key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte/*
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte * Reset and clear the keys, Can be used in the case of Lun Reset
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte */
450396635f70344c58b6b1e4db38cf17ff34445cJohn Fortevoid
450396635f70344c58b6b1e4db38cf17ff34445cJohn Fortesbd_pgr_reset(sbd_lu_t *slu)
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte{
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte sbd_pgr_t *pgr = slu->sl_pgr;
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte rw_enter(&pgr->pgr_lock, RW_WRITER);
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte if (!(pgr->pgr_flags & SBD_PGR_APTPL)) {
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte sbd_pgr_keylist_dealloc(slu);
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte pgr->pgr_PRgeneration = 0;
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte pgr->pgr_rsvholder = NULL;
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte pgr->pgr_rsv_type = 0;
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte pgr->pgr_flags = 0;
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte }
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte rw_exit(&pgr->pgr_lock);
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte}
450396635f70344c58b6b1e4db38cf17ff34445cJohn Forte
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_remove_key(sbd_lu_t *slu, sbd_pgr_key_t *key)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = slu->sl_it_list; it != NULL; it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it->pgr_key_ptr == key)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_it) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it->pgr_key_ptr = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_next->pgr_key_prev = key->pgr_key_prev;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_prev) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_prev->pgr_key_next = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_free(key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Remove keys depends on boolean variable "match"
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * match = B_TRUE ==> Remove all keys which matches the given svc_key,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * except for IT equal to given "my_it".
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * match = B_FALSE ==> Remove all keys which does not matches the svc_key,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * except for IT equal to given "my_it"
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic uint32_t
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_remove_keys(sbd_lu_t *slu, sbd_it_data_t *my_it, sbd_pgr_key_t *my_key,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint64_t svc_key, boolean_t match)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *nextkey, *key = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t count = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto while (key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto nextkey = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (match == B_TRUE && key->pgr_key == svc_key ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto match == B_FALSE && key->pgr_key != svc_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * If the key is registered by current IT keep it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * but just remove pgr pointers from other ITs
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key == my_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = slu->sl_it_list; it != NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it->pgr_key_ptr == key &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it != my_it)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_remove_key(slu, key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto count++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = nextkey;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (count);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_set_ua_conditions(sbd_lu_t *slu, sbd_it_data_t *my_it, uint8_t ua)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = slu->sl_it_list; it != NULL; it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it == my_it)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto continue;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->sbd_it_ua_conditions |= ua;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Set the SBD_IT_PGR_CHECK_FLAG depends on variable "registered". See Below.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * If
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * registered is B_TRUE => Set PGR_CHECK_FLAG on all registered IT nexus
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * registered is B_FALSE => Set PGR_CHECK_FLAG on all unregistered IT nexus
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_set_pgr_check_flag(sbd_lu_t *slu, boolean_t registered)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_FLAG(slu->sl_pgr->pgr_flags, SBD_PGR_ALL_KEYS_HAS_IT);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = slu->sl_it_list; it != NULL; it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it->pgr_key_ptr) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (registered == B_TRUE) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->sbd_it_flags |= SBD_IT_PGR_CHECK_FLAG;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (registered == B_FALSE)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->sbd_it_flags |= SBD_IT_PGR_CHECK_FLAG;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic boolean_t
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_key_compare(sbd_pgr_key_t *key, scsi_devid_desc_t *lpt,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *rpt)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_devid_desc_t *id;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (!stmf_scsilib_tptid_compare(rpt->rport_tptid, key->pgr_key_rpt_id))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (B_FALSE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * You can skip target port name comparison if ALL_TG_PT flag
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * is set for this key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (!(key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) && lpt) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto id = key->pgr_key_lpt_id;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if ((lpt->ident_length != id->ident_length) ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (memcmp(id->ident, lpt->ident, id->ident_length) != 0)) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan return (B_FALSE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (B_TRUE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_key_t *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_key_registered(sbd_pgr_t *pgr, scsi_devid_desc_t *lpt,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *rpt)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (key = pgr->pgr_keylist; key != NULL; key = key->pgr_key_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_key_compare(key, lpt, rpt) == B_TRUE) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (NULL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid
f4e76ddf09a338dc23da0904866290ac36274a5bNattuvetty Bhavyansbd_pgr_initialize_it(scsi_task_t *task, sbd_it_data_t *it)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
f4e76ddf09a338dc23da0904866290ac36274a5bNattuvetty Bhavyan stmf_scsi_session_t *ses = task->task_session;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_devid_desc_t *lpt, *id;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *rpt;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_ALL_KEYS_HAS_IT)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rpt = ses->ss_rport;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt = ses->ss_lport->lport_id;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_enter(&pgr->pgr_lock, RW_WRITER);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_SET_FLAG(pgr->pgr_flags, SBD_PGR_ALL_KEYS_HAS_IT);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (key = pgr->pgr_keylist; key != NULL; key = key->pgr_key_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if ((!(key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT)) &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it != NULL)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto continue;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * SBD_PGR_ALL_KEYS_HAS_IT is set only if no single key
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * in the list has SBD_PGR_KEY_ALL_TG_PT flag set and
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * pgr_key_it all keys points to some IT
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_FLAG(pgr->pgr_flags, SBD_PGR_ALL_KEYS_HAS_IT);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Check if key matches with given lpt rpt combination */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_key_compare(key, lpt, rpt) == B_FALSE)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto continue;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* IT nexus devid information matches with this key */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * If ALL_TG_PT is set, pgr_key_it will point to NULL,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * unless pgr->pgr_rsvholder pointing to this key.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * In that case, pgr_key_it should point to the IT
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * which initiated that reservation.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsvholder == key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto id = key->pgr_key_lpt_id;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (lpt->ident_length == id->ident_length) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (memcmp(id->ident, lpt->ident,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto id->ident_length) == 0)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it = it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it = it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto/*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Check for any PGR Reservation conflict. return 0 if access allowed
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetoint
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_reservation_conflict(scsi_task_t *task)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = (sbd_it_data_t *)task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If Registered */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_RSVD_ALL_REGISTRANTS && it->pgr_key_ptr)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If you are registered */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_RSVD_ONE) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_enter(&pgr->pgr_lock, RW_READER);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Note: it->pgr_key_ptr is protected by sl_lock. Also,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * it is expected to change its value only with pgr_lock
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * held. Hence we are safe to read its value without
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * grabbing sl_lock. But make sure that the value used is
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * not from registers by using "volatile" keyword.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Since this funtion is in performance path, we may want
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * to avoid grabbing sl_lock.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if ((volatile sbd_pgr_key_t *)it->pgr_key_ptr) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If you are the reservation holder */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsvholder == it->pgr_key_ptr &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr->pgr_key_it == it) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If reserve type is not EX_AC */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsv_type != PGR_TYPE_EX_AC) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If reserve type is WR_EX allow read */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsv_type == PGR_TYPE_WR_EX) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (PGR_READ_POSSIBLE_CMDS(
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto task->task_cdb[0])) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* For all other reserve types allow access */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If registered, allow these commands */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (PGR_REGISTERED_POSSIBLE_CMDS(task->task_cdb)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* For any case, allow these commands */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (PGR_CONFLICT_FREE_CMDS(task->task_cdb)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Give read access if reservation type WR_EX for registrants */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsv_type == PGR_TYPE_WR_EX_RO ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_type == PGR_TYPE_WR_EX_AR) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (PGR_READ_POSSIBLE_CMDS(task->task_cdb[0]))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* If you reached here, No access for you */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (1);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_handle_pgr_in_cmd(scsi_task_t *task, stmf_data_buf_t *initial_dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prin_t *pr_in;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_IN);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pr_in = (scsi_cdb_prin_t *)task->task_cdb;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_enter(&pgr->pgr_lock, RW_READER);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto switch (pr_in->action) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_IN_READ_KEYS:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_in_read_keys(task, initial_dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_IN_READ_RESERVATION:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_in_read_reservation(task, initial_dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_IN_REPORT_CAPABILITIES:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_in_report_capabilities(task, initial_dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_IN_READ_FULL_STATUS:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_in_read_full_status(task, initial_dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto default :
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_handle_pgr_out_cmd(scsi_task_t *task, stmf_data_buf_t *initial_dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prout_t *pr_out = (scsi_cdb_prout_t *)task->task_cdb;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t param_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_OUT);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto switch (pr_out->action) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_REGISTER:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_RESERVE:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_RELEASE:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_CLEAR:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_PREEMPT:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_PREEMPT_ABORT:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_REGISTER_MOVE:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto param_len = READ_SCSI32(pr_out->param_len, uint32_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (param_len < MAX_PGR_PARAM_LIST_LENGTH &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto param_len > 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_handle_short_write_transfers(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto initial_dbuf, param_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_PARAM_LIST_LENGTH_ERROR);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto default :
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_handle_pgr_out_data(scsi_task_t *task, stmf_data_buf_t *dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prout_t *pr_out = (scsi_cdb_prout_t *)task->task_cdb;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prout_plist_t *plist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint64_t rsv_key;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint32_t buflen;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint8_t *buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_OUT);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (dbuf == NULL || dbuf->db_data_size < 24) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_PARAM_LIST_LENGTH_ERROR);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = dbuf->db_sglist[0].seg_addr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buflen = dbuf->db_data_size;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto plist = (scsi_prout_plist_t *)buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* SPC3 - 6.12.1 */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action != PR_OUT_REGISTER_MOVE && buflen != 24) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if ((pr_out->action !=
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pr_out->action != PR_OUT_REGISTER) ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto plist->spec_i_pt == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_PARAM_LIST_LENGTH_ERROR);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Common Reservation Conflict Checks
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * It is okey to handle REGISTER_MOVE with same plist here,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * because we are only accessing reservation key feild.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_enter(&pgr->pgr_lock, RW_WRITER);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Currently it is not mandatory to have volatile keyword here,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * because, it->pgr_key_ptr is not accessed yet. But still
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * keeping it to safe gaurd against any possible future changes.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = (sbd_pgr_key_t *)((volatile sbd_pgr_key_t *)it->pgr_key_ptr);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action != PR_OUT_REGISTER &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pr_out->action != PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* if IT is not yet registered send conflict status */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key == NULL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action == PR_OUT_REGISTER_MOVE &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SBD_PGR_RSVD_NONE(pgr)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Given reservation key should matches with registered key */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rsv_key = READ_SCSI64(plist->reservation_key, uint64_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key != rsv_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto switch (pr_out->action) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_REGISTER:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_out_register(task, dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_REGISTER_MOVE:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_out_register_and_move(task, dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_RESERVE:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_out_reserve(task);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_RELEASE:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_out_release(task);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_CLEAR:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_out_clear(task);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_PREEMPT:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto case PR_OUT_PREEMPT_ABORT:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_out_preempt(task, dbuf);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto default :
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_in_read_keys(scsi_task_t *task, stmf_data_buf_t *initial_dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prin_readrsrv_t *buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t buf_size, cdb_len, numkeys = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint64_t *reg_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_IN);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len = READ_SCSI16(&task->task_cdb[7], uint16_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (key = pgr->pgr_keylist; key != NULL; key = key->pgr_key_next)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ++numkeys;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf_size = 8 + numkeys * 8; /* minimum 8 bytes */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = kmem_zalloc(buf_size, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE32(buf->PRgeneration, pgr->pgr_PRgeneration);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE32(buf->add_len, numkeys * 8);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto reg_key = (uint64_t *)&buf->key_list;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (key = pgr->pgr_keylist; key != NULL; key = key->pgr_key_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE64(reg_key, key->pgr_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto reg_key++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_handle_short_read_transfers(task, initial_dbuf, (uint8_t *)buf,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len, buf_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(buf, buf_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_in_read_reservation(scsi_task_t *task, stmf_data_buf_t *initial_dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prin_readrsrv_t *buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t cdb_len, buf_len, buf_size = 24;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_IN);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len = READ_SCSI16(&task->task_cdb[7], uint16_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = kmem_zalloc(buf_size, KM_SLEEP); /* fixed size cdb, 24 bytes */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE32(buf->PRgeneration, pgr->pgr_PRgeneration);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (SBD_PGR_RSVD_NONE(pgr)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE32(buf->add_len, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf_len = 8;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_RSVD_ALL_REGISTRANTS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE64(
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf->key_list.res_key_list[0].reservation_key, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE64(
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf->key_list.res_key_list[0].reservation_key,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder->pgr_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf->key_list.res_key_list[0].type = pgr->pgr_rsv_type;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf->key_list.res_key_list[0].scope = pgr->pgr_rsv_scope;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE32(buf->add_len, 16);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf_len = 24;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_handle_short_read_transfers(task, initial_dbuf, (uint8_t *)buf,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len, buf_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(buf, buf_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_in_report_capabilities(scsi_task_t *task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_data_buf_t *initial_dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prin_rpt_cap_t buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint32_t cdb_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_IN);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(pgr != NULL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
70c284ca5360ed73476d9e94223d4905dd80b1adPeter Cudhea - Sun Microsystems - Burlington, MA United States bzero(&buf, sizeof (buf));
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.ptpl_c = 1; /* Persist Through Power Loss C */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.atp_c = 1; /* All Target Ports Capable */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.sip_c = 1; /* Specify Initiator Ports Capable */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.crh = 0; /* Supports Reserve/Release exception */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.tmv = 1; /* Type Mask Valid */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.pr_type.wr_ex = 1; /* Write Exclusve */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.pr_type.ex_ac = 1; /* Exclusive Access */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.pr_type.wr_ex_ro = 1; /* Write Exclusive Registrants Only */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.pr_type.ex_ac_ro = 1; /* Exclusive Access Registrants Only */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.pr_type.wr_ex_ar = 1; /* Write Exclusive All Registrants */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.pr_type.ex_ac_ar = 1; /* Exclusive Access All Registrants */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Persist Though Power Loss Active */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf.ptpl_a = pgr->pgr_flags & SBD_PGR_APTPL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE16(&buf.length, 8);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len = READ_SCSI16(&task->task_cdb[7], uint16_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_handle_short_read_transfers(task, initial_dbuf, (uint8_t *)&buf,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len, 8);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan/* Minimum required size, SPC3 rev23 Table 110 */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan#define PGR_IN_READ_FULL_STATUS_MINBUFSZ 8
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan/* Full Satus Descriptor Fromat size, SPC3 rev23 Table 111 */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan#define PGR_IN_READ_FULL_STATUS_DESCFMTSZ 24
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_in_read_full_status(scsi_task_t *task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_data_buf_t *initial_dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prin_status_t *sts;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prin_full_status_t *buf;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint32_t i, buf_size, cdb_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint8_t *offset;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(task->task_cdb[0] == SCMD_PERSISTENT_RESERVE_IN);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(pgr != NULL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /* 4 byte allocation length for CDB, SPC3 rev23, Table 101 */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len = READ_SCSI16(&task->task_cdb[7], uint16_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /* PRgeneration and additional length fields */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan buf_size = PGR_IN_READ_FULL_STATUS_MINBUFSZ;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (key = pgr->pgr_keylist; key != NULL; key = key->pgr_key_next) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan buf_size = buf_size + PGR_IN_READ_FULL_STATUS_DESCFMTSZ +
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key->pgr_key_rpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = kmem_zalloc(buf_size, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE32(buf->PRgeneration, pgr->pgr_PRgeneration);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan SCSI_WRITE32(buf->add_len, buf_size - PGR_IN_READ_FULL_STATUS_MINBUFSZ);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto offset = (uint8_t *)&buf->full_desc[0];
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto i = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto while (key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sts = (scsi_prin_status_t *)offset;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE64(sts->reservation_key, key->pgr_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if ((pgr->pgr_flags & SBD_PGR_RSVD_ALL_REGISTRANTS) ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (pgr->pgr_rsvholder && pgr->pgr_rsvholder == key)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sts->r_holder = 1;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sts->type = pgr->pgr_rsv_type;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sts->scope = pgr->pgr_rsv_scope;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sts->all_tg_pt = 1;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SCSI_WRITE16(sts->rel_tgt_port_id,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_get_lport_rtid(key->pgr_key_lpt_id));
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan SCSI_WRITE32(sts->add_len, key->pgr_key_rpt_len);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan offset += PGR_IN_READ_FULL_STATUS_DESCFMTSZ;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (void) memcpy(offset, key->pgr_key_rpt_id,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key->pgr_key_rpt_len);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan offset += key->pgr_key_rpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key = key->pgr_key_next;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ++i;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
70c284ca5360ed73476d9e94223d4905dd80b1adPeter Cudhea - Sun Microsystems - Burlington, MA United States ASSERT(offset <= (uint8_t *)buf + buf_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_handle_short_read_transfers(task, initial_dbuf, (uint8_t *)buf,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto cdb_len, buf_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(buf, buf_size);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_out_register(scsi_task_t *task, stmf_data_buf_t *dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsi_session_t *ses = task->task_session;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key = it->pgr_key_ptr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prout_t *pr_out = (scsi_cdb_prout_t *)task->task_cdb;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_devid_desc_t *lpt = ses->ss_lport->lport_id;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prout_plist_t *plist;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t rport;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint8_t *buf, keyflag;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint32_t buflen;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint64_t rsv_key, svc_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = dbuf->db_sglist[0].seg_addr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto plist = (scsi_prout_plist_t *)buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buflen = dbuf->db_data_size;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rsv_key = READ_SCSI64(plist->reservation_key, uint64_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto svc_key = READ_SCSI64(plist->service_key, uint64_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Handling already registered IT session */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action == PR_OUT_REGISTER &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key != rsv_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (plist->spec_i_pt) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (plist->all_tg_pt !=
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (svc_key == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_unregister(slu, it, key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key = svc_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto goto sbd_pgr_reg_done;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Handling unregistered IT session */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action == PR_OUT_REGISTER && rsv_key != 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (svc_key == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Do we need to consider aptpl here? I don't think so */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_PRgeneration++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan keyflag = SBD_PGR_KEY_TPT_ID_FLAG;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (plist->all_tg_pt) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan keyflag |= SBD_PGR_KEY_ALL_TG_PT;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan lpt = NULL;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (plist->spec_i_pt) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint32_t max_tpdnum, tpdnum, i, adn_len = 0;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint16_t tpd_sz = 0;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint8_t *adn_dat;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_transport_id_t *tpd;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *rpt_ary;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action == PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /* Length validation SPC3 rev23 Section 6.12.3 and Table 115 */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (buflen >= sizeof (scsi_prout_plist_t) - 1 +
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sizeof (uint32_t))
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan adn_len = READ_SCSI32(plist->apd, uint32_t);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /* SPC3 rev23, adn_len should be multiple of 4 */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (adn_len % 4 != 0 ||
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan adn_len < sizeof (scsi_transport_id_t) +
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sizeof (uint32_t) ||
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan buflen < sizeof (scsi_prout_plist_t) - 1 + adn_len) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_PARAM_LIST_LENGTH_ERROR);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto tpdnum = 0;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan adn_dat = plist->apd + sizeof (uint32_t);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan max_tpdnum = adn_len / sizeof (scsi_transport_id_t);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rpt_ary = (stmf_remote_port_t *)kmem_zalloc(
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sizeof (stmf_remote_port_t) * max_tpdnum, KM_SLEEP);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Check the validity of given TransportIDs */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan while (adn_len != 0) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (!stmf_scsilib_tptid_validate(
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (scsi_transport_id_t *)adn_dat, adn_len, &tpd_sz))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /* SPC3 rev23, tpd_sz should be multiple of 4 */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (tpd_sz == 0 || tpd_sz % 4 != 0)
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan break;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan tpd = (scsi_transport_id_t *)adn_dat;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* make sure that there is no duplicates */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (i = 0; i < tpdnum; i++) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (stmf_scsilib_tptid_compare(
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rpt_ary[i].rport_tptid, tpd))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (i < tpdnum)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rpt_ary[tpdnum].rport_tptid = tpd;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rpt_ary[tpdnum].rport_tptid_sz = tpd_sz;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Check if the given IT nexus is already registered */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (sbd_pgr_key_registered(pgr, lpt, &rpt_ary[tpdnum]))
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan adn_len -= tpd_sz;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan adn_dat += tpd_sz;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan tpdnum++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (adn_len != 0) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(rpt_ary,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sizeof (stmf_remote_port_t) * max_tpdnum);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan for (i = 0; i < tpdnum; i++) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (void) sbd_pgr_do_register(slu, NULL, lpt, &rpt_ary[i],
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan keyflag, svc_key);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(rpt_ary, sizeof (stmf_remote_port_t) * max_tpdnum);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rport.rport_tptid = ses->ss_rport->rport_tptid;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rport.rport_tptid_sz = ses->ss_rport->rport_tptid_sz;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (void) sbd_pgr_do_register(slu, it, lpt, &rport, keyflag, svc_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_reg_done:
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL || plist->aptpl) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (plist->aptpl)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_SET_FLAG(pgr->pgr_flags, SBD_PGR_APTPL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto else
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_FLAG(pgr->pgr_flags, SBD_PGR_APTPL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_meta_write(slu) != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INSUFFICIENT_REG_RESOURCES);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_PRgeneration++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic sbd_pgr_key_t *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_do_register(sbd_lu_t *slu, sbd_it_data_t *it, scsi_devid_desc_t *lpt,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t *rpt, uint8_t keyflag, uint64_t svc_key)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint16_t lpt_len = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (lpt)
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan lpt_len = sizeof (scsi_devid_desc_t) + lpt->ident_length;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key = sbd_pgr_key_alloc(lpt, rpt->rport_tptid,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan lpt_len, rpt->rport_tptid_sz);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key = svc_key;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan key->pgr_key_flags |= keyflag;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* set PGR_CHECK flag for all unregistered IT nexus */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_set_pgr_check_flag(slu, B_FALSE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it = it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan } else {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sbd_pgr_set_pgr_check_flag(slu, B_FALSE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_next = pgr->pgr_keylist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_keylist) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist->pgr_key_prev = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_keylist = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_do_unregister(sbd_lu_t *slu, sbd_it_data_t *it, sbd_pgr_key_t *key)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (slu->sl_pgr->pgr_rsvholder == key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_release(slu, it, SBD_UA_RESERVATIONS_RELEASED);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_remove_key(slu, key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (slu->sl_pgr->pgr_keylist == NULL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_RSV_FLAG(slu->sl_pgr->pgr_flags);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_out_reserve(scsi_task_t *task)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsi_session_t *ses = task->task_session;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prout_t *pr_out = (scsi_cdb_prout_t *)task->task_cdb;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key = it->pgr_key_ptr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (!(PGR_VALID_SCOPE(pr_out->scope) && PGR_VALID_TYPE(pr_out->type))) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (SBD_PGR_RSVD(pgr)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (PGR_RESERVATION_HOLDER(pgr, key, it)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsv_type != pr_out->type ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_scope != pr_out->scope) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* In case there is no reservation exist */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_reserve(pgr, key, it, ses, pr_out);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_meta_write(slu) != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INSUFFICIENT_REG_RESOURCES);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_do_reserve(sbd_pgr_t *pgr, sbd_pgr_key_t *key, sbd_it_data_t *it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsi_session_t *ses, scsi_cdb_prout_t *pr_out)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_devid_desc_t *lpt;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint16_t lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_type = pr_out->type;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_scope = pr_out->scope;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->type == PGR_TYPE_WR_EX_AR ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pr_out->type == PGR_TYPE_EX_AC_AR) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_SET_FLAG(pgr->pgr_flags, SBD_PGR_RSVD_ALL_REGISTRANTS);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt = key->pgr_key_lpt_id;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt_len = key->pgr_key_lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (lpt_len > 0 && lpt != NULL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(lpt, lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt = ses->ss_lport->lport_id;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan lpt_len = sizeof (scsi_devid_desc_t) +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt->ident_length;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_len = lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_lpt_id = (scsi_devid_desc_t *)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_zalloc(lpt_len, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto bcopy(lpt, key->pgr_key_lpt_id, lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it = it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_SET_FLAG(pgr->pgr_flags, SBD_PGR_RSVD_ONE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder = key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_out_release(scsi_task_t *task)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prout_t *pr_out = (scsi_cdb_prout_t *)task->task_cdb;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key = it->pgr_key_ptr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (SBD_PGR_RSVD(pgr)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_RSVD_ALL_REGISTRANTS ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder == key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsv_type != pr_out->type ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_scope != pr_out->scope) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_RELEASE_OF_PR);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_release(slu, it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SBD_UA_RESERVATIONS_RELEASED);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_do_release(sbd_lu_t *slu, sbd_it_data_t *it, uint8_t ua_condition)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Reset pgr_flags */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_RSV_FLAG(pgr->pgr_flags);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* set unit attention condition if necessary */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsv_type != PGR_TYPE_WR_EX &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_type != PGR_TYPE_EX_AC) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_set_ua_conditions(slu, it, ua_condition);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_type = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_out_clear(scsi_task_t *task)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(it->pgr_key_ptr);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_RSV_FLAG(pgr->pgr_flags);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsv_type = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Remove all pointers from IT to pgr keys */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = slu->sl_it_list; it != NULL; it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto it->pgr_key_ptr = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&slu->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_keylist_dealloc(slu);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_set_ua_conditions(slu, it, SBD_UA_RESERVATIONS_PREEMPTED);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_meta_write(slu) != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INSUFFICIENT_REG_RESOURCES);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_PRgeneration++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_out_preempt(scsi_task_t *task, stmf_data_buf_t *dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsi_session_t *ses = task->task_session;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_cdb_prout_t *pr_out = (scsi_cdb_prout_t *)task->task_cdb;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key = it->pgr_key_ptr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prout_plist_t *plist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint8_t *buf, change_rsv = 0;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint64_t svc_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ASSERT(key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = dbuf->db_sglist[0].seg_addr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto plist = (scsi_prout_plist_t *)buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto svc_key = READ_SCSI64(plist->service_key, uint64_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (SBD_PGR_RSVD_NONE(pgr)) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (svc_key == 0 ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_remove_keys(slu, it, key, svc_key, B_TRUE) == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else if (pgr->pgr_flags & SBD_PGR_RSVD_ONE) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (svc_key == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Validity check of scope and type */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsvholder->pgr_key == svc_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (!(PGR_VALID_SCOPE(pr_out->scope) &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_VALID_TYPE(pr_out->type))) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsvholder != key &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder->pgr_key == svc_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_release(slu, it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SBD_UA_REGISTRATIONS_PREEMPTED);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto change_rsv = 1;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsvholder == key &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder->pgr_key == svc_key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->scope != pgr->pgr_rsv_scope ||
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pr_out->type != pgr->pgr_rsv_type) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_release(slu, it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SBD_UA_REGISTRATIONS_PREEMPTED);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto change_rsv = 1;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Remove matched keys in all cases, except when the
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * current IT nexus holds the reservation and the given
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * svc_key matches with registered key.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Note that, if the reservation is held by another
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * IT nexus, and svc_key matches registered key for
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * that IT nexus, sbd_pgr_remove_key() is not expected
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * return 0. Hence, returning check condition after
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * releasing the reservation does not arise.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_remove_keys(slu, it, key, svc_key, B_TRUE)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (change_rsv) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_reserve(pgr, key, it, ses, pr_out);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else if (pgr->pgr_flags & SBD_PGR_RSVD_ALL_REGISTRANTS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (svc_key == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (!(PGR_VALID_SCOPE(pr_out->scope) &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_VALID_TYPE(pr_out->type))) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_release(slu, it,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto SBD_UA_REGISTRATIONS_PREEMPTED);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (void) sbd_pgr_remove_keys(slu, it, key, 0, B_FALSE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_reserve(pgr, key, it, ses, pr_out);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_remove_keys(slu, it, key, svc_key, B_TRUE)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_meta_write(slu) != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INSUFFICIENT_REG_RESOURCES);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_PRgeneration++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pr_out->action == PR_OUT_PREEMPT_ABORT) {
44b678cf2da3f50fd1480d10c64ed703851e44efNattuvetty Bhavyan stmf_abort(STMF_QUEUE_ABORT_LU, task, STMF_ABORTED,
44b678cf2da3f50fd1480d10c64ed703851e44efNattuvetty Bhavyan (void *)slu->sl_lu);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
44b678cf2da3f50fd1480d10c64ed703851e44efNattuvetty Bhavyan stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetostatic void
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_out_register_and_move(scsi_task_t *task, stmf_data_buf_t *dbuf)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_lu_t *slu = (sbd_lu_t *)task->task_lu->lu_provider_private;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it = task->task_lu_itl_handle;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_t *pgr = slu->sl_pgr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key = it->pgr_key_ptr;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan scsi_devid_desc_t *lpt;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan stmf_remote_port_t rport;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *newkey;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto scsi_prout_reg_move_plist_t *plist;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint8_t *buf, lpt_len;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint16_t tpd_len;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan uint32_t adn_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint64_t svc_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /*
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * Check whether the key holds the reservation or current reservation
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto * is of type all registrants.
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_rsvholder != key) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_RESERVATION_CONFLICT, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto buf = dbuf->db_sglist[0].seg_addr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto plist = (scsi_prout_reg_move_plist_t *)buf;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto svc_key = READ_SCSI64(plist->service_key, uint64_t);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (svc_key == 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt = stmf_scsilib_get_devid_desc(READ_SCSI16(plist->rel_tgt_port_id,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto uint16_t));
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (lpt == NULL) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_CDB);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan adn_len = READ_SCSI32(plist->tptid_len, uint32_t);
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (!stmf_scsilib_tptid_validate(
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan (scsi_transport_id_t *)plist->tptid, adn_len, &tpd_len)) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(lpt, sizeof (scsi_devid_desc_t) + lpt->ident_length);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_PARAM_LIST);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rport.rport_tptid = (scsi_transport_id_t *)plist->tptid;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan rport.rport_tptid_sz = tpd_len;
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan if (sbd_pgr_key_compare(key, lpt, &rport)) {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(lpt, sizeof (scsi_devid_desc_t) + lpt->ident_length);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INVALID_FIELD_IN_PARAM_LIST);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan newkey = sbd_pgr_key_registered(pgr, lpt, &rport);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (newkey) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Set the pgr_key, irrespective of what it currently holds */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto newkey->pgr_key = svc_key;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* all_tg_pt is set for found key, copy lpt info to the key */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (newkey->pgr_key_flags & SBD_PGR_KEY_ALL_TG_PT) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (newkey->pgr_key_lpt_id &&
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto newkey->pgr_key_lpt_len > 0) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_free(newkey->pgr_key_lpt_id,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto newkey->pgr_key_lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan lpt_len = sizeof (scsi_devid_desc_t) +
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto lpt->ident_length;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto newkey->pgr_key_lpt_len = lpt_len;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto newkey->pgr_key_lpt_id = (scsi_devid_desc_t *)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto kmem_zalloc(lpt_len, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto bcopy(lpt, newkey->pgr_key_lpt_id, lpt_len);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan /* No IT nexus information, hence set PGR_CHEK flag */
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan sbd_pgr_set_pgr_check_flag(slu, B_TRUE);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto } else {
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan newkey = sbd_pgr_do_register(slu, NULL, lpt, &rport,
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan SBD_PGR_KEY_TPT_ID_FLAG, svc_key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
716c180559045549271833327182dc6a266134f1Nattuvetty Bhavyan kmem_free(lpt, sizeof (scsi_devid_desc_t) + lpt->ident_length);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Now reserve the key corresponding to the specified IT nexus */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_rsvholder = newkey;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (plist->unreg) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_do_unregister(slu, it, key);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto /* Write to disk if currenty aptpl is set or given task is setting it */
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (pgr->pgr_flags & SBD_PGR_APTPL || plist->aptpl) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (plist->aptpl)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_SET_FLAG(pgr->pgr_flags, SBD_PGR_APTPL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto else
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto PGR_CLEAR_FLAG(pgr->pgr_flags, SBD_PGR_APTPL);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (sbd_pgr_meta_write(slu) != SBD_SUCCESS) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_CHECK,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto STMF_SAA_INSUFFICIENT_REG_RESOURCES);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto pgr->pgr_PRgeneration++;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto stmf_scsilib_send_status(task, STATUS_GOOD, 0);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetovoid
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_pgr_remove_it_handle(sbd_lu_t *sl, sbd_it_data_t *my_it) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_it_data_t *it;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_enter(&sl->sl_pgr->pgr_lock, RW_WRITER);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_enter(&sl->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto for (it = sl->sl_it_list; it != NULL; it = it->sbd_it_next) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it == my_it) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (it->pgr_key_ptr) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sbd_pgr_key_t *key = it->pgr_key_ptr;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto if (key->pgr_key_it == it) {
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto key->pgr_key_it = NULL;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_pgr->pgr_flags &=
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto ~SBD_PGR_ALL_KEYS_HAS_IT;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto break;
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto }
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto mutex_exit(&sl->sl_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto rw_exit(&sl->sl_pgr->pgr_lock);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetochar *
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szetosbd_get_devid_string(sbd_lu_t *sl)
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto{
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto char *str = (char *)kmem_zalloc(33, KM_SLEEP);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto (void) snprintf(str, 33,
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_device_id[4], sl->sl_device_id[5], sl->sl_device_id[6],
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_device_id[7], sl->sl_device_id[8], sl->sl_device_id[9],
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_device_id[10], sl->sl_device_id[11], sl->sl_device_id[12],
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_device_id[13], sl->sl_device_id[14], sl->sl_device_id[15],
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_device_id[16], sl->sl_device_id[17], sl->sl_device_id[18],
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto sl->sl_device_id[19]);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto return (str);
8fe960854f0d52e2e8a80ba68e8621a5ac6a866dtim szeto}