2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
e461e790745fa2b2374e5734984107c7672c6c49Randall Ralphs * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens * Copyright (c) 2015 by Delphix. All rights reserved.
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#ifndef _TLM_H_
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define _TLM_H_
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <synch.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <limits.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <cstack.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/acl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <fcntl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <strings.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/stat.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <time.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/queue.h>
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#include <sys/fs/zfs.h>
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#include <libzfs.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define IS_SET(f, m) (((f) & (m)) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_BACKUP_JOB_NAME 32 /* max size of a job's name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TAPE_BUFFERS 10 /* number of rotating tape buffers */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_LINE_SIZE 128 /* size of text messages */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_BACKUP_RUN 0x00000001
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_RESTORE_RUN 0x00000002
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_STOP 0x00000009 /* graceful stop */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_ABORT 0x99999999 /* abandon the run */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_EXTRA_SPACE 64
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_PATH_NAME (PATH_MAX + TLM_EXTRA_SPACE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ENTRYTYPELEN 14
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define PERMS 4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ID_STR_MAX 20
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define APPENDED_ID_MAX (ID_STR_MAX + 1)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ACL_ENTRY_SIZE (ENTRYTYPELEN + ID_STR_MAX + PERMS + APPENDED_ID_MAX)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_ACL_TXT MAX_ACL_ENTRIES * ACL_ENTRY_SIZE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* operation flags */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_OP_CHOOSE_ARCHIVE 0x00000001 /* look for archive bit */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Synchronization flags used when launching the TLM threads.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TAPE_READER 0x00000001
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TAPE_WRITER 0x00000002
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SOCK_READER 0x00000004
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SOCK_WRITER 0x00000008
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_BUF_READER 0x00000010
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_BUF_WRITER 0x00000020
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TAR_READER 0x00000040
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TAR_WRITER 0x00000080
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#define SCSI_SERIAL_PAGE 0x80
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#define SCSI_DEVICE_IDENT_PAGE 0x83
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#define SCMD_READ_ELEMENT_STATUS 0xB8
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar#define OCTAL7CHAR 07777777
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar#define SYSATTR_RDONLY "SUNWattr_ro"
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar#define SYSATTR_RW "SUNWattr_rw"
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef int (*func_t)();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdartypedef struct scsi_serial {
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar int sr_flags;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar char sr_num[16];
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar} scsi_serial_t;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct fs_fhandle {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int fh_fid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *fh_fpath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} fs_fhandle_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct scsi_link {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_link *sl_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_link *sl_prev;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_adapter *sl_sa;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int sl_sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int sl_lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int sl_requested_max_active;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int sl_granted_max_active;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int sl_n_active;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int sl_type; /* SCSI device type */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} scsi_link_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct scsi_adapter {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_adapter *sa_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char sa_name[16];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_link sa_link_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} scsi_adapter_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct sasd_drive {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char sd_name[256];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char sd_vendor[8 + 1];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char sd_id[16 + 1];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char sd_rev[4 + 1];
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar char sd_serial[16 + 1];
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar char sd_wwn[32 + 1];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} sasd_drive_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct scsi_sasd_drive {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sasd_drive_t ss_sd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar scsi_link_t ss_slink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} scsi_sasd_drive_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define DEFAULT_SLINK_MAX_XFER (64*1024)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_info {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ti_init_done; /* initialization done ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ti_library_count; /* number of libraries */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_library *ti_library; /* first in chain */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_chain_link *ti_job_stats; /* chain of job statistics */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_info_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_chain_link {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_chain_link *tc_next; /* next blob of statistics */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_chain_link *tc_prev; /* previous blob in the chain */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tc_ref_count; /* number of routines */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar void *tc_data; /* the data blob */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_chain_link_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_robot {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_robot *tr_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_library *tr_library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tr_number;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_robot_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_drive {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_drive *td_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_library *td_library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char td_job_name[TLM_MAX_BACKUP_JOB_NAME];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int td_number; /* number of this tape drive */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int td_element; /* the library's number for the drive */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_link *td_slink; /* because the drive may be connected */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* to a different SCSI card than the */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* library */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar short td_scsi_id;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar short td_lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar short td_volume_number; /* for current job */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* an index into the tape set */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int td_fd; /* I/O file descriptor */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int td_errno; /* system error number */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long td_exists : 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_drive_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_slot {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_slot *ts_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_library *ts_library;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ts_number; /* number of this slot */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ts_element;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar short ts_use_count; /* number of times used since loaded */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long ts_status_full : 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_slot_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_library {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_library *tl_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tl_number; /* number of this tape library */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long tl_capability_robot : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_capability_door : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_capability_lock : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_capability_slots : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_capability_export : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_capability_drives : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_capability_barcodes : 1,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tl_ghost_drives : 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * "ghost_drives" is used to make sure that
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * all drives claimed by the library really
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * exist ... libraries have been known to lie.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_link *tl_slink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tl_robot_count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_robot_t *tl_robot;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tl_drive_count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_drive_t *tl_drive;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tl_slot_count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_slot_t *tl_slot;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_library_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdartypedef struct {
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#ifdef _BIG_ENDIAN
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t di_peripheral_qual : 3,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar di_peripheral_dev_type : 5;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t di_page_code;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint16_t di_page_length;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#else
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t di_peripheral_dev_type : 5,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar di_peripheral_qual : 3;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t di_page_code;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint16_t di_page_length;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#endif
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar} device_ident_header_t;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdartypedef struct {
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#ifdef _BIG_ENDIAN
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_proto_ident : 4,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ni_code_set : 4;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_PIV : 1,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar : 1,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ni_asso : 2,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ni_ident_type : 4;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_reserved;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_ident_length;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#else
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_code_set : 4,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ni_proto_ident : 4;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_ident_type : 4,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ni_asso : 2,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar : 1,
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar ni_PIV : 1;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_reserved;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar uint8_t ni_ident_length;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar#endif
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar} name_ident_t;
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_ERRORS 0x00000000
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_ERROR_BUSY 0x00000001
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_ERROR_INTERNAL 0x00000002
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_ERROR_NO_ROBOTS 0x00000003
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TIMEOUT 0x00000004
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_ERROR_RANGE 0x00000005
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_EMPTY 0x00000006
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_DRIVE_NOT_ASSIGNED 0x00000007
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_TAPE_NAME 0x00000008
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_BACKUP_DIR 0x00000009
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_BACKUP_HARDWARE 0x0000000a
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_SOURCE_FILE 0x0000000b
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_FREE_TAPES 0x0000000c
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_EOT 0x0000000d
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SERIAL_NOT_FOUND 0x0000000e
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SMALL_READ 0x0000000f
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_RESTORE_FILE 0x00000010
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_EOF 0x00000011
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_DIRECTORY 0x00000012
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_MEMORY 0x00000013
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_WRITE_ERROR 0x00000014
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NO_SCRATCH_SPACE 0x00000015
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_INVALID 0x00000016
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MOVE 0x00000017
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SKIP 0x00000018
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_OPEN_ERR 0x00000019
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_TAPE_DRIVES 16
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_NAME_SIZE 100
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_TAR_IMAGE 017777777770
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_VOLNAME_MAX_LENGTH 255
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NAME_MAX 255
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAGIC "ustar "
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SNAPSHOT_PREFIX ".zfs"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_SNAPSHOT_DIR ".zfs/snapshot"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define RECORDSIZE 512
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NAMSIZ 100
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_tar_hdr {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_name[TLM_NAME_SIZE];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_mode[8];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_uid[8];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_gid[8];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_size[12];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_mtime[12];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_chksum[8];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_linkflag;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_linkname[TLM_NAME_SIZE];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_magic[8];
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar char th_uname[32];
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar char th_gname[32];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar union {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_devmajor[8];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_devminor[8];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } th_dev;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char th_hlink_ino[12];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } th_shared;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_tar_hdr_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The linkflag defines the type of file
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_OLDNORMAL '\0' /* Normal disk file, Unix compat */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_NORMAL '0' /* Normal disk file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_LINK '1' /* Link to previously dumped file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_SYMLINK '2' /* Symbolic link */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_CHR '3' /* Character special file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_BLK '4' /* Block special file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_DIR '5' /* Directory */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_FIFO '6' /* FIFO special file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_CONTIG '7' /* Contiguous file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Further link types may be defined later. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_DUMPDIR 'D'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is a dir entry that contains
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the names of files that were in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the dir at the time the dump
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * was made
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_HUMONGUS 'H'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Identifies the NEXT file on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as a HUGE file
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_LONGLINK 'K'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Identifies the NEXT file on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as having a long linkname
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_LONGNAME 'L'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Identifies the NEXT file on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as having a long name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_MULTIVOL 'M'
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is the continuation
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * of a file that began on another
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * volume
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_VOLHDR 'V' /* This file is a tape/volume header */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Ignore it on extraction */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_ACL 'A' /* Access Control List */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_XATTR 'E' /* Extended attribute */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define KILOBYTE 1024
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ACL support structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct sec_attr {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char attr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char attr_len[7];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char attr_info[TLM_MAX_ACL_TXT];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} sec_attr_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tlm_acls {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int acl_checkpointed : 1, /* are checkpoints active ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar acl_clear_archive : 1, /* clear archive bit ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar acl_overwrite : 1, /* always overwrite ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar acl_update : 1, /* only update ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar acl_non_trivial : 1; /* real ACLs? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The following fields are here to allow
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the backup reader to open a file one time
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and keep the information for ACL, ATTRs,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and reading the file.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sec_attr_t acl_info;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char acl_root_dir[TLM_VOLNAME_MAX_LENGTH]; /* name of root filesystem */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_fhandle_t acl_dir_fh; /* parent dir's info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_fhandle_t acl_fil_fh; /* file's info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 acl_attr; /* file system attributes */
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar char uname[32];
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar char gname[32];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tlm_acls_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Tape manager's data archiving ops vector
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This vector represents the granular operations for
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * performing backup/restore. Each backend should provide
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * such a vector interface in order to be invoked by NDMP
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * server.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The reserved callbacks are kept for different backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * types which are volume-based rather than file-based
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * e.g. zfs send.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct tm_ops {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *tm_name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*tm_putfile)();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*tm_putdir)();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*tm_putvol)(); /* Reserved */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*tm_getfile)();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*tm_getdir)();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*tm_getvol)(); /* Reserved */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} tm_ops_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* The checksum field is filled with this while the checksum is computed. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define CHKBLANKS " " /* 8 blanks, no null */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LONGNAME_PREFIX "././_LoNg_NaMe_"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_log(ulong_t, char *, char *, ...);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar ndmp_log_info[256];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_LOG(p, ...) { \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(ndmp_log_info, \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (ndmp_log_info), \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "[%d][%s:%d]", \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (int)pthread_self(), __func__, __LINE__); \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_log(p, ndmp_log_info, __VA_ARGS__); \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void *ndmp_malloc(size_t size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ZFS metadata plug-in module structures
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ZFS_MAX_PROPS 100
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ZFS_META_MAGIC "ZFSMETA"
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define ZFS_META_MAGIC_EXT "ZFSMETA2"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* Add new major/minor for header changes */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef enum {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar META_HDR_MAJOR_0, /* Original format */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar META_HDR_MAJOR_1, /* Extended format */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_metadata_header_major_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define META_HDR_MAJOR_VERSION META_HDR_MAJOR_1
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef enum {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar META_HDR_MINOR_0,
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_metadata_header_minor_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define META_HDR_MINOR_VERSION META_HDR_MINOR_0
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* To support older backups */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_metadata_property {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char mp_name[NAME_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char mp_value[NAME_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char mp_source[NAME_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_metadata_property_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef struct ndmp_metadata_property_ext {
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char mp_name[ZFS_MAX_DATASET_NAME_LEN];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar char mp_value[ZFS_MAXPROPLEN];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar char mp_source[ZFS_MAXPROPLEN];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_metadata_property_ext_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef struct ndmp_metadata_top_header {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar char th_plname[100];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar uint_t th_plversion;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar char th_magic[10];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar void *th_reserved_1;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar int th_count;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_metadata_top_header_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* Original metadata format */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_metadata_header {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar ndmp_metadata_top_header_t nh_hdr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char nh_dataset[NAME_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_metadata_property_t nh_property[1];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_metadata_header_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* Extended metadata format */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef struct ndmp_metadata_header_ext {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar ndmp_metadata_top_header_t nh_hdr;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char nh_dataset[ZFS_MAX_DATASET_NAME_LEN];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar int32_t nh_total_bytes;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar int32_t nh_major;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar int32_t nh_minor;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar ndmp_metadata_property_ext_t nh_property[1];
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_metadata_header_ext_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define nh_plname nh_hdr.th_plname
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define nh_plversion nh_hdr.th_plversion
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define nh_magic nh_hdr.th_magic
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define nh_count nh_hdr.th_count
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef struct ndmp_metadata_handle {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar void *ml_handle;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar int32_t ml_quota_prop;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar union {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar ndmp_metadata_header_t *u_hdr;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar ndmp_metadata_header_ext_t *u_xhdr;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar } ml_hdr_u;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_metadata_handle_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define ml_hdr ml_hdr_u.u_hdr
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar#define ml_xhdr ml_hdr_u.u_xhdr
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Node in struct hardlink_q
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * inode: the inode of the hardlink
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path: the name of the hardlink, used during restore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * offset: tape offset of the data records for the hardlink, used during backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is_tmp: indicate whether the file was created temporarily for restoring
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * other links during a non-DAR partial restore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct hardlink_node {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned long inode;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *path;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned long long offset;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int is_tmp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar SLIST_ENTRY(hardlink_node) next_hardlink;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Hardlinks that have been backed up or restored.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * During backup, each node represents a file whose
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * (1) inode has multiple links
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * (2) data has been backed up
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * When we run into a file with multiple links during backup,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * we first check the list to see whether a file with the same inode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * has been backed up. If yes, we backup an empty record, while
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * making the file history of this file contain the data offset
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * of the offset of the file that has been backed up. If no,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * we backup this file, and add an entry to the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * During restore, each node represents an LF_LINK type record whose
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data has been restored (v.s. a hard link has been created).
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * During restore, when we run into a record of LF_LINK type, we
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * first check the queue to see whether a file with the same inode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * has been restored. If yes, we create a hardlink to it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If no, we restore the data, and add an entry to the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct hardlink_q {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct hardlink_node *slh_first;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Utility functions from handling hardlink */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern struct hardlink_q *hardlink_q_init();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void hardlink_q_cleanup(struct hardlink_q *qhead);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int hardlink_q_get(struct hardlink_q *qhead, unsigned long inode,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned long long *offset, char **path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int hardlink_q_add(struct hardlink_q *qhead, unsigned long inode,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned long long offset, char *path, int is_tmp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif /* !_TLM_H_ */