17917SReza.Sabdar@Sun.COM /* 2*13024SRandall.Ralphs@Sun.COM * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 37917SReza.Sabdar@Sun.COM */ 47917SReza.Sabdar@Sun.COM 57917SReza.Sabdar@Sun.COM /* 67917SReza.Sabdar@Sun.COM * BSD 3 Clause License 77917SReza.Sabdar@Sun.COM * 87917SReza.Sabdar@Sun.COM * Copyright (c) 2007, The Storage Networking Industry Association. 97917SReza.Sabdar@Sun.COM * 107917SReza.Sabdar@Sun.COM * Redistribution and use in source and binary forms, with or without 117917SReza.Sabdar@Sun.COM * modification, are permitted provided that the following conditions 127917SReza.Sabdar@Sun.COM * are met: 137917SReza.Sabdar@Sun.COM * - Redistributions of source code must retain the above copyright 147917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer. 157917SReza.Sabdar@Sun.COM * 167917SReza.Sabdar@Sun.COM * - Redistributions in binary form must reproduce the above copyright 177917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer in 187917SReza.Sabdar@Sun.COM * the documentation and/or other materials provided with the 197917SReza.Sabdar@Sun.COM * distribution. 207917SReza.Sabdar@Sun.COM * 217917SReza.Sabdar@Sun.COM * - Neither the name of The Storage Networking Industry Association (SNIA) 227917SReza.Sabdar@Sun.COM * nor the names of its contributors may be used to endorse or promote 237917SReza.Sabdar@Sun.COM * products derived from this software without specific prior written 247917SReza.Sabdar@Sun.COM * permission. 257917SReza.Sabdar@Sun.COM * 267917SReza.Sabdar@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 277917SReza.Sabdar@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 287917SReza.Sabdar@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 297917SReza.Sabdar@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 307917SReza.Sabdar@Sun.COM * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 317917SReza.Sabdar@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 327917SReza.Sabdar@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 337917SReza.Sabdar@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 347917SReza.Sabdar@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 357917SReza.Sabdar@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 367917SReza.Sabdar@Sun.COM * POSSIBILITY OF SUCH DAMAGE. 377917SReza.Sabdar@Sun.COM */ 387917SReza.Sabdar@Sun.COM #ifndef _TLM_H_ 397917SReza.Sabdar@Sun.COM #define _TLM_H_ 407917SReza.Sabdar@Sun.COM 417917SReza.Sabdar@Sun.COM #include <sys/types.h> 427917SReza.Sabdar@Sun.COM #include <synch.h> 437917SReza.Sabdar@Sun.COM #include <limits.h> 447917SReza.Sabdar@Sun.COM #include <cstack.h> 457917SReza.Sabdar@Sun.COM #include <sys/acl.h> 467917SReza.Sabdar@Sun.COM #include <stdio.h> 477917SReza.Sabdar@Sun.COM #include <errno.h> 487917SReza.Sabdar@Sun.COM #include <fcntl.h> 497917SReza.Sabdar@Sun.COM #include <strings.h> 507917SReza.Sabdar@Sun.COM #include <sys/stat.h> 517917SReza.Sabdar@Sun.COM #include <time.h> 527917SReza.Sabdar@Sun.COM #include <sys/queue.h> 5311170SReza.Sabdar@Sun.COM #include <sys/fs/zfs.h> 5411170SReza.Sabdar@Sun.COM #include <libzfs.h> 557917SReza.Sabdar@Sun.COM 567917SReza.Sabdar@Sun.COM #define IS_SET(f, m) (((f) & (m)) != 0) 577917SReza.Sabdar@Sun.COM 587917SReza.Sabdar@Sun.COM #define TLM_MAX_BACKUP_JOB_NAME 32 /* max size of a job's name */ 597917SReza.Sabdar@Sun.COM #define TLM_TAPE_BUFFERS 10 /* number of rotating tape buffers */ 607917SReza.Sabdar@Sun.COM #define TLM_LINE_SIZE 128 /* size of text messages */ 617917SReza.Sabdar@Sun.COM 627917SReza.Sabdar@Sun.COM 637917SReza.Sabdar@Sun.COM #define TLM_BACKUP_RUN 0x00000001 647917SReza.Sabdar@Sun.COM #define TLM_RESTORE_RUN 0x00000002 657917SReza.Sabdar@Sun.COM #define TLM_STOP 0x00000009 /* graceful stop */ 667917SReza.Sabdar@Sun.COM #define TLM_ABORT 0x99999999 /* abandon the run */ 677917SReza.Sabdar@Sun.COM 687917SReza.Sabdar@Sun.COM #define TLM_EXTRA_SPACE 64 697917SReza.Sabdar@Sun.COM #define TLM_MAX_PATH_NAME (PATH_MAX + TLM_EXTRA_SPACE) 707917SReza.Sabdar@Sun.COM 717917SReza.Sabdar@Sun.COM #define ENTRYTYPELEN 14 727917SReza.Sabdar@Sun.COM #define PERMS 4 737917SReza.Sabdar@Sun.COM #define ID_STR_MAX 20 747917SReza.Sabdar@Sun.COM #define APPENDED_ID_MAX (ID_STR_MAX + 1) 757917SReza.Sabdar@Sun.COM #define ACL_ENTRY_SIZE (ENTRYTYPELEN + ID_STR_MAX + PERMS + APPENDED_ID_MAX) 767917SReza.Sabdar@Sun.COM #define TLM_MAX_ACL_TXT MAX_ACL_ENTRIES * ACL_ENTRY_SIZE 777917SReza.Sabdar@Sun.COM 787917SReza.Sabdar@Sun.COM 797917SReza.Sabdar@Sun.COM /* operation flags */ 807917SReza.Sabdar@Sun.COM #define TLM_OP_CHOOSE_ARCHIVE 0x00000001 /* look for archive bit */ 817917SReza.Sabdar@Sun.COM 827917SReza.Sabdar@Sun.COM /* 837917SReza.Sabdar@Sun.COM * Synchronization flags used when launching the TLM threads. 847917SReza.Sabdar@Sun.COM */ 857917SReza.Sabdar@Sun.COM #define TLM_TAPE_READER 0x00000001 867917SReza.Sabdar@Sun.COM #define TLM_TAPE_WRITER 0x00000002 877917SReza.Sabdar@Sun.COM #define TLM_SOCK_READER 0x00000004 887917SReza.Sabdar@Sun.COM #define TLM_SOCK_WRITER 0x00000008 897917SReza.Sabdar@Sun.COM #define TLM_BUF_READER 0x00000010 907917SReza.Sabdar@Sun.COM #define TLM_BUF_WRITER 0x00000020 917917SReza.Sabdar@Sun.COM #define TLM_TAR_READER 0x00000040 927917SReza.Sabdar@Sun.COM #define TLM_TAR_WRITER 0x00000080 937917SReza.Sabdar@Sun.COM 948193SReza.Sabdar@Sun.COM #define SCSI_SERIAL_PAGE 0x80 958193SReza.Sabdar@Sun.COM #define SCSI_DEVICE_IDENT_PAGE 0x83 968193SReza.Sabdar@Sun.COM #define SCMD_READ_ELEMENT_STATUS 0xB8 977917SReza.Sabdar@Sun.COM 988540SReza.Sabdar@Sun.COM #define OCTAL7CHAR 07777777 998540SReza.Sabdar@Sun.COM #define SYSATTR_RDONLY "SUNWattr_ro" 1008540SReza.Sabdar@Sun.COM #define SYSATTR_RW "SUNWattr_rw" 1018540SReza.Sabdar@Sun.COM 1027917SReza.Sabdar@Sun.COM typedef int (*func_t)(); 1037917SReza.Sabdar@Sun.COM 1048193SReza.Sabdar@Sun.COM typedef struct scsi_serial { 1058193SReza.Sabdar@Sun.COM int sr_flags; 1068193SReza.Sabdar@Sun.COM char sr_num[16]; 1078193SReza.Sabdar@Sun.COM } scsi_serial_t; 1088193SReza.Sabdar@Sun.COM 1097917SReza.Sabdar@Sun.COM typedef struct fs_fhandle { 1107917SReza.Sabdar@Sun.COM int fh_fid; 1117917SReza.Sabdar@Sun.COM char *fh_fpath; 1127917SReza.Sabdar@Sun.COM } fs_fhandle_t; 1137917SReza.Sabdar@Sun.COM 1147917SReza.Sabdar@Sun.COM typedef struct scsi_link { 1157917SReza.Sabdar@Sun.COM struct scsi_link *sl_next; 1167917SReza.Sabdar@Sun.COM struct scsi_link *sl_prev; 1177917SReza.Sabdar@Sun.COM struct scsi_adapter *sl_sa; 1187917SReza.Sabdar@Sun.COM unsigned int sl_sid; 1197917SReza.Sabdar@Sun.COM unsigned int sl_lun; 1207917SReza.Sabdar@Sun.COM unsigned int sl_requested_max_active; 1217917SReza.Sabdar@Sun.COM unsigned int sl_granted_max_active; 1227917SReza.Sabdar@Sun.COM unsigned int sl_n_active; 1237917SReza.Sabdar@Sun.COM unsigned int sl_type; /* SCSI device type */ 1247917SReza.Sabdar@Sun.COM } scsi_link_t; 1257917SReza.Sabdar@Sun.COM 1267917SReza.Sabdar@Sun.COM typedef struct scsi_adapter { 1277917SReza.Sabdar@Sun.COM struct scsi_adapter *sa_next; 1287917SReza.Sabdar@Sun.COM char sa_name[16]; 1297917SReza.Sabdar@Sun.COM struct scsi_link sa_link_head; 1307917SReza.Sabdar@Sun.COM } scsi_adapter_t; 1317917SReza.Sabdar@Sun.COM 1327917SReza.Sabdar@Sun.COM typedef struct sasd_drive { 1337917SReza.Sabdar@Sun.COM char sd_name[256]; 1347917SReza.Sabdar@Sun.COM char sd_vendor[8 + 1]; 1357917SReza.Sabdar@Sun.COM char sd_id[16 + 1]; 1367917SReza.Sabdar@Sun.COM char sd_rev[4 + 1]; 1378193SReza.Sabdar@Sun.COM char sd_serial[16 + 1]; 1388193SReza.Sabdar@Sun.COM char sd_wwn[32 + 1]; 1397917SReza.Sabdar@Sun.COM } sasd_drive_t; 1407917SReza.Sabdar@Sun.COM 1417917SReza.Sabdar@Sun.COM typedef struct scsi_sasd_drive { 1427917SReza.Sabdar@Sun.COM sasd_drive_t ss_sd; 1437917SReza.Sabdar@Sun.COM scsi_link_t ss_slink; 1447917SReza.Sabdar@Sun.COM } scsi_sasd_drive_t; 1457917SReza.Sabdar@Sun.COM 1467917SReza.Sabdar@Sun.COM 1477917SReza.Sabdar@Sun.COM #define DEFAULT_SLINK_MAX_XFER (64*1024) 1487917SReza.Sabdar@Sun.COM 1497917SReza.Sabdar@Sun.COM typedef struct tlm_info { 1507917SReza.Sabdar@Sun.COM int ti_init_done; /* initialization done ? */ 1517917SReza.Sabdar@Sun.COM int ti_library_count; /* number of libraries */ 1527917SReza.Sabdar@Sun.COM struct tlm_library *ti_library; /* first in chain */ 1537917SReza.Sabdar@Sun.COM struct tlm_chain_link *ti_job_stats; /* chain of job statistics */ 1547917SReza.Sabdar@Sun.COM } tlm_info_t; 1557917SReza.Sabdar@Sun.COM 1567917SReza.Sabdar@Sun.COM typedef struct tlm_chain_link { 1577917SReza.Sabdar@Sun.COM struct tlm_chain_link *tc_next; /* next blob of statistics */ 1587917SReza.Sabdar@Sun.COM struct tlm_chain_link *tc_prev; /* previous blob in the chain */ 1597917SReza.Sabdar@Sun.COM int tc_ref_count; /* number of routines */ 1607917SReza.Sabdar@Sun.COM void *tc_data; /* the data blob */ 1617917SReza.Sabdar@Sun.COM } tlm_chain_link_t; 1627917SReza.Sabdar@Sun.COM 1637917SReza.Sabdar@Sun.COM typedef struct tlm_robot { 1647917SReza.Sabdar@Sun.COM struct tlm_robot *tr_next; 1657917SReza.Sabdar@Sun.COM struct tlm_library *tr_library; 1667917SReza.Sabdar@Sun.COM int tr_number; 1677917SReza.Sabdar@Sun.COM } tlm_robot_t; 1687917SReza.Sabdar@Sun.COM 1697917SReza.Sabdar@Sun.COM typedef struct tlm_drive { 1707917SReza.Sabdar@Sun.COM struct tlm_drive *td_next; 1717917SReza.Sabdar@Sun.COM struct tlm_library *td_library; 1727917SReza.Sabdar@Sun.COM char td_job_name[TLM_MAX_BACKUP_JOB_NAME]; 1737917SReza.Sabdar@Sun.COM int td_number; /* number of this tape drive */ 1747917SReza.Sabdar@Sun.COM int td_element; /* the library's number for the drive */ 1757917SReza.Sabdar@Sun.COM struct scsi_link *td_slink; /* because the drive may be connected */ 1767917SReza.Sabdar@Sun.COM /* to a different SCSI card than the */ 1777917SReza.Sabdar@Sun.COM /* library */ 1787917SReza.Sabdar@Sun.COM short td_scsi_id; 1797917SReza.Sabdar@Sun.COM short td_lun; 1807917SReza.Sabdar@Sun.COM short td_volume_number; /* for current job */ 1817917SReza.Sabdar@Sun.COM /* an index into the tape set */ 1827917SReza.Sabdar@Sun.COM int td_fd; /* I/O file descriptor */ 1837917SReza.Sabdar@Sun.COM int td_errno; /* system error number */ 1847917SReza.Sabdar@Sun.COM long td_exists : 1; 1857917SReza.Sabdar@Sun.COM 1867917SReza.Sabdar@Sun.COM } tlm_drive_t; 1877917SReza.Sabdar@Sun.COM 1887917SReza.Sabdar@Sun.COM typedef struct tlm_slot { 1897917SReza.Sabdar@Sun.COM struct tlm_slot *ts_next; 1907917SReza.Sabdar@Sun.COM struct tlm_library *ts_library; 1917917SReza.Sabdar@Sun.COM int ts_number; /* number of this slot */ 1927917SReza.Sabdar@Sun.COM int ts_element; 1937917SReza.Sabdar@Sun.COM short ts_use_count; /* number of times used since loaded */ 1947917SReza.Sabdar@Sun.COM long ts_status_full : 1; 1957917SReza.Sabdar@Sun.COM } tlm_slot_t; 1967917SReza.Sabdar@Sun.COM 1977917SReza.Sabdar@Sun.COM typedef struct tlm_library { 1987917SReza.Sabdar@Sun.COM struct tlm_library *tl_next; 1997917SReza.Sabdar@Sun.COM int tl_number; /* number of this tape library */ 2007917SReza.Sabdar@Sun.COM long tl_capability_robot : 1, 2017917SReza.Sabdar@Sun.COM tl_capability_door : 1, 2027917SReza.Sabdar@Sun.COM tl_capability_lock : 1, 2037917SReza.Sabdar@Sun.COM tl_capability_slots : 1, 2047917SReza.Sabdar@Sun.COM tl_capability_export : 1, 2057917SReza.Sabdar@Sun.COM tl_capability_drives : 1, 2067917SReza.Sabdar@Sun.COM tl_capability_barcodes : 1, 2077917SReza.Sabdar@Sun.COM tl_ghost_drives : 1; 2087917SReza.Sabdar@Sun.COM /* 2097917SReza.Sabdar@Sun.COM * "ghost_drives" is used to make sure that 2107917SReza.Sabdar@Sun.COM * all drives claimed by the library really 2117917SReza.Sabdar@Sun.COM * exist ... libraries have been known to lie. 2127917SReza.Sabdar@Sun.COM */ 2137917SReza.Sabdar@Sun.COM struct scsi_link *tl_slink; 2147917SReza.Sabdar@Sun.COM 2157917SReza.Sabdar@Sun.COM int tl_robot_count; 2167917SReza.Sabdar@Sun.COM tlm_robot_t *tl_robot; 2177917SReza.Sabdar@Sun.COM int tl_drive_count; 2187917SReza.Sabdar@Sun.COM tlm_drive_t *tl_drive; 2197917SReza.Sabdar@Sun.COM int tl_slot_count; 2207917SReza.Sabdar@Sun.COM tlm_slot_t *tl_slot; 2217917SReza.Sabdar@Sun.COM } tlm_library_t; 2227917SReza.Sabdar@Sun.COM 2238193SReza.Sabdar@Sun.COM typedef struct { 2248193SReza.Sabdar@Sun.COM #ifdef _BIG_ENDIAN 2258193SReza.Sabdar@Sun.COM uint8_t di_peripheral_qual : 3, 2268193SReza.Sabdar@Sun.COM di_peripheral_dev_type : 5; 2278193SReza.Sabdar@Sun.COM uint8_t di_page_code; 2288193SReza.Sabdar@Sun.COM uint16_t di_page_length; 2298193SReza.Sabdar@Sun.COM #else 2308193SReza.Sabdar@Sun.COM uint8_t di_peripheral_dev_type : 5, 2318193SReza.Sabdar@Sun.COM di_peripheral_qual : 3; 2328193SReza.Sabdar@Sun.COM uint8_t di_page_code; 2338193SReza.Sabdar@Sun.COM uint16_t di_page_length; 2348193SReza.Sabdar@Sun.COM #endif 2358193SReza.Sabdar@Sun.COM } device_ident_header_t; 2368193SReza.Sabdar@Sun.COM 2378193SReza.Sabdar@Sun.COM typedef struct { 2388193SReza.Sabdar@Sun.COM #ifdef _BIG_ENDIAN 2398193SReza.Sabdar@Sun.COM uint8_t ni_proto_ident : 4, 2408193SReza.Sabdar@Sun.COM ni_code_set : 4; 2418193SReza.Sabdar@Sun.COM 2428193SReza.Sabdar@Sun.COM uint8_t ni_PIV : 1, 2438193SReza.Sabdar@Sun.COM : 1, 2448193SReza.Sabdar@Sun.COM ni_asso : 2, 2458193SReza.Sabdar@Sun.COM ni_ident_type : 4; 2468193SReza.Sabdar@Sun.COM 2478193SReza.Sabdar@Sun.COM uint8_t ni_reserved; 2488193SReza.Sabdar@Sun.COM uint8_t ni_ident_length; 2498193SReza.Sabdar@Sun.COM #else 2508193SReza.Sabdar@Sun.COM uint8_t ni_code_set : 4, 2518193SReza.Sabdar@Sun.COM ni_proto_ident : 4; 2528193SReza.Sabdar@Sun.COM 2538193SReza.Sabdar@Sun.COM uint8_t ni_ident_type : 4, 2548193SReza.Sabdar@Sun.COM ni_asso : 2, 2558193SReza.Sabdar@Sun.COM : 1, 2568193SReza.Sabdar@Sun.COM ni_PIV : 1; 2578193SReza.Sabdar@Sun.COM uint8_t ni_reserved; 2588193SReza.Sabdar@Sun.COM uint8_t ni_ident_length; 2598193SReza.Sabdar@Sun.COM #endif 2608193SReza.Sabdar@Sun.COM } name_ident_t; 2618193SReza.Sabdar@Sun.COM 2627917SReza.Sabdar@Sun.COM #define TLM_NO_ERRORS 0x00000000 2637917SReza.Sabdar@Sun.COM #define TLM_ERROR_BUSY 0x00000001 2647917SReza.Sabdar@Sun.COM #define TLM_ERROR_INTERNAL 0x00000002 2657917SReza.Sabdar@Sun.COM #define TLM_ERROR_NO_ROBOTS 0x00000003 2667917SReza.Sabdar@Sun.COM #define TLM_TIMEOUT 0x00000004 2677917SReza.Sabdar@Sun.COM #define TLM_ERROR_RANGE 0x00000005 2687917SReza.Sabdar@Sun.COM #define TLM_EMPTY 0x00000006 2697917SReza.Sabdar@Sun.COM #define TLM_DRIVE_NOT_ASSIGNED 0x00000007 2707917SReza.Sabdar@Sun.COM #define TLM_NO_TAPE_NAME 0x00000008 2717917SReza.Sabdar@Sun.COM #define TLM_NO_BACKUP_DIR 0x00000009 2727917SReza.Sabdar@Sun.COM #define TLM_NO_BACKUP_HARDWARE 0x0000000a 2737917SReza.Sabdar@Sun.COM #define TLM_NO_SOURCE_FILE 0x0000000b 2747917SReza.Sabdar@Sun.COM #define TLM_NO_FREE_TAPES 0x0000000c 2757917SReza.Sabdar@Sun.COM #define TLM_EOT 0x0000000d 2767917SReza.Sabdar@Sun.COM #define TLM_SERIAL_NOT_FOUND 0x0000000e 2777917SReza.Sabdar@Sun.COM #define TLM_SMALL_READ 0x0000000f 2787917SReza.Sabdar@Sun.COM #define TLM_NO_RESTORE_FILE 0x00000010 2797917SReza.Sabdar@Sun.COM #define TLM_EOF 0x00000011 2807917SReza.Sabdar@Sun.COM #define TLM_NO_DIRECTORY 0x00000012 2817917SReza.Sabdar@Sun.COM #define TLM_NO_MEMORY 0x00000013 2827917SReza.Sabdar@Sun.COM #define TLM_WRITE_ERROR 0x00000014 2837917SReza.Sabdar@Sun.COM #define TLM_NO_SCRATCH_SPACE 0x00000015 2847917SReza.Sabdar@Sun.COM #define TLM_INVALID 0x00000016 2857917SReza.Sabdar@Sun.COM #define TLM_MOVE 0x00000017 2867917SReza.Sabdar@Sun.COM #define TLM_SKIP 0x00000018 2877917SReza.Sabdar@Sun.COM #define TLM_OPEN_ERR 0x00000019 2887917SReza.Sabdar@Sun.COM 2897917SReza.Sabdar@Sun.COM 2907917SReza.Sabdar@Sun.COM #define TLM_MAX_TAPE_DRIVES 16 2917917SReza.Sabdar@Sun.COM #define TLM_NAME_SIZE 100 2927917SReza.Sabdar@Sun.COM #define TLM_MAX_TAR_IMAGE 017777777770 2937917SReza.Sabdar@Sun.COM 2947917SReza.Sabdar@Sun.COM #define TLM_VOLNAME_MAX_LENGTH 255 2957917SReza.Sabdar@Sun.COM #define NAME_MAX 255 2967917SReza.Sabdar@Sun.COM 2977917SReza.Sabdar@Sun.COM #define TLM_MAGIC "ustar " 2987917SReza.Sabdar@Sun.COM #define TLM_SNAPSHOT_PREFIX ".zfs" 2997917SReza.Sabdar@Sun.COM #define TLM_SNAPSHOT_DIR ".zfs/snapshot" 3007917SReza.Sabdar@Sun.COM 3017917SReza.Sabdar@Sun.COM #define RECORDSIZE 512 3027917SReza.Sabdar@Sun.COM #define NAMSIZ 100 3037917SReza.Sabdar@Sun.COM 3047917SReza.Sabdar@Sun.COM typedef struct tlm_tar_hdr { 3057917SReza.Sabdar@Sun.COM char th_name[TLM_NAME_SIZE]; 3067917SReza.Sabdar@Sun.COM char th_mode[8]; 3077917SReza.Sabdar@Sun.COM char th_uid[8]; 3087917SReza.Sabdar@Sun.COM char th_gid[8]; 3097917SReza.Sabdar@Sun.COM char th_size[12]; 3107917SReza.Sabdar@Sun.COM char th_mtime[12]; 3117917SReza.Sabdar@Sun.COM char th_chksum[8]; 3127917SReza.Sabdar@Sun.COM char th_linkflag; 3137917SReza.Sabdar@Sun.COM char th_linkname[TLM_NAME_SIZE]; 3147917SReza.Sabdar@Sun.COM char th_magic[8]; 3158540SReza.Sabdar@Sun.COM char th_uname[32]; 3168540SReza.Sabdar@Sun.COM char th_gname[32]; 3177917SReza.Sabdar@Sun.COM union { 3187917SReza.Sabdar@Sun.COM struct { 3197917SReza.Sabdar@Sun.COM char th_devmajor[8]; 3207917SReza.Sabdar@Sun.COM char th_devminor[8]; 3217917SReza.Sabdar@Sun.COM } th_dev; 3227917SReza.Sabdar@Sun.COM char th_hlink_ino[12]; 3237917SReza.Sabdar@Sun.COM } th_shared; 3247917SReza.Sabdar@Sun.COM } tlm_tar_hdr_t; 3257917SReza.Sabdar@Sun.COM 3267917SReza.Sabdar@Sun.COM 3277917SReza.Sabdar@Sun.COM 3287917SReza.Sabdar@Sun.COM /* 3297917SReza.Sabdar@Sun.COM * The linkflag defines the type of file 3307917SReza.Sabdar@Sun.COM */ 3317917SReza.Sabdar@Sun.COM #define LF_OLDNORMAL '\0' /* Normal disk file, Unix compat */ 3327917SReza.Sabdar@Sun.COM #define LF_NORMAL '0' /* Normal disk file */ 3337917SReza.Sabdar@Sun.COM #define LF_LINK '1' /* Link to previously dumped file */ 3347917SReza.Sabdar@Sun.COM #define LF_SYMLINK '2' /* Symbolic link */ 3357917SReza.Sabdar@Sun.COM #define LF_CHR '3' /* Character special file */ 3367917SReza.Sabdar@Sun.COM #define LF_BLK '4' /* Block special file */ 3377917SReza.Sabdar@Sun.COM #define LF_DIR '5' /* Directory */ 3387917SReza.Sabdar@Sun.COM #define LF_FIFO '6' /* FIFO special file */ 3397917SReza.Sabdar@Sun.COM #define LF_CONTIG '7' /* Contiguous file */ 3407917SReza.Sabdar@Sun.COM /* Further link types may be defined later. */ 3417917SReza.Sabdar@Sun.COM 3427917SReza.Sabdar@Sun.COM #define LF_DUMPDIR 'D' 3437917SReza.Sabdar@Sun.COM /* 3447917SReza.Sabdar@Sun.COM * This is a dir entry that contains 3457917SReza.Sabdar@Sun.COM * the names of files that were in 3467917SReza.Sabdar@Sun.COM * the dir at the time the dump 3477917SReza.Sabdar@Sun.COM * was made 3487917SReza.Sabdar@Sun.COM */ 3497917SReza.Sabdar@Sun.COM #define LF_HUMONGUS 'H' 3507917SReza.Sabdar@Sun.COM /* 3517917SReza.Sabdar@Sun.COM * Identifies the NEXT file on the tape 3527917SReza.Sabdar@Sun.COM * as a HUGE file 3537917SReza.Sabdar@Sun.COM */ 3547917SReza.Sabdar@Sun.COM #define LF_LONGLINK 'K' 3557917SReza.Sabdar@Sun.COM /* 3567917SReza.Sabdar@Sun.COM * Identifies the NEXT file on the tape 3577917SReza.Sabdar@Sun.COM * as having a long linkname 3587917SReza.Sabdar@Sun.COM */ 3597917SReza.Sabdar@Sun.COM #define LF_LONGNAME 'L' 3607917SReza.Sabdar@Sun.COM /* 3617917SReza.Sabdar@Sun.COM * Identifies the NEXT file on the tape 3627917SReza.Sabdar@Sun.COM * as having a long name. 3637917SReza.Sabdar@Sun.COM */ 3647917SReza.Sabdar@Sun.COM #define LF_MULTIVOL 'M' 3657917SReza.Sabdar@Sun.COM /* 3667917SReza.Sabdar@Sun.COM * This is the continuation 3677917SReza.Sabdar@Sun.COM * of a file that began on another 3687917SReza.Sabdar@Sun.COM * volume 3697917SReza.Sabdar@Sun.COM */ 3707917SReza.Sabdar@Sun.COM 3717917SReza.Sabdar@Sun.COM #define LF_VOLHDR 'V' /* This file is a tape/volume header */ 3727917SReza.Sabdar@Sun.COM /* Ignore it on extraction */ 3737917SReza.Sabdar@Sun.COM 3747917SReza.Sabdar@Sun.COM #define LF_ACL 'A' /* Access Control List */ 3757917SReza.Sabdar@Sun.COM 3767917SReza.Sabdar@Sun.COM #define LF_XATTR 'E' /* Extended attribute */ 3777917SReza.Sabdar@Sun.COM 3787917SReza.Sabdar@Sun.COM #define KILOBYTE 1024 3797917SReza.Sabdar@Sun.COM 3807917SReza.Sabdar@Sun.COM 3817917SReza.Sabdar@Sun.COM /* 3827917SReza.Sabdar@Sun.COM * ACL support structure 3837917SReza.Sabdar@Sun.COM */ 3847917SReza.Sabdar@Sun.COM typedef struct sec_attr { 3857917SReza.Sabdar@Sun.COM char attr_type; 3867917SReza.Sabdar@Sun.COM char attr_len[7]; 3877917SReza.Sabdar@Sun.COM char attr_info[TLM_MAX_ACL_TXT]; 3887917SReza.Sabdar@Sun.COM } sec_attr_t; 3897917SReza.Sabdar@Sun.COM 3907917SReza.Sabdar@Sun.COM typedef struct tlm_acls { 3917917SReza.Sabdar@Sun.COM int acl_checkpointed : 1, /* are checkpoints active ? */ 3927917SReza.Sabdar@Sun.COM acl_clear_archive : 1, /* clear archive bit ? */ 3937917SReza.Sabdar@Sun.COM acl_overwrite : 1, /* always overwrite ? */ 3947917SReza.Sabdar@Sun.COM acl_update : 1, /* only update ? */ 3957917SReza.Sabdar@Sun.COM acl_non_trivial : 1; /* real ACLs? */ 3967917SReza.Sabdar@Sun.COM /* 3977917SReza.Sabdar@Sun.COM * The following fields are here to allow 3987917SReza.Sabdar@Sun.COM * the backup reader to open a file one time 3997917SReza.Sabdar@Sun.COM * and keep the information for ACL, ATTRs, 4007917SReza.Sabdar@Sun.COM * and reading the file. 4017917SReza.Sabdar@Sun.COM */ 4027917SReza.Sabdar@Sun.COM sec_attr_t acl_info; 4037917SReza.Sabdar@Sun.COM 4047917SReza.Sabdar@Sun.COM char acl_root_dir[TLM_VOLNAME_MAX_LENGTH]; /* name of root filesystem */ 4057917SReza.Sabdar@Sun.COM fs_fhandle_t acl_dir_fh; /* parent dir's info */ 4067917SReza.Sabdar@Sun.COM fs_fhandle_t acl_fil_fh; /* file's info */ 4077917SReza.Sabdar@Sun.COM struct stat64 acl_attr; /* file system attributes */ 4088540SReza.Sabdar@Sun.COM char uname[32]; 4098540SReza.Sabdar@Sun.COM char gname[32]; 4107917SReza.Sabdar@Sun.COM } tlm_acls_t; 4117917SReza.Sabdar@Sun.COM 4127917SReza.Sabdar@Sun.COM 4137917SReza.Sabdar@Sun.COM /* 4147917SReza.Sabdar@Sun.COM * Tape manager's data archiving ops vector 4157917SReza.Sabdar@Sun.COM * 4167917SReza.Sabdar@Sun.COM * This vector represents the granular operations for 4177917SReza.Sabdar@Sun.COM * performing backup/restore. Each backend should provide 4187917SReza.Sabdar@Sun.COM * such a vector interface in order to be invoked by NDMP 4197917SReza.Sabdar@Sun.COM * server. 4207917SReza.Sabdar@Sun.COM * The reserved callbacks are kept for different backup 4217917SReza.Sabdar@Sun.COM * types which are volume-based rather than file-based 4227917SReza.Sabdar@Sun.COM * e.g. zfs send. 4237917SReza.Sabdar@Sun.COM */ 4247917SReza.Sabdar@Sun.COM typedef struct tm_ops { 4257917SReza.Sabdar@Sun.COM char *tm_name; 4267917SReza.Sabdar@Sun.COM int (*tm_putfile)(); 4277917SReza.Sabdar@Sun.COM int (*tm_putdir)(); 4287917SReza.Sabdar@Sun.COM int (*tm_putvol)(); /* Reserved */ 4297917SReza.Sabdar@Sun.COM int (*tm_getfile)(); 4307917SReza.Sabdar@Sun.COM int (*tm_getdir)(); 4317917SReza.Sabdar@Sun.COM int (*tm_getvol)(); /* Reserved */ 4327917SReza.Sabdar@Sun.COM } tm_ops_t; 4337917SReza.Sabdar@Sun.COM 4347917SReza.Sabdar@Sun.COM /* The checksum field is filled with this while the checksum is computed. */ 4357917SReza.Sabdar@Sun.COM #define CHKBLANKS " " /* 8 blanks, no null */ 4367917SReza.Sabdar@Sun.COM 4377917SReza.Sabdar@Sun.COM #define LONGNAME_PREFIX "././_LoNg_NaMe_" 4387917SReza.Sabdar@Sun.COM extern void ndmp_log(ulong_t, char *, char *, ...); 4397917SReza.Sabdar@Sun.COM char ndmp_log_info[256]; 4407917SReza.Sabdar@Sun.COM #define NDMP_LOG(p, ...) { \ 4417917SReza.Sabdar@Sun.COM (void) snprintf(ndmp_log_info, \ 4427917SReza.Sabdar@Sun.COM sizeof (ndmp_log_info), \ 4437917SReza.Sabdar@Sun.COM "[%d][%s:%d]", \ 4447917SReza.Sabdar@Sun.COM (int)pthread_self(), __func__, __LINE__); \ 4457917SReza.Sabdar@Sun.COM ndmp_log(p, ndmp_log_info, __VA_ARGS__); \ 4467917SReza.Sabdar@Sun.COM } 4477917SReza.Sabdar@Sun.COM extern void *ndmp_malloc(size_t size); 4487917SReza.Sabdar@Sun.COM 4497917SReza.Sabdar@Sun.COM /* 4507917SReza.Sabdar@Sun.COM * ZFS metadata plug-in module structures 4517917SReza.Sabdar@Sun.COM */ 4527917SReza.Sabdar@Sun.COM #define ZFS_MAX_PROPS 100 4537917SReza.Sabdar@Sun.COM #define ZFS_META_MAGIC "ZFSMETA" 45411170SReza.Sabdar@Sun.COM #define ZFS_META_MAGIC_EXT "ZFSMETA2" 4557917SReza.Sabdar@Sun.COM 45611170SReza.Sabdar@Sun.COM /* Add new major/minor for header changes */ 45711170SReza.Sabdar@Sun.COM typedef enum { 45811170SReza.Sabdar@Sun.COM META_HDR_MAJOR_0, /* Original format */ 45911170SReza.Sabdar@Sun.COM META_HDR_MAJOR_1, /* Extended format */ 46011170SReza.Sabdar@Sun.COM } ndmp_metadata_header_major_t; 46111170SReza.Sabdar@Sun.COM 46211170SReza.Sabdar@Sun.COM #define META_HDR_MAJOR_VERSION META_HDR_MAJOR_1 46311170SReza.Sabdar@Sun.COM 46411170SReza.Sabdar@Sun.COM typedef enum { 46511170SReza.Sabdar@Sun.COM META_HDR_MINOR_0, 46611170SReza.Sabdar@Sun.COM } ndmp_metadata_header_minor_t; 46711170SReza.Sabdar@Sun.COM 46811170SReza.Sabdar@Sun.COM #define META_HDR_MINOR_VERSION META_HDR_MINOR_0 46911170SReza.Sabdar@Sun.COM 47011170SReza.Sabdar@Sun.COM /* To support older backups */ 4717917SReza.Sabdar@Sun.COM typedef struct ndmp_metadata_property { 4727917SReza.Sabdar@Sun.COM char mp_name[NAME_MAX]; 4737917SReza.Sabdar@Sun.COM char mp_value[NAME_MAX]; 4747917SReza.Sabdar@Sun.COM char mp_source[NAME_MAX]; 4757917SReza.Sabdar@Sun.COM } ndmp_metadata_property_t; 4767917SReza.Sabdar@Sun.COM 47711170SReza.Sabdar@Sun.COM typedef struct ndmp_metadata_property_ext { 47811170SReza.Sabdar@Sun.COM char mp_name[ZFS_MAXNAMELEN]; 47911170SReza.Sabdar@Sun.COM char mp_value[ZFS_MAXPROPLEN]; 48011170SReza.Sabdar@Sun.COM char mp_source[ZFS_MAXPROPLEN]; 48111170SReza.Sabdar@Sun.COM } ndmp_metadata_property_ext_t; 48211170SReza.Sabdar@Sun.COM 48311170SReza.Sabdar@Sun.COM typedef struct ndmp_metadata_top_header { 48411170SReza.Sabdar@Sun.COM char th_plname[100]; 48511170SReza.Sabdar@Sun.COM uint_t th_plversion; 48611170SReza.Sabdar@Sun.COM char th_magic[10]; 48711170SReza.Sabdar@Sun.COM void *th_reserved_1; 48811170SReza.Sabdar@Sun.COM int th_count; 48911170SReza.Sabdar@Sun.COM } ndmp_metadata_top_header_t; 49011170SReza.Sabdar@Sun.COM 49111170SReza.Sabdar@Sun.COM /* Original metadata format */ 4927917SReza.Sabdar@Sun.COM typedef struct ndmp_metadata_header { 49311170SReza.Sabdar@Sun.COM ndmp_metadata_top_header_t nh_hdr; 4947917SReza.Sabdar@Sun.COM char nh_dataset[NAME_MAX]; 4957917SReza.Sabdar@Sun.COM ndmp_metadata_property_t nh_property[1]; 4967917SReza.Sabdar@Sun.COM } ndmp_metadata_header_t; 4977917SReza.Sabdar@Sun.COM 49811170SReza.Sabdar@Sun.COM /* Extended metadata format */ 49911170SReza.Sabdar@Sun.COM typedef struct ndmp_metadata_header_ext { 50011170SReza.Sabdar@Sun.COM ndmp_metadata_top_header_t nh_hdr; 50111170SReza.Sabdar@Sun.COM char nh_dataset[ZFS_MAXNAMELEN]; 50211170SReza.Sabdar@Sun.COM int32_t nh_total_bytes; 50311170SReza.Sabdar@Sun.COM int32_t nh_major; 50411170SReza.Sabdar@Sun.COM int32_t nh_minor; 50511170SReza.Sabdar@Sun.COM ndmp_metadata_property_ext_t nh_property[1]; 50611170SReza.Sabdar@Sun.COM } ndmp_metadata_header_ext_t; 50711170SReza.Sabdar@Sun.COM 50811170SReza.Sabdar@Sun.COM #define nh_plname nh_hdr.th_plname 50911170SReza.Sabdar@Sun.COM #define nh_plversion nh_hdr.th_plversion 51011170SReza.Sabdar@Sun.COM #define nh_magic nh_hdr.th_magic 51111170SReza.Sabdar@Sun.COM #define nh_count nh_hdr.th_count 51211170SReza.Sabdar@Sun.COM 51311170SReza.Sabdar@Sun.COM typedef struct ndmp_metadata_handle { 51411170SReza.Sabdar@Sun.COM void *ml_handle; 51511170SReza.Sabdar@Sun.COM int32_t ml_quota_prop; 51611170SReza.Sabdar@Sun.COM union { 51711170SReza.Sabdar@Sun.COM ndmp_metadata_header_t *u_hdr; 51811170SReza.Sabdar@Sun.COM ndmp_metadata_header_ext_t *u_xhdr; 51911170SReza.Sabdar@Sun.COM } ml_hdr_u; 52011170SReza.Sabdar@Sun.COM } ndmp_metadata_handle_t; 52111170SReza.Sabdar@Sun.COM 52211170SReza.Sabdar@Sun.COM #define ml_hdr ml_hdr_u.u_hdr 52311170SReza.Sabdar@Sun.COM #define ml_xhdr ml_hdr_u.u_xhdr 52411170SReza.Sabdar@Sun.COM 5257917SReza.Sabdar@Sun.COM /* 5267917SReza.Sabdar@Sun.COM * Node in struct hardlink_q 5277917SReza.Sabdar@Sun.COM * 5287917SReza.Sabdar@Sun.COM * inode: the inode of the hardlink 5297917SReza.Sabdar@Sun.COM * path: the name of the hardlink, used during restore 5307917SReza.Sabdar@Sun.COM * offset: tape offset of the data records for the hardlink, used during backup 5317917SReza.Sabdar@Sun.COM * is_tmp: indicate whether the file was created temporarily for restoring 5327917SReza.Sabdar@Sun.COM * other links during a non-DAR partial restore 5337917SReza.Sabdar@Sun.COM */ 5347917SReza.Sabdar@Sun.COM struct hardlink_node { 5357917SReza.Sabdar@Sun.COM unsigned long inode; 5367917SReza.Sabdar@Sun.COM char *path; 5377917SReza.Sabdar@Sun.COM unsigned long long offset; 5387917SReza.Sabdar@Sun.COM int is_tmp; 5397917SReza.Sabdar@Sun.COM SLIST_ENTRY(hardlink_node) next_hardlink; 5407917SReza.Sabdar@Sun.COM }; 5417917SReza.Sabdar@Sun.COM 5427917SReza.Sabdar@Sun.COM /* 5437917SReza.Sabdar@Sun.COM * Hardlinks that have been backed up or restored. 5447917SReza.Sabdar@Sun.COM * 5457917SReza.Sabdar@Sun.COM * During backup, each node represents a file whose 5467917SReza.Sabdar@Sun.COM * (1) inode has multiple links 5477917SReza.Sabdar@Sun.COM * (2) data has been backed up 5487917SReza.Sabdar@Sun.COM * 5497917SReza.Sabdar@Sun.COM * When we run into a file with multiple links during backup, 5507917SReza.Sabdar@Sun.COM * we first check the list to see whether a file with the same inode 5517917SReza.Sabdar@Sun.COM * has been backed up. If yes, we backup an empty record, while 5527917SReza.Sabdar@Sun.COM * making the file history of this file contain the data offset 5537917SReza.Sabdar@Sun.COM * of the offset of the file that has been backed up. If no, 5547917SReza.Sabdar@Sun.COM * we backup this file, and add an entry to the list. 5557917SReza.Sabdar@Sun.COM * 5567917SReza.Sabdar@Sun.COM * During restore, each node represents an LF_LINK type record whose 5577917SReza.Sabdar@Sun.COM * data has been restored (v.s. a hard link has been created). 5587917SReza.Sabdar@Sun.COM * 5597917SReza.Sabdar@Sun.COM * During restore, when we run into a record of LF_LINK type, we 5607917SReza.Sabdar@Sun.COM * first check the queue to see whether a file with the same inode 5617917SReza.Sabdar@Sun.COM * has been restored. If yes, we create a hardlink to it. 5627917SReza.Sabdar@Sun.COM * If no, we restore the data, and add an entry to the list. 5637917SReza.Sabdar@Sun.COM */ 5647917SReza.Sabdar@Sun.COM struct hardlink_q { 5657917SReza.Sabdar@Sun.COM struct hardlink_node *slh_first; 5667917SReza.Sabdar@Sun.COM }; 5677917SReza.Sabdar@Sun.COM 5687917SReza.Sabdar@Sun.COM /* Utility functions from handling hardlink */ 5697917SReza.Sabdar@Sun.COM extern struct hardlink_q *hardlink_q_init(); 5707917SReza.Sabdar@Sun.COM extern void hardlink_q_cleanup(struct hardlink_q *qhead); 5717917SReza.Sabdar@Sun.COM extern int hardlink_q_get(struct hardlink_q *qhead, unsigned long inode, 5727917SReza.Sabdar@Sun.COM unsigned long long *offset, char **path); 5737917SReza.Sabdar@Sun.COM extern int hardlink_q_add(struct hardlink_q *qhead, unsigned long inode, 5747917SReza.Sabdar@Sun.COM unsigned long long offset, char *path, int is_tmp); 5757917SReza.Sabdar@Sun.COM 5767917SReza.Sabdar@Sun.COM #endif /* !_TLM_H_ */ 577