xref: /onnv-gate/usr/src/cmd/ndmpd/include/tlm.h (revision 13024:9c1800b4023e)
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