12654012fSReza Sabdar /* 22654012fSReza Sabdar * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 32654012fSReza Sabdar * Use is subject to license terms. 42654012fSReza Sabdar */ 52654012fSReza Sabdar 62654012fSReza Sabdar /* 72654012fSReza Sabdar * BSD 3 Clause License 82654012fSReza Sabdar * 92654012fSReza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association. 102654012fSReza Sabdar * 112654012fSReza Sabdar * Redistribution and use in source and binary forms, with or without 122654012fSReza Sabdar * modification, are permitted provided that the following conditions 132654012fSReza Sabdar * are met: 142654012fSReza Sabdar * - Redistributions of source code must retain the above copyright 152654012fSReza Sabdar * notice, this list of conditions and the following disclaimer. 162654012fSReza Sabdar * 172654012fSReza Sabdar * - Redistributions in binary form must reproduce the above copyright 182654012fSReza Sabdar * notice, this list of conditions and the following disclaimer in 192654012fSReza Sabdar * the documentation and/or other materials provided with the 202654012fSReza Sabdar * distribution. 212654012fSReza Sabdar * 222654012fSReza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA) 232654012fSReza Sabdar * nor the names of its contributors may be used to endorse or promote 242654012fSReza Sabdar * products derived from this software without specific prior written 252654012fSReza Sabdar * permission. 262654012fSReza Sabdar * 272654012fSReza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 282654012fSReza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 292654012fSReza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 302654012fSReza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 312654012fSReza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 322654012fSReza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 332654012fSReza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 342654012fSReza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 352654012fSReza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 362654012fSReza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 372654012fSReza Sabdar * POSSIBILITY OF SUCH DAMAGE. 382654012fSReza Sabdar */ 392654012fSReza Sabdar #ifndef _TLM_H_ 402654012fSReza Sabdar #define _TLM_H_ 412654012fSReza Sabdar 422654012fSReza Sabdar #include <sys/types.h> 432654012fSReza Sabdar #include <synch.h> 442654012fSReza Sabdar #include <limits.h> 452654012fSReza Sabdar #include <cstack.h> 462654012fSReza Sabdar #include <sys/acl.h> 472654012fSReza Sabdar #include <stdio.h> 482654012fSReza Sabdar #include <errno.h> 492654012fSReza Sabdar #include <fcntl.h> 502654012fSReza Sabdar #include <strings.h> 512654012fSReza Sabdar #include <sys/stat.h> 522654012fSReza Sabdar #include <time.h> 532654012fSReza Sabdar #include <sys/queue.h> 542654012fSReza Sabdar 552654012fSReza Sabdar #define IS_SET(f, m) (((f) & (m)) != 0) 562654012fSReza Sabdar 572654012fSReza Sabdar #define TLM_MAX_BACKUP_JOB_NAME 32 /* max size of a job's name */ 582654012fSReza Sabdar #define TLM_TAPE_BUFFERS 10 /* number of rotating tape buffers */ 592654012fSReza Sabdar #define TLM_LINE_SIZE 128 /* size of text messages */ 602654012fSReza Sabdar 612654012fSReza Sabdar 622654012fSReza Sabdar #define TLM_BACKUP_RUN 0x00000001 632654012fSReza Sabdar #define TLM_RESTORE_RUN 0x00000002 642654012fSReza Sabdar #define TLM_STOP 0x00000009 /* graceful stop */ 652654012fSReza Sabdar #define TLM_ABORT 0x99999999 /* abandon the run */ 662654012fSReza Sabdar 672654012fSReza Sabdar #define TLM_EXTRA_SPACE 64 682654012fSReza Sabdar #define TLM_MAX_PATH_NAME (PATH_MAX + TLM_EXTRA_SPACE) 692654012fSReza Sabdar 702654012fSReza Sabdar #define ENTRYTYPELEN 14 712654012fSReza Sabdar #define PERMS 4 722654012fSReza Sabdar #define ID_STR_MAX 20 732654012fSReza Sabdar #define APPENDED_ID_MAX (ID_STR_MAX + 1) 742654012fSReza Sabdar #define ACL_ENTRY_SIZE (ENTRYTYPELEN + ID_STR_MAX + PERMS + APPENDED_ID_MAX) 752654012fSReza Sabdar #define TLM_MAX_ACL_TXT MAX_ACL_ENTRIES * ACL_ENTRY_SIZE 762654012fSReza Sabdar 772654012fSReza Sabdar 782654012fSReza Sabdar /* operation flags */ 792654012fSReza Sabdar #define TLM_OP_CHOOSE_ARCHIVE 0x00000001 /* look for archive bit */ 802654012fSReza Sabdar 812654012fSReza Sabdar /* 822654012fSReza Sabdar * Synchronization flags used when launching the TLM threads. 832654012fSReza Sabdar */ 842654012fSReza Sabdar #define TLM_TAPE_READER 0x00000001 852654012fSReza Sabdar #define TLM_TAPE_WRITER 0x00000002 862654012fSReza Sabdar #define TLM_SOCK_READER 0x00000004 872654012fSReza Sabdar #define TLM_SOCK_WRITER 0x00000008 882654012fSReza Sabdar #define TLM_BUF_READER 0x00000010 892654012fSReza Sabdar #define TLM_BUF_WRITER 0x00000020 902654012fSReza Sabdar #define TLM_TAR_READER 0x00000040 912654012fSReza Sabdar #define TLM_TAR_WRITER 0x00000080 922654012fSReza Sabdar 93*7bc22e45SReza Sabdar #define SCSI_SERIAL_PAGE 0x80 94*7bc22e45SReza Sabdar #define SCSI_DEVICE_IDENT_PAGE 0x83 952654012fSReza Sabdar #define SCMD_READ_ELEMENT_STATUS 0xB8 962654012fSReza Sabdar 972654012fSReza Sabdar typedef int (*func_t)(); 982654012fSReza Sabdar 99*7bc22e45SReza Sabdar typedef struct scsi_serial { 100*7bc22e45SReza Sabdar int sr_flags; 101*7bc22e45SReza Sabdar char sr_num[16]; 102*7bc22e45SReza Sabdar } scsi_serial_t; 103*7bc22e45SReza Sabdar 1042654012fSReza Sabdar typedef struct fs_fhandle { 1052654012fSReza Sabdar int fh_fid; 1062654012fSReza Sabdar char *fh_fpath; 1072654012fSReza Sabdar } fs_fhandle_t; 1082654012fSReza Sabdar 1092654012fSReza Sabdar typedef struct scsi_link { 1102654012fSReza Sabdar struct scsi_link *sl_next; 1112654012fSReza Sabdar struct scsi_link *sl_prev; 1122654012fSReza Sabdar struct scsi_adapter *sl_sa; 1132654012fSReza Sabdar unsigned int sl_sid; 1142654012fSReza Sabdar unsigned int sl_lun; 1152654012fSReza Sabdar unsigned int sl_requested_max_active; 1162654012fSReza Sabdar unsigned int sl_granted_max_active; 1172654012fSReza Sabdar unsigned int sl_n_active; 1182654012fSReza Sabdar unsigned int sl_type; /* SCSI device type */ 1192654012fSReza Sabdar } scsi_link_t; 1202654012fSReza Sabdar 1212654012fSReza Sabdar typedef struct scsi_adapter { 1222654012fSReza Sabdar struct scsi_adapter *sa_next; 1232654012fSReza Sabdar char sa_name[16]; 1242654012fSReza Sabdar struct scsi_link sa_link_head; 1252654012fSReza Sabdar } scsi_adapter_t; 1262654012fSReza Sabdar 1272654012fSReza Sabdar typedef struct sasd_drive { 1282654012fSReza Sabdar char sd_name[256]; 1292654012fSReza Sabdar char sd_vendor[8 + 1]; 1302654012fSReza Sabdar char sd_id[16 + 1]; 1312654012fSReza Sabdar char sd_rev[4 + 1]; 132*7bc22e45SReza Sabdar char sd_serial[16 + 1]; 133*7bc22e45SReza Sabdar char sd_wwn[32 + 1]; 1342654012fSReza Sabdar } sasd_drive_t; 1352654012fSReza Sabdar 1362654012fSReza Sabdar typedef struct scsi_sasd_drive { 1372654012fSReza Sabdar sasd_drive_t ss_sd; 1382654012fSReza Sabdar scsi_link_t ss_slink; 1392654012fSReza Sabdar } scsi_sasd_drive_t; 1402654012fSReza Sabdar 1412654012fSReza Sabdar 1422654012fSReza Sabdar #define DEFAULT_SLINK_MAX_XFER (64*1024) 1432654012fSReza Sabdar 1442654012fSReza Sabdar typedef struct tlm_info { 1452654012fSReza Sabdar int ti_init_done; /* initialization done ? */ 1462654012fSReza Sabdar int ti_library_count; /* number of libraries */ 1472654012fSReza Sabdar struct tlm_library *ti_library; /* first in chain */ 1482654012fSReza Sabdar struct tlm_chain_link *ti_job_stats; /* chain of job statistics */ 1492654012fSReza Sabdar } tlm_info_t; 1502654012fSReza Sabdar 1512654012fSReza Sabdar typedef struct tlm_chain_link { 1522654012fSReza Sabdar struct tlm_chain_link *tc_next; /* next blob of statistics */ 1532654012fSReza Sabdar struct tlm_chain_link *tc_prev; /* previous blob in the chain */ 1542654012fSReza Sabdar int tc_ref_count; /* number of routines */ 1552654012fSReza Sabdar void *tc_data; /* the data blob */ 1562654012fSReza Sabdar } tlm_chain_link_t; 1572654012fSReza Sabdar 1582654012fSReza Sabdar typedef struct tlm_robot { 1592654012fSReza Sabdar struct tlm_robot *tr_next; 1602654012fSReza Sabdar struct tlm_library *tr_library; 1612654012fSReza Sabdar int tr_number; 1622654012fSReza Sabdar } tlm_robot_t; 1632654012fSReza Sabdar 1642654012fSReza Sabdar typedef struct tlm_drive { 1652654012fSReza Sabdar struct tlm_drive *td_next; 1662654012fSReza Sabdar struct tlm_library *td_library; 1672654012fSReza Sabdar char td_job_name[TLM_MAX_BACKUP_JOB_NAME]; 1682654012fSReza Sabdar int td_number; /* number of this tape drive */ 1692654012fSReza Sabdar int td_element; /* the library's number for the drive */ 1702654012fSReza Sabdar struct scsi_link *td_slink; /* because the drive may be connected */ 1712654012fSReza Sabdar /* to a different SCSI card than the */ 1722654012fSReza Sabdar /* library */ 1732654012fSReza Sabdar short td_scsi_id; 1742654012fSReza Sabdar short td_lun; 1752654012fSReza Sabdar short td_volume_number; /* for current job */ 1762654012fSReza Sabdar /* an index into the tape set */ 1772654012fSReza Sabdar int td_fd; /* I/O file descriptor */ 1782654012fSReza Sabdar int td_errno; /* system error number */ 1792654012fSReza Sabdar long td_exists : 1; 1802654012fSReza Sabdar 1812654012fSReza Sabdar } tlm_drive_t; 1822654012fSReza Sabdar 1832654012fSReza Sabdar typedef struct tlm_slot { 1842654012fSReza Sabdar struct tlm_slot *ts_next; 1852654012fSReza Sabdar struct tlm_library *ts_library; 1862654012fSReza Sabdar int ts_number; /* number of this slot */ 1872654012fSReza Sabdar int ts_element; 1882654012fSReza Sabdar short ts_use_count; /* number of times used since loaded */ 1892654012fSReza Sabdar long ts_status_full : 1; 1902654012fSReza Sabdar } tlm_slot_t; 1912654012fSReza Sabdar 1922654012fSReza Sabdar typedef struct tlm_library { 1932654012fSReza Sabdar struct tlm_library *tl_next; 1942654012fSReza Sabdar int tl_number; /* number of this tape library */ 1952654012fSReza Sabdar long tl_capability_robot : 1, 1962654012fSReza Sabdar tl_capability_door : 1, 1972654012fSReza Sabdar tl_capability_lock : 1, 1982654012fSReza Sabdar tl_capability_slots : 1, 1992654012fSReza Sabdar tl_capability_export : 1, 2002654012fSReza Sabdar tl_capability_drives : 1, 2012654012fSReza Sabdar tl_capability_barcodes : 1, 2022654012fSReza Sabdar tl_ghost_drives : 1; 2032654012fSReza Sabdar /* 2042654012fSReza Sabdar * "ghost_drives" is used to make sure that 2052654012fSReza Sabdar * all drives claimed by the library really 2062654012fSReza Sabdar * exist ... libraries have been known to lie. 2072654012fSReza Sabdar */ 2082654012fSReza Sabdar struct scsi_link *tl_slink; 2092654012fSReza Sabdar 2102654012fSReza Sabdar int tl_robot_count; 2112654012fSReza Sabdar tlm_robot_t *tl_robot; 2122654012fSReza Sabdar int tl_drive_count; 2132654012fSReza Sabdar tlm_drive_t *tl_drive; 2142654012fSReza Sabdar int tl_slot_count; 2152654012fSReza Sabdar tlm_slot_t *tl_slot; 2162654012fSReza Sabdar } tlm_library_t; 2172654012fSReza Sabdar 218*7bc22e45SReza Sabdar typedef struct { 219*7bc22e45SReza Sabdar unsigned char d_name[8]; 220*7bc22e45SReza Sabdar } device_info_t; 221*7bc22e45SReza Sabdar 222*7bc22e45SReza Sabdar typedef struct { 223*7bc22e45SReza Sabdar unsigned char p_number[4]; 224*7bc22e45SReza Sabdar } port_info_t; 225*7bc22e45SReza Sabdar 226*7bc22e45SReza Sabdar typedef struct { 227*7bc22e45SReza Sabdar #ifdef _BIG_ENDIAN 228*7bc22e45SReza Sabdar uint8_t di_peripheral_qual : 3, 229*7bc22e45SReza Sabdar di_peripheral_dev_type : 5; 230*7bc22e45SReza Sabdar uint8_t di_page_code; 231*7bc22e45SReza Sabdar uint16_t di_page_length; 232*7bc22e45SReza Sabdar #else 233*7bc22e45SReza Sabdar uint8_t di_peripheral_dev_type : 5, 234*7bc22e45SReza Sabdar di_peripheral_qual : 3; 235*7bc22e45SReza Sabdar uint8_t di_page_code; 236*7bc22e45SReza Sabdar uint16_t di_page_length; 237*7bc22e45SReza Sabdar #endif 238*7bc22e45SReza Sabdar } device_ident_header_t; 239*7bc22e45SReza Sabdar 240*7bc22e45SReza Sabdar typedef struct { 241*7bc22e45SReza Sabdar #ifdef _BIG_ENDIAN 242*7bc22e45SReza Sabdar uint8_t ni_proto_ident : 4, 243*7bc22e45SReza Sabdar ni_code_set : 4; 244*7bc22e45SReza Sabdar 245*7bc22e45SReza Sabdar uint8_t ni_PIV : 1, 246*7bc22e45SReza Sabdar : 1, 247*7bc22e45SReza Sabdar ni_asso : 2, 248*7bc22e45SReza Sabdar ni_ident_type : 4; 249*7bc22e45SReza Sabdar 250*7bc22e45SReza Sabdar uint8_t ni_reserved; 251*7bc22e45SReza Sabdar uint8_t ni_ident_length; 252*7bc22e45SReza Sabdar #else 253*7bc22e45SReza Sabdar uint8_t ni_code_set : 4, 254*7bc22e45SReza Sabdar ni_proto_ident : 4; 255*7bc22e45SReza Sabdar 256*7bc22e45SReza Sabdar uint8_t ni_ident_type : 4, 257*7bc22e45SReza Sabdar ni_asso : 2, 258*7bc22e45SReza Sabdar : 1, 259*7bc22e45SReza Sabdar ni_PIV : 1; 260*7bc22e45SReza Sabdar uint8_t ni_reserved; 261*7bc22e45SReza Sabdar uint8_t ni_ident_length; 262*7bc22e45SReza Sabdar #endif 263*7bc22e45SReza Sabdar } name_ident_t; 264*7bc22e45SReza Sabdar 265*7bc22e45SReza Sabdar typedef struct { 266*7bc22e45SReza Sabdar device_ident_header_t np_header; 267*7bc22e45SReza Sabdar name_ident_t np_node; 268*7bc22e45SReza Sabdar device_info_t np_node_info; 269*7bc22e45SReza Sabdar name_ident_t np_port; 270*7bc22e45SReza Sabdar device_info_t np_port_info; 271*7bc22e45SReza Sabdar name_ident_t np_portno; 272*7bc22e45SReza Sabdar port_info_t np_portid; 273*7bc22e45SReza Sabdar } device_name_page_t; 274*7bc22e45SReza Sabdar 2752654012fSReza Sabdar #define TLM_NO_ERRORS 0x00000000 2762654012fSReza Sabdar #define TLM_ERROR_BUSY 0x00000001 2772654012fSReza Sabdar #define TLM_ERROR_INTERNAL 0x00000002 2782654012fSReza Sabdar #define TLM_ERROR_NO_ROBOTS 0x00000003 2792654012fSReza Sabdar #define TLM_TIMEOUT 0x00000004 2802654012fSReza Sabdar #define TLM_ERROR_RANGE 0x00000005 2812654012fSReza Sabdar #define TLM_EMPTY 0x00000006 2822654012fSReza Sabdar #define TLM_DRIVE_NOT_ASSIGNED 0x00000007 2832654012fSReza Sabdar #define TLM_NO_TAPE_NAME 0x00000008 2842654012fSReza Sabdar #define TLM_NO_BACKUP_DIR 0x00000009 2852654012fSReza Sabdar #define TLM_NO_BACKUP_HARDWARE 0x0000000a 2862654012fSReza Sabdar #define TLM_NO_SOURCE_FILE 0x0000000b 2872654012fSReza Sabdar #define TLM_NO_FREE_TAPES 0x0000000c 2882654012fSReza Sabdar #define TLM_EOT 0x0000000d 2892654012fSReza Sabdar #define TLM_SERIAL_NOT_FOUND 0x0000000e 2902654012fSReza Sabdar #define TLM_SMALL_READ 0x0000000f 2912654012fSReza Sabdar #define TLM_NO_RESTORE_FILE 0x00000010 2922654012fSReza Sabdar #define TLM_EOF 0x00000011 2932654012fSReza Sabdar #define TLM_NO_DIRECTORY 0x00000012 2942654012fSReza Sabdar #define TLM_NO_MEMORY 0x00000013 2952654012fSReza Sabdar #define TLM_WRITE_ERROR 0x00000014 2962654012fSReza Sabdar #define TLM_NO_SCRATCH_SPACE 0x00000015 2972654012fSReza Sabdar #define TLM_INVALID 0x00000016 2982654012fSReza Sabdar #define TLM_MOVE 0x00000017 2992654012fSReza Sabdar #define TLM_SKIP 0x00000018 3002654012fSReza Sabdar #define TLM_OPEN_ERR 0x00000019 3012654012fSReza Sabdar 3022654012fSReza Sabdar 3032654012fSReza Sabdar #define TLM_MAX_TAPE_DRIVES 16 3042654012fSReza Sabdar #define TLM_NAME_SIZE 100 3052654012fSReza Sabdar #define TLM_MAX_TAR_IMAGE 017777777770 3062654012fSReza Sabdar 3072654012fSReza Sabdar #define TLM_VOLNAME_MAX_LENGTH 255 3082654012fSReza Sabdar #define NAME_MAX 255 3092654012fSReza Sabdar 3102654012fSReza Sabdar #define TLM_MAGIC "ustar " 3112654012fSReza Sabdar #define TLM_SNAPSHOT_PREFIX ".zfs" 3122654012fSReza Sabdar #define TLM_SNAPSHOT_DIR ".zfs/snapshot" 3132654012fSReza Sabdar 3142654012fSReza Sabdar #define RECORDSIZE 512 3152654012fSReza Sabdar #define NAMSIZ 100 3162654012fSReza Sabdar #define TUNMLEN 32 3172654012fSReza Sabdar #define TGNMLEN 32 3182654012fSReza Sabdar 3192654012fSReza Sabdar typedef struct tlm_tar_hdr { 3202654012fSReza Sabdar char th_name[TLM_NAME_SIZE]; 3212654012fSReza Sabdar char th_mode[8]; 3222654012fSReza Sabdar char th_uid[8]; 3232654012fSReza Sabdar char th_gid[8]; 3242654012fSReza Sabdar char th_size[12]; 3252654012fSReza Sabdar char th_mtime[12]; 3262654012fSReza Sabdar char th_chksum[8]; 3272654012fSReza Sabdar char th_linkflag; 3282654012fSReza Sabdar char th_linkname[TLM_NAME_SIZE]; 3292654012fSReza Sabdar char th_magic[8]; 3302654012fSReza Sabdar char th_uname[TUNMLEN]; 3312654012fSReza Sabdar char th_gname[TGNMLEN]; 3322654012fSReza Sabdar union { 3332654012fSReza Sabdar struct { 3342654012fSReza Sabdar char th_devmajor[8]; 3352654012fSReza Sabdar char th_devminor[8]; 3362654012fSReza Sabdar } th_dev; 3372654012fSReza Sabdar char th_hlink_ino[12]; 3382654012fSReza Sabdar } th_shared; 3392654012fSReza Sabdar } tlm_tar_hdr_t; 3402654012fSReza Sabdar 3412654012fSReza Sabdar 3422654012fSReza Sabdar 3432654012fSReza Sabdar /* 3442654012fSReza Sabdar * The linkflag defines the type of file 3452654012fSReza Sabdar */ 3462654012fSReza Sabdar #define LF_OLDNORMAL '\0' /* Normal disk file, Unix compat */ 3472654012fSReza Sabdar #define LF_NORMAL '0' /* Normal disk file */ 3482654012fSReza Sabdar #define LF_LINK '1' /* Link to previously dumped file */ 3492654012fSReza Sabdar #define LF_SYMLINK '2' /* Symbolic link */ 3502654012fSReza Sabdar #define LF_CHR '3' /* Character special file */ 3512654012fSReza Sabdar #define LF_BLK '4' /* Block special file */ 3522654012fSReza Sabdar #define LF_DIR '5' /* Directory */ 3532654012fSReza Sabdar #define LF_FIFO '6' /* FIFO special file */ 3542654012fSReza Sabdar #define LF_CONTIG '7' /* Contiguous file */ 3552654012fSReza Sabdar /* Further link types may be defined later. */ 3562654012fSReza Sabdar 3572654012fSReza Sabdar #define LF_DUMPDIR 'D' 3582654012fSReza Sabdar /* 3592654012fSReza Sabdar * This is a dir entry that contains 3602654012fSReza Sabdar * the names of files that were in 3612654012fSReza Sabdar * the dir at the time the dump 3622654012fSReza Sabdar * was made 3632654012fSReza Sabdar */ 3642654012fSReza Sabdar #define LF_HUMONGUS 'H' 3652654012fSReza Sabdar /* 3662654012fSReza Sabdar * Identifies the NEXT file on the tape 3672654012fSReza Sabdar * as a HUGE file 3682654012fSReza Sabdar */ 3692654012fSReza Sabdar #define LF_LONGLINK 'K' 3702654012fSReza Sabdar /* 3712654012fSReza Sabdar * Identifies the NEXT file on the tape 3722654012fSReza Sabdar * as having a long linkname 3732654012fSReza Sabdar */ 3742654012fSReza Sabdar #define LF_LONGNAME 'L' 3752654012fSReza Sabdar /* 3762654012fSReza Sabdar * Identifies the NEXT file on the tape 3772654012fSReza Sabdar * as having a long name. 3782654012fSReza Sabdar */ 3792654012fSReza Sabdar #define LF_MULTIVOL 'M' 3802654012fSReza Sabdar /* 3812654012fSReza Sabdar * This is the continuation 3822654012fSReza Sabdar * of a file that began on another 3832654012fSReza Sabdar * volume 3842654012fSReza Sabdar */ 3852654012fSReza Sabdar 3862654012fSReza Sabdar #define LF_VOLHDR 'V' /* This file is a tape/volume header */ 3872654012fSReza Sabdar /* Ignore it on extraction */ 3882654012fSReza Sabdar 3892654012fSReza Sabdar #define LF_ACL 'A' /* Access Control List */ 3902654012fSReza Sabdar 3912654012fSReza Sabdar #define LF_XATTR 'E' /* Extended attribute */ 3922654012fSReza Sabdar 3932654012fSReza Sabdar #define KILOBYTE 1024 3942654012fSReza Sabdar 3952654012fSReza Sabdar 3962654012fSReza Sabdar /* 3972654012fSReza Sabdar * ACL support structure 3982654012fSReza Sabdar */ 3992654012fSReza Sabdar typedef struct sec_attr { 4002654012fSReza Sabdar char attr_type; 4012654012fSReza Sabdar char attr_len[7]; 4022654012fSReza Sabdar char attr_info[TLM_MAX_ACL_TXT]; 4032654012fSReza Sabdar } sec_attr_t; 4042654012fSReza Sabdar 4052654012fSReza Sabdar typedef struct tlm_acls { 4062654012fSReza Sabdar int acl_checkpointed : 1, /* are checkpoints active ? */ 4072654012fSReza Sabdar acl_clear_archive : 1, /* clear archive bit ? */ 4082654012fSReza Sabdar acl_overwrite : 1, /* always overwrite ? */ 4092654012fSReza Sabdar acl_update : 1, /* only update ? */ 4102654012fSReza Sabdar acl_non_trivial : 1; /* real ACLs? */ 4112654012fSReza Sabdar /* 4122654012fSReza Sabdar * The following fields are here to allow 4132654012fSReza Sabdar * the backup reader to open a file one time 4142654012fSReza Sabdar * and keep the information for ACL, ATTRs, 4152654012fSReza Sabdar * and reading the file. 4162654012fSReza Sabdar */ 4172654012fSReza Sabdar sec_attr_t acl_info; 4182654012fSReza Sabdar 4192654012fSReza Sabdar char acl_root_dir[TLM_VOLNAME_MAX_LENGTH]; /* name of root filesystem */ 4202654012fSReza Sabdar fs_fhandle_t acl_dir_fh; /* parent dir's info */ 4212654012fSReza Sabdar fs_fhandle_t acl_fil_fh; /* file's info */ 4222654012fSReza Sabdar struct stat64 acl_attr; /* file system attributes */ 4232654012fSReza Sabdar } tlm_acls_t; 4242654012fSReza Sabdar 4252654012fSReza Sabdar 4262654012fSReza Sabdar /* 4272654012fSReza Sabdar * Tape manager's data archiving ops vector 4282654012fSReza Sabdar * 4292654012fSReza Sabdar * This vector represents the granular operations for 4302654012fSReza Sabdar * performing backup/restore. Each backend should provide 4312654012fSReza Sabdar * such a vector interface in order to be invoked by NDMP 4322654012fSReza Sabdar * server. 4332654012fSReza Sabdar * The reserved callbacks are kept for different backup 4342654012fSReza Sabdar * types which are volume-based rather than file-based 4352654012fSReza Sabdar * e.g. zfs send. 4362654012fSReza Sabdar */ 4372654012fSReza Sabdar typedef struct tm_ops { 4382654012fSReza Sabdar char *tm_name; 4392654012fSReza Sabdar int (*tm_putfile)(); 4402654012fSReza Sabdar int (*tm_putdir)(); 4412654012fSReza Sabdar int (*tm_putvol)(); /* Reserved */ 4422654012fSReza Sabdar int (*tm_getfile)(); 4432654012fSReza Sabdar int (*tm_getdir)(); 4442654012fSReza Sabdar int (*tm_getvol)(); /* Reserved */ 4452654012fSReza Sabdar } tm_ops_t; 4462654012fSReza Sabdar 4472654012fSReza Sabdar /* The checksum field is filled with this while the checksum is computed. */ 4482654012fSReza Sabdar #define CHKBLANKS " " /* 8 blanks, no null */ 4492654012fSReza Sabdar 4502654012fSReza Sabdar #define LONGNAME_PREFIX "././_LoNg_NaMe_" 4512654012fSReza Sabdar extern void ndmp_log(ulong_t, char *, char *, ...); 4522654012fSReza Sabdar char ndmp_log_info[256]; 4532654012fSReza Sabdar #define NDMP_LOG(p, ...) { \ 4542654012fSReza Sabdar (void) snprintf(ndmp_log_info, \ 4552654012fSReza Sabdar sizeof (ndmp_log_info), \ 4562654012fSReza Sabdar "[%d][%s:%d]", \ 4572654012fSReza Sabdar (int)pthread_self(), __func__, __LINE__); \ 4582654012fSReza Sabdar ndmp_log(p, ndmp_log_info, __VA_ARGS__); \ 4592654012fSReza Sabdar } 4602654012fSReza Sabdar extern void *ndmp_malloc(size_t size); 4612654012fSReza Sabdar 4622654012fSReza Sabdar /* 4632654012fSReza Sabdar * ZFS metadata plug-in module structures 4642654012fSReza Sabdar */ 4652654012fSReza Sabdar #define ZFS_MAX_PROPS 100 4662654012fSReza Sabdar #define ZFS_META_MAGIC "ZFSMETA" 4672654012fSReza Sabdar 4682654012fSReza Sabdar typedef struct ndmp_metadata_property { 4692654012fSReza Sabdar char mp_name[NAME_MAX]; 4702654012fSReza Sabdar char mp_value[NAME_MAX]; 4712654012fSReza Sabdar char mp_source[NAME_MAX]; 4722654012fSReza Sabdar } ndmp_metadata_property_t; 4732654012fSReza Sabdar 4742654012fSReza Sabdar typedef struct ndmp_metadata_header { 4752654012fSReza Sabdar char nh_plname[100]; 4762654012fSReza Sabdar uint_t nh_plversion; 4772654012fSReza Sabdar char nh_magic[10]; 4782654012fSReza Sabdar void *nh_handle; 4792654012fSReza Sabdar int nh_count; 4802654012fSReza Sabdar char nh_dataset[NAME_MAX]; 4812654012fSReza Sabdar ndmp_metadata_property_t nh_property[1]; 4822654012fSReza Sabdar } ndmp_metadata_header_t; 4832654012fSReza Sabdar 4842654012fSReza Sabdar /* 4852654012fSReza Sabdar * Node in struct hardlink_q 4862654012fSReza Sabdar * 4872654012fSReza Sabdar * inode: the inode of the hardlink 4882654012fSReza Sabdar * path: the name of the hardlink, used during restore 4892654012fSReza Sabdar * offset: tape offset of the data records for the hardlink, used during backup 4902654012fSReza Sabdar * is_tmp: indicate whether the file was created temporarily for restoring 4912654012fSReza Sabdar * other links during a non-DAR partial restore 4922654012fSReza Sabdar */ 4932654012fSReza Sabdar struct hardlink_node { 4942654012fSReza Sabdar unsigned long inode; 4952654012fSReza Sabdar char *path; 4962654012fSReza Sabdar unsigned long long offset; 4972654012fSReza Sabdar int is_tmp; 4982654012fSReza Sabdar SLIST_ENTRY(hardlink_node) next_hardlink; 4992654012fSReza Sabdar }; 5002654012fSReza Sabdar 5012654012fSReza Sabdar /* 5022654012fSReza Sabdar * Hardlinks that have been backed up or restored. 5032654012fSReza Sabdar * 5042654012fSReza Sabdar * During backup, each node represents a file whose 5052654012fSReza Sabdar * (1) inode has multiple links 5062654012fSReza Sabdar * (2) data has been backed up 5072654012fSReza Sabdar * 5082654012fSReza Sabdar * When we run into a file with multiple links during backup, 5092654012fSReza Sabdar * we first check the list to see whether a file with the same inode 5102654012fSReza Sabdar * has been backed up. If yes, we backup an empty record, while 5112654012fSReza Sabdar * making the file history of this file contain the data offset 5122654012fSReza Sabdar * of the offset of the file that has been backed up. If no, 5132654012fSReza Sabdar * we backup this file, and add an entry to the list. 5142654012fSReza Sabdar * 5152654012fSReza Sabdar * During restore, each node represents an LF_LINK type record whose 5162654012fSReza Sabdar * data has been restored (v.s. a hard link has been created). 5172654012fSReza Sabdar * 5182654012fSReza Sabdar * During restore, when we run into a record of LF_LINK type, we 5192654012fSReza Sabdar * first check the queue to see whether a file with the same inode 5202654012fSReza Sabdar * has been restored. If yes, we create a hardlink to it. 5212654012fSReza Sabdar * If no, we restore the data, and add an entry to the list. 5222654012fSReza Sabdar */ 5232654012fSReza Sabdar struct hardlink_q { 5242654012fSReza Sabdar struct hardlink_node *slh_first; 5252654012fSReza Sabdar }; 5262654012fSReza Sabdar 5272654012fSReza Sabdar /* Utility functions from handling hardlink */ 5282654012fSReza Sabdar extern struct hardlink_q *hardlink_q_init(); 5292654012fSReza Sabdar extern void hardlink_q_cleanup(struct hardlink_q *qhead); 5302654012fSReza Sabdar extern int hardlink_q_get(struct hardlink_q *qhead, unsigned long inode, 5312654012fSReza Sabdar unsigned long long *offset, char **path); 5322654012fSReza Sabdar extern int hardlink_q_add(struct hardlink_q *qhead, unsigned long inode, 5332654012fSReza Sabdar unsigned long long offset, char *path, int is_tmp); 5342654012fSReza Sabdar 5352654012fSReza Sabdar #endif /* !_TLM_H_ */ 536