2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Use is subject to license terms.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 2007, The Storage Networking Industry Association. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ctype.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <fcntl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd_common.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <string.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/scsi/impl/uscsi.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/scsi/scsi.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void scsi_open_send_reply(ndmp_connection_t *connection, int err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void common_open(ndmp_connection_t *connection, char *devname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void common_set_target(ndmp_connection_t *connection, char *device,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ushort_t controller, ushort_t sid, ushort_t lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V2 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_open_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler opens the specified SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_open_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_open_request_v2 *request = (ndmp_scsi_open_request_v2 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar common_open(connection, request->device.name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_close_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler closes the currently open SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_close_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_close_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_scsi.sd_is_open == -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "SCSI device is not open.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEV_NOT_OPEN_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_close reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_open_list_del(session->ns_scsi.sd_adapter_name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_sid,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_scsi.sd_devid);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_is_open = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_devid = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_sid = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_lun = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_valid_target_set = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset(session->ns_scsi.sd_adapter_name, 0,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (session->ns_scsi.sd_adapter_name));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_close reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_get_state_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler returns state information for the currently open SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Since the implementation only supports the opening of a specific SCSI
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * device, as opposed to a device that can talk to multiple SCSI targets,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * this request is not supported. This request is only appropriate for
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * implementations that support device files that can target multiple
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SCSI devices.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_get_state_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_get_state_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_scsi.sd_is_open == -1)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEV_NOT_OPEN_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (!session->ns_scsi.sd_valid_target_set) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.target_controller = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.target_id = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.target_lun = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.target_controller = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.target_id = session->ns_scsi.sd_sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.target_lun = session->ns_scsi.sd_lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_get_state reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_set_target_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler sets the SCSI target of the SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * It is only valid to use this request if the opened SCSI device
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is capable of talking to multiple SCSI targets.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Since the implementation only supports the opening of a specific SCSI
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * device, as opposed to a device that can talk to multiple SCSI targets,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * this request is not supported. This request is only appropriate for
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * implementations that support device files that can target multiple
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SCSI devices.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_set_target_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_set_target_request_v2 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_scsi_set_target_request_v2 *) body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar common_set_target(connection, request->device.name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->target_controller, request->target_id,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->target_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_reset_device_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler resets the currently targeted SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_reset_device_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_reset_device_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct uscsi_cmd cmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_scsi.sd_devid == -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "SCSI device is not open.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEV_NOT_OPEN_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&cmd, 0, sizeof (cmd));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_flags |= USCSI_RESET;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ioctl(session->ns_scsi.sd_devid, USCSICMD, &cmd) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "USCSI reset failed: %m.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ioctl(USCSICMD) USCSI_RESET failed: %m.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_IO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_reset_device reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_reset_bus_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler resets the currently targeted SCSI bus.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request not yet supported.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_reset_bus_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_reset_bus_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "request not supported");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_SUPPORTED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_reset_bus reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_execute_cdb_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler sends the CDB to the currently targeted SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_execute_cdb_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_execute_cdb_request *request = (ndmp_execute_cdb_request *) body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_execute_cdb_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_scsi.sd_is_open == -1 ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar !session->ns_scsi.sd_valid_target_set) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void *) &reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "SCSI device is not open.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEV_NOT_OPEN_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_execute_cdb reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_execute_cdb(session, session->ns_scsi.sd_adapter_name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_sid, session->ns_scsi.sd_lun, request);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V3 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_open_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler opens the specified SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_open_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_open_request_v3 *request = (ndmp_scsi_open_request_v3 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar common_open(connection, request->device);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_scsi_set_target_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This handler sets the SCSI target of the SCSI device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * It is only valid to use this request if the opened SCSI device
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is capable of talking to multiple SCSI targets.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_scsi_set_target_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_set_target_request_v3 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_scsi_set_target_request_v3 *) body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar common_set_target(connection, request->device,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->target_controller, request->target_id,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->target_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V4 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LOCALS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * scsi_open_send_reply
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send a reply for SCSI open command
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * err (input) - ndmp error code
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarscsi_open_send_reply(ndmp_connection_t *connection, int err)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_open_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply, "sending scsi_open reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * common_open
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Common SCSI open function for all NDMP versions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * devname (input) - device name to open.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcommon_open(ndmp_connection_t *connection, char *devname)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char adptnm[SCSI_MAX_NAME];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int sid, lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_adapter_t *sa;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int devid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_tape.td_fd != -1 || session->ns_scsi.sd_is_open != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Session already has a tape or scsi device open.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_DEVICE_OPENED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if ((sa = scsi_get_adapter(0)) != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Adapter device found: %s", devname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(adptnm, devname, SCSI_MAX_NAME-2);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar adptnm[SCSI_MAX_NAME-1] = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sid = lun = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_find_sid_lun(sa, devname, &sid, &lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_open_list_find(devname, sid, lun) == NULL &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (devid = open(devname, O_RDWR | O_NDELAY)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Failed to open device %s: %m.",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar devname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_NO_DEVICE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "%s: No such SCSI adapter.", devname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_NO_DEVICE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_open_send_reply(connection, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (ndmp_open_list_add(connection, adptnm, sid, lun, devid)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 0:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* OK */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case EBUSY:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_DEVICE_BUSY_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case ENOMEM:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_NO_MEM_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = NDMP_IO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_open_send_reply(connection, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(session->ns_scsi.sd_adapter_name, adptnm, SCSI_MAX_NAME);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_is_open = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_devid = devid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sid != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_sid = sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_lun = lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_valid_target_set = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_sid = session->ns_scsi.sd_lun = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_valid_target_set = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_open_send_reply(connection, err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * common_set_target
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set the SCSI target (SCSI number, LUN number, controller number)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * device (input) - device name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * controller (input) - controller number.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sid (input) - SCSI target ID.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * lun (input) - LUN number.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcommon_set_target(ndmp_connection_t *connection, char *device,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ushort_t controller, ushort_t sid, ushort_t lun)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_set_target_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_scsi.sd_is_open == -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEV_NOT_OPEN_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!scsi_dev_exists(session->ns_scsi.sd_adapter_name, sid,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar lun)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "No such SCSI device: target %d lun %d.",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sid, lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_DEVICE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar type = scsi_get_devtype(session->ns_scsi.sd_adapter_name, sid,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (type != DTYPE_SEQUENTIAL && type != DTYPE_CHANGER) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Not a tape or robot device: target %d lun %d.",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sid, lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_set_target reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The open_list must be updated if the SID or LUN are going to be
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * changed. Close uses the same SID & LUN for removing the entry
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * from the open_list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sid != session->ns_scsi.sd_sid || lun != session->ns_scsi.sd_lun) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (ndmp_open_list_add(connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_adapter_name, sid, lun, 0)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 0:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_open_list_del(session->
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ns_scsi.sd_adapter_name, session->ns_scsi.sd_sid,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case EBUSY:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEVICE_BUSY_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case ENOMEM:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_MEM_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_IO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Updated sid %d lun %d", sid, lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_sid = sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_lun = lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_scsi.sd_valid_target_set = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending scsi_set_target reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * scsi_find_sid_lun
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * gets the adapter, and returns the sid and lun number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarscsi_find_sid_lun(scsi_adapter_t *sa, char *devname, int *sid, int *lun)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_link_t *sl;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (sl = sa->sa_link_head.sl_next; sl && sl != &sa->sa_link_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sl = sl->sl_next) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar name = sasd_slink_name(sl);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(devname, name) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *sid = sl->sl_sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *lun = sl->sl_lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *sid = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *lun = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}