ctl_backend.c revision 268678
1229997Sken/*- 2229997Sken * Copyright (c) 2003 Silicon Graphics International Corp. 3229997Sken * All rights reserved. 4229997Sken * 5229997Sken * Redistribution and use in source and binary forms, with or without 6229997Sken * modification, are permitted provided that the following conditions 7229997Sken * are met: 8229997Sken * 1. Redistributions of source code must retain the above copyright 9229997Sken * notice, this list of conditions, and the following disclaimer, 10229997Sken * without modification. 11229997Sken * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12229997Sken * substantially similar to the "NO WARRANTY" disclaimer below 13229997Sken * ("Disclaimer") and any redistribution must be conditioned upon 14229997Sken * including a substantially similar Disclaimer requirement for further 15229997Sken * binary redistribution. 16229997Sken * 17229997Sken * NO WARRANTY 18229997Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19229997Sken * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20229997Sken * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21229997Sken * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22229997Sken * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23229997Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24229997Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25229997Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26229997Sken * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27229997Sken * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28229997Sken * POSSIBILITY OF SUCH DAMAGES. 29229997Sken * 30229997Sken * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_backend.c#3 $ 31229997Sken */ 32229997Sken/* 33229997Sken * CTL backend driver registration routines 34229997Sken * 35229997Sken * Author: Ken Merry <ken@FreeBSD.org> 36229997Sken */ 37229997Sken 38229997Sken#include <sys/cdefs.h> 39229997Sken__FBSDID("$FreeBSD: stable/10/sys/cam/ctl/ctl_backend.c 268678 2014-07-15 16:58:38Z mav $"); 40229997Sken 41229997Sken#include <sys/param.h> 42229997Sken#include <sys/systm.h> 43229997Sken#include <sys/kernel.h> 44229997Sken#include <sys/types.h> 45229997Sken#include <sys/malloc.h> 46229997Sken#include <sys/lock.h> 47229997Sken#include <sys/mutex.h> 48229997Sken#include <sys/condvar.h> 49229997Sken#include <sys/queue.h> 50233963Sken#include <sys/sysctl.h> 51229997Sken 52229997Sken#include <cam/scsi/scsi_all.h> 53229997Sken#include <cam/scsi/scsi_da.h> 54229997Sken#include <cam/ctl/ctl_io.h> 55229997Sken#include <cam/ctl/ctl.h> 56229997Sken#include <cam/ctl/ctl_frontend.h> 57229997Sken#include <cam/ctl/ctl_backend.h> 58229997Sken#include <cam/ctl/ctl_frontend_internal.h> 59229997Sken#include <cam/ctl/ctl_ioctl.h> 60229997Sken#include <cam/ctl/ctl_ha.h> 61229997Sken#include <cam/ctl/ctl_private.h> 62229997Sken#include <cam/ctl/ctl_debug.h> 63229997Sken 64229997Skenextern struct ctl_softc *control_softc; 65229997Sken 66229997Skenint 67229997Skenctl_backend_register(struct ctl_backend_driver *be) 68229997Sken{ 69229997Sken struct ctl_softc *ctl_softc; 70229997Sken struct ctl_backend_driver *be_tmp; 71229997Sken 72229997Sken ctl_softc = control_softc; 73229997Sken 74229997Sken mtx_lock(&ctl_softc->ctl_lock); 75229997Sken /* 76229997Sken * Sanity check, make sure this isn't a duplicate registration. 77229997Sken */ 78229997Sken STAILQ_FOREACH(be_tmp, &ctl_softc->be_list, links) { 79229997Sken if (strcmp(be_tmp->name, be->name) == 0) { 80229997Sken mtx_unlock(&ctl_softc->ctl_lock); 81229997Sken return (-1); 82229997Sken } 83229997Sken } 84229997Sken mtx_unlock(&ctl_softc->ctl_lock); 85229997Sken 86229997Sken /* 87229997Sken * Call the backend's initialization routine. 88229997Sken */ 89229997Sken be->init(); 90229997Sken 91229997Sken mtx_lock(&ctl_softc->ctl_lock); 92229997Sken 93229997Sken STAILQ_INSERT_TAIL(&ctl_softc->be_list, be, links); 94229997Sken 95229997Sken ctl_softc->num_backends++; 96229997Sken 97229997Sken /* 98229997Sken * Don't want to increment the usage count for internal consumers, 99229997Sken * we won't be able to unload otherwise. 100229997Sken */ 101229997Sken /* XXX KDM find a substitute for this? */ 102229997Sken#if 0 103229997Sken if ((be->flags & CTL_BE_FLAG_INTERNAL) == 0) 104229997Sken MOD_INC_USE_COUNT; 105229997Sken#endif 106229997Sken 107229997Sken#ifdef CS_BE_CONFIG_MOVE_DONE_IS_NOT_USED 108229997Sken be->config_move_done = ctl_config_move_done; 109229997Sken#endif 110229997Sken /* XXX KDM fix this! */ 111229997Sken be->num_luns = 0; 112229997Sken#if 0 113229997Sken atomic_set(&be->num_luns, 0); 114229997Sken#endif 115229997Sken 116229997Sken mtx_unlock(&ctl_softc->ctl_lock); 117229997Sken 118229997Sken return (0); 119229997Sken} 120229997Sken 121229997Skenint 122229997Skenctl_backend_deregister(struct ctl_backend_driver *be) 123229997Sken{ 124229997Sken struct ctl_softc *ctl_softc; 125229997Sken 126229997Sken ctl_softc = control_softc; 127229997Sken 128229997Sken mtx_lock(&ctl_softc->ctl_lock); 129229997Sken 130229997Sken#if 0 131229997Sken if (atomic_read(&be->num_luns) != 0) { 132229997Sken#endif 133229997Sken /* XXX KDM fix this! */ 134229997Sken if (be->num_luns != 0) { 135229997Sken mtx_unlock(&ctl_softc->ctl_lock); 136229997Sken return (-1); 137229997Sken } 138229997Sken 139229997Sken STAILQ_REMOVE(&ctl_softc->be_list, be, ctl_backend_driver, links); 140229997Sken 141229997Sken ctl_softc->num_backends--; 142229997Sken 143229997Sken /* XXX KDM find a substitute for this? */ 144229997Sken#if 0 145229997Sken if ((be->flags & CTL_BE_FLAG_INTERNAL) == 0) 146229997Sken MOD_DEC_USE_COUNT; 147229997Sken#endif 148229997Sken 149229997Sken mtx_unlock(&ctl_softc->ctl_lock); 150229997Sken 151229997Sken return (0); 152229997Sken} 153229997Sken 154229997Skenstruct ctl_backend_driver * 155229997Skenctl_backend_find(char *backend_name) 156229997Sken{ 157229997Sken struct ctl_softc *ctl_softc; 158229997Sken struct ctl_backend_driver *be_tmp; 159229997Sken 160229997Sken ctl_softc = control_softc; 161229997Sken 162229997Sken mtx_lock(&ctl_softc->ctl_lock); 163229997Sken 164229997Sken STAILQ_FOREACH(be_tmp, &ctl_softc->be_list, links) { 165229997Sken if (strcmp(be_tmp->name, backend_name) == 0) { 166229997Sken mtx_unlock(&ctl_softc->ctl_lock); 167229997Sken return (be_tmp); 168229997Sken } 169229997Sken } 170229997Sken 171229997Sken mtx_unlock(&ctl_softc->ctl_lock); 172229997Sken 173229997Sken return (NULL); 174229997Sken} 175229997Sken 176268143Smavvoid 177268678Smavctl_init_opts(ctl_options_t *opts, int num_args, struct ctl_be_arg *args) 178268143Smav{ 179268678Smav struct ctl_option *opt; 180268143Smav int i; 181268143Smav 182268678Smav STAILQ_INIT(opts); 183268678Smav for (i = 0; i < num_args; i++) { 184268143Smav opt = malloc(sizeof(*opt), M_CTL, M_WAITOK); 185268678Smav opt->name = malloc(strlen(args[i].kname) + 1, M_CTL, M_WAITOK); 186268678Smav strcpy(opt->name, args[i].kname); 187268678Smav opt->value = malloc(strlen(args[i].kvalue) + 1, M_CTL, M_WAITOK); 188268678Smav strcpy(opt->value, args[i].kvalue); 189268678Smav STAILQ_INSERT_TAIL(opts, opt, links); 190268143Smav } 191268143Smav} 192268143Smav 193268143Smavvoid 194268678Smavctl_free_opts(ctl_options_t *opts) 195268143Smav{ 196268678Smav struct ctl_option *opt; 197268143Smav 198268678Smav while ((opt = STAILQ_FIRST(opts)) != NULL) { 199268678Smav STAILQ_REMOVE_HEAD(opts, links); 200268143Smav free(opt->name, M_CTL); 201268143Smav free(opt->value, M_CTL); 202268143Smav free(opt, M_CTL); 203268143Smav } 204268143Smav} 205268143Smav 206268143Smavchar * 207268678Smavctl_get_opt(ctl_options_t *opts, const char *name) 208268143Smav{ 209268678Smav struct ctl_option *opt; 210268143Smav 211268678Smav STAILQ_FOREACH(opt, opts, links) { 212268143Smav if (strcmp(opt->name, name) == 0) { 213268143Smav return (opt->value); 214268143Smav } 215268143Smav } 216268143Smav return (NULL); 217268143Smav} 218