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#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "tlm.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "tlm_proto.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern tlm_chain_link_t *tlm_un_ref(tlm_chain_link_t *old_top,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *link);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic tlm_info_t tlm_info;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Mutex for concurrent access to job_stats
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmutex_t jstat_mtx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get the number of libraries
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_library_count(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int lib;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (lib = 1; lib <= tlm_info.ti_library_count; lib++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library = tlm_library(lib);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (library != NULL &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_drive_count == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (tlm_info.ti_library_count);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get the library whose number matches
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_library_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_library(int lib)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library = tlm_info.ti_library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (library != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (library->tl_number == lib) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (library);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library = library->tl_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar errno = TLM_ERROR_RANGE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get the info about this drive
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_drive_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_drive(int lib, int drv)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_drive_t *drive;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library = tlm_library(lib);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (library == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar drive = library->tl_drive;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (drive != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (drv == drive->td_number) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (drive);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar drive = drive->td_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get the info about this slot
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_slot_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_slot(int lib, int slt)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_slot_t *slot = NULL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library = tlm_library(lib);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (library != NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar slot = library->tl_slot;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (slot != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (slt == slot->ts_number) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (slot);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar slot = slot->ts_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * add a link to the INFO chain
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_job_stats_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_new_job_stats(char *name)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *new_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_job_stats_t *job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link = ndmp_malloc(sizeof (tlm_chain_link_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (new_link == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar job_stats = ndmp_malloc(sizeof (tlm_job_stats_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (job_stats == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(new_link);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link->tc_ref_count = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link->tc_data = (void *)job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(job_stats->js_job_name, name, TLM_MAX_BACKUP_JOB_NAME);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (tlm_info.ti_job_stats == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link->tc_next = new_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link->tc_prev = new_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *next_link = tlm_info.ti_job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *prev_link = next_link->tc_prev;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link->tc_next = next_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_link->tc_prev = prev_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar prev_link->tc_next = new_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar next_link->tc_prev = new_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_info.ti_job_stats = new_link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (job_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * make sure this Job Stats buffer is not deleted while we use it
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_job_stats_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_ref_job_stats(char *name)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar static tlm_job_stats_t fake_job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link = tlm_info.ti_job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (link == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * our tables are empty
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (&fake_job_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_job_stats_t *job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar job_stats = (tlm_job_stats_t *)link->tc_data;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(job_stats->js_job_name, name) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link->tc_ref_count++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (job_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link = link->tc_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (link != tlm_info.ti_job_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "TAPE BACKUP> Ref for job [%s] was not found", name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (&fake_job_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * remove a link to the INFO chain
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_un_ref_job_stats(char *name)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *link;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link = tlm_info.ti_job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (link == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "TAPE BACKUP>"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar " Internal error for job [%s], could not delete", name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_job_stats_t *job_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar job_stats = (tlm_job_stats_t *)link->tc_data;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(job_stats->js_job_name, name) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_info.ti_job_stats =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_un_ref(tlm_info.ti_job_stats, link);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link = link->tc_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (link != tlm_info.ti_job_stats);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&jstat_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "TAPE BACKUP> Delete for job [%s] was not found", name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * one party does not care about this blob, can we let it go?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_chain_link_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_un_ref(tlm_chain_link_t *old_top, tlm_chain_link_t *link)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *chain_link = old_top;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *new_top;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * count down the number of
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * interested parties for this blob
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link->tc_ref_count--;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (link->tc_ref_count > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * there is still interest in this blob,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * no change yet
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * returning "old_top" means there is no change in the links
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (old_top);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * no one cares about this data anymore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * find out how to delete it
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (chain_link == link) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_chain_link_t *prev;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If there are one or two elements in the list, then
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the prev and next pointers point to one element in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the list, the element itself and the other element
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * correspondingly. So we must distinguish if there
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are only one or two elements in the list. If
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * either of the 'prev' or 'next' pointers point to
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the link itself, then we have only one element in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (link->tc_next == link->tc_prev &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar link->tc_next == link) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * there is only this one link in the chain
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * delete this and the chain is empty
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_top = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new_top = link->tc_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar next = link->tc_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar prev = link->tc_prev;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar prev->tc_next = next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar next->tc_prev = prev;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(link->tc_data);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(link);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (new_top);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar chain_link = chain_link->tc_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (chain_link != old_top);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "TAPE BACKUP> un_ref target not found.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (old_top);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the following section is global, but not really part of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * public interface. Use of this outside of the tlm_*.c files
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is for special cases only.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * add a new tape library data blob to the list of libraries
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * returns the new tape library data blob just created
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_insert_new_library(scsi_link_t *slink)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t **p_library = &tlm_info.ti_library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library = ndmp_malloc(sizeof (tlm_library_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p_library != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p_library = &(*p_library)->tl_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_info.ti_library_count++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_number = tlm_info.ti_library_count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_slink = slink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_capability_robot = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p_library = library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (library->tl_number);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * add a new tape drive data blob to the list of drives in a library
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * returns the new tape drive data blob just created
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_insert_new_drive(int lib)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library = tlm_library(lib);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_drive_t *drive = ndmp_malloc(sizeof (tlm_drive_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_drive_t **p_drive = &library->tl_drive;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p_drive != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p_drive = &(*p_drive)->td_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_drive_count++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_capability_drives = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar drive->td_library = library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar drive->td_number = library->tl_drive_count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p_drive = drive;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (drive->td_number);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * add a new tape slot data blob to the list of slots in a library
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * returns the new tape slot data blob just created
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartlm_insert_new_slot(int lib)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_library_t *library = tlm_library(lib);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_slot_t *slot = ndmp_malloc(sizeof (tlm_slot_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_slot_t **p_slot = &library->tl_slot;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*p_slot != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p_slot = &(*p_slot)->ts_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_slot_count++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar library->tl_capability_slots = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar slot->ts_library = library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar slot->ts_number = library->tl_slot_count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p_slot = slot;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (slot->ts_number);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}