xref: /illumos-gate/usr/src/cmd/ndmpd/include/tlm.h (revision b0d8599c)
12654012fSReza Sabdar /*
2e461e790SRandall Ralphs  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
39adfa60dSMatthew Ahrens  * Copyright (c) 2015 by Delphix. All rights reserved.
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:
1482049ff5SToomas Soome  *	- Redistributions of source code must retain the above copyright
152654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer.
162654012fSReza Sabdar  *
1782049ff5SToomas Soome  *	- 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>
5442ed7838SReza Sabdar #include <sys/fs/zfs.h>
5542ed7838SReza Sabdar #include <libzfs.h>
562654012fSReza Sabdar 
572654012fSReza Sabdar #define	IS_SET(f, m)	(((f) & (m)) != 0)
582654012fSReza Sabdar 
592654012fSReza Sabdar #define	TLM_MAX_BACKUP_JOB_NAME	32	/* max size of a job's name */
602654012fSReza Sabdar #define	TLM_TAPE_BUFFERS	10	/* number of rotating tape buffers */
612654012fSReza Sabdar #define	TLM_LINE_SIZE		128	/* size of text messages */
622654012fSReza Sabdar 
632654012fSReza Sabdar 
642654012fSReza Sabdar #define	TLM_BACKUP_RUN		0x00000001
652654012fSReza Sabdar #define	TLM_RESTORE_RUN		0x00000002
662654012fSReza Sabdar #define	TLM_STOP		0x00000009	/* graceful stop */
672654012fSReza Sabdar #define	TLM_ABORT		0x99999999	/* abandon the run */
682654012fSReza Sabdar 
692654012fSReza Sabdar #define	TLM_EXTRA_SPACE		64
702654012fSReza Sabdar #define	TLM_MAX_PATH_NAME	(PATH_MAX + TLM_EXTRA_SPACE)
712654012fSReza Sabdar 
722654012fSReza Sabdar #define	ENTRYTYPELEN	14
732654012fSReza Sabdar #define	PERMS		4
742654012fSReza Sabdar #define	ID_STR_MAX	20
752654012fSReza Sabdar #define	APPENDED_ID_MAX	(ID_STR_MAX + 1)
762654012fSReza Sabdar #define	ACL_ENTRY_SIZE	(ENTRYTYPELEN + ID_STR_MAX + PERMS + APPENDED_ID_MAX)
772654012fSReza Sabdar #define	TLM_MAX_ACL_TXT	MAX_ACL_ENTRIES * ACL_ENTRY_SIZE
782654012fSReza Sabdar 
792654012fSReza Sabdar 
802654012fSReza Sabdar /* operation flags */
812654012fSReza Sabdar #define	TLM_OP_CHOOSE_ARCHIVE	0x00000001	/* look for archive bit */
822654012fSReza Sabdar 
832654012fSReza Sabdar /*
842654012fSReza Sabdar  * Synchronization flags used when launching the TLM threads.
852654012fSReza Sabdar  */
862654012fSReza Sabdar #define	TLM_TAPE_READER		0x00000001
872654012fSReza Sabdar #define	TLM_TAPE_WRITER		0x00000002
882654012fSReza Sabdar #define	TLM_SOCK_READER		0x00000004
892654012fSReza Sabdar #define	TLM_SOCK_WRITER		0x00000008
902654012fSReza Sabdar #define	TLM_BUF_READER		0x00000010
912654012fSReza Sabdar #define	TLM_BUF_WRITER		0x00000020
922654012fSReza Sabdar #define	TLM_TAR_READER		0x00000040
932654012fSReza Sabdar #define	TLM_TAR_WRITER		0x00000080
942654012fSReza Sabdar 
957bc22e45SReza Sabdar #define	SCSI_SERIAL_PAGE	0x80
967bc22e45SReza Sabdar #define	SCSI_DEVICE_IDENT_PAGE	0x83
977bc22e45SReza Sabdar #define	SCMD_READ_ELEMENT_STATUS	0xB8
982654012fSReza Sabdar 
99b6b15642SReza Sabdar #define	OCTAL7CHAR	07777777
100b6b15642SReza Sabdar #define	SYSATTR_RDONLY	"SUNWattr_ro"
101b6b15642SReza Sabdar #define	SYSATTR_RW	"SUNWattr_rw"
102b6b15642SReza Sabdar 
1032654012fSReza Sabdar typedef	int (*func_t)();
1042654012fSReza Sabdar 
1057bc22e45SReza Sabdar typedef struct scsi_serial {
1067bc22e45SReza Sabdar 	int sr_flags;
1077bc22e45SReza Sabdar 	char sr_num[16];
1087bc22e45SReza Sabdar } scsi_serial_t;
1097bc22e45SReza Sabdar 
1102654012fSReza Sabdar typedef struct fs_fhandle {
1112654012fSReza Sabdar 	int fh_fid;
1122654012fSReza Sabdar 	char *fh_fpath;
1132654012fSReza Sabdar } fs_fhandle_t;
1142654012fSReza Sabdar 
1152654012fSReza Sabdar typedef struct scsi_link {
11682049ff5SToomas Soome 	struct scsi_link	*sl_next;
11782049ff5SToomas Soome 	struct scsi_link	*sl_prev;
11882049ff5SToomas Soome 	struct scsi_adapter	*sl_sa;
1192654012fSReza Sabdar 	unsigned int		sl_sid;
1202654012fSReza Sabdar 	unsigned int		sl_lun;
1212654012fSReza Sabdar 	unsigned int		sl_requested_max_active;
1222654012fSReza Sabdar 	unsigned int		sl_granted_max_active;
1232654012fSReza Sabdar 	unsigned int		sl_n_active;
1242654012fSReza Sabdar 	unsigned int		sl_type; /* SCSI device type */
1252654012fSReza Sabdar } scsi_link_t;
1262654012fSReza Sabdar 
1272654012fSReza Sabdar typedef struct scsi_adapter {
1282654012fSReza Sabdar 	struct scsi_adapter	*sa_next;
1292654012fSReza Sabdar 	char			sa_name[16];
1302654012fSReza Sabdar 	struct scsi_link	sa_link_head;
1312654012fSReza Sabdar } scsi_adapter_t;
1322654012fSReza Sabdar 
1332654012fSReza Sabdar typedef struct sasd_drive {
1342654012fSReza Sabdar 	char		sd_name[256];
1352654012fSReza Sabdar 	char		sd_vendor[8 + 1];
1362654012fSReza Sabdar 	char		sd_id[16 + 1];
1372654012fSReza Sabdar 	char		sd_rev[4 + 1];
1387bc22e45SReza Sabdar 	char		sd_serial[16 + 1];
1397bc22e45SReza Sabdar 	char		sd_wwn[32 + 1];
1402654012fSReza Sabdar } sasd_drive_t;
1412654012fSReza Sabdar 
1422654012fSReza Sabdar typedef struct scsi_sasd_drive {
1432654012fSReza Sabdar 	sasd_drive_t	ss_sd;
1442654012fSReza Sabdar 	scsi_link_t	ss_slink;
1452654012fSReza Sabdar } scsi_sasd_drive_t;
1462654012fSReza Sabdar 
1472654012fSReza Sabdar 
1482654012fSReza Sabdar #define	DEFAULT_SLINK_MAX_XFER	(64*1024)
1492654012fSReza Sabdar 
1502654012fSReza Sabdar typedef struct	tlm_info {
1512654012fSReza Sabdar 	int			ti_init_done;	/* initialization done ? */
1522654012fSReza Sabdar 	int			ti_library_count; /* number of libraries */
1532654012fSReza Sabdar 	struct tlm_library	*ti_library;	/* first in chain */
1542654012fSReza Sabdar 	struct tlm_chain_link	*ti_job_stats;  /* chain of job statistics */
1552654012fSReza Sabdar } tlm_info_t;
1562654012fSReza Sabdar 
1572654012fSReza Sabdar typedef struct	tlm_chain_link {
1582654012fSReza Sabdar 	struct tlm_chain_link	*tc_next;	/* next blob of statistics */
1592654012fSReza Sabdar 	struct tlm_chain_link	*tc_prev;	/* previous blob in the chain */
1602654012fSReza Sabdar 	int	tc_ref_count;			/* number of routines */
1612654012fSReza Sabdar 	void	*tc_data;			/* the data blob */
1622654012fSReza Sabdar } tlm_chain_link_t;
1632654012fSReza Sabdar 
1642654012fSReza Sabdar typedef struct	tlm_robot {
1652654012fSReza Sabdar 	struct tlm_robot	*tr_next;
1662654012fSReza Sabdar 	struct tlm_library	*tr_library;
1672654012fSReza Sabdar 	int	tr_number;
1682654012fSReza Sabdar } tlm_robot_t;
1692654012fSReza Sabdar 
1702654012fSReza Sabdar typedef struct	tlm_drive {
1712654012fSReza Sabdar 	struct tlm_drive	*td_next;
1722654012fSReza Sabdar 	struct tlm_library	*td_library;
1732654012fSReza Sabdar 	char	td_job_name[TLM_MAX_BACKUP_JOB_NAME];
1742654012fSReza Sabdar 	int	td_number;		/* number of this tape drive */
1752654012fSReza Sabdar 	int	td_element;		/* the library's number for the drive */
1762654012fSReza Sabdar 	struct	scsi_link *td_slink;	/* because the drive may be connected */
1772654012fSReza Sabdar 					/* to a different SCSI card than the */
1782654012fSReza Sabdar 					/* library */
1792654012fSReza Sabdar 	short	td_scsi_id;
1802654012fSReza Sabdar 	short	td_lun;
1812654012fSReza Sabdar 	short	td_volume_number;	/* for current job */
1822654012fSReza Sabdar 					/*  an index into the tape set */
1832654012fSReza Sabdar 	int	td_fd;			/* I/O file descriptor */
1842654012fSReza Sabdar 	int	td_errno;		/* system error number */
1852654012fSReza Sabdar 	long	td_exists	: 1;
1862654012fSReza Sabdar 
1872654012fSReza Sabdar } tlm_drive_t;
1882654012fSReza Sabdar 
1892654012fSReza Sabdar typedef struct	tlm_slot {
1902654012fSReza Sabdar 	struct tlm_slot		*ts_next;
1912654012fSReza Sabdar 	struct tlm_library	*ts_library;
1922654012fSReza Sabdar 	int	ts_number;		/* number of this slot */
1932654012fSReza Sabdar 	int	ts_element;
1942654012fSReza Sabdar 	short	ts_use_count;		/* number of times used since loaded */
1952654012fSReza Sabdar 	long	ts_status_full		: 1;
1962654012fSReza Sabdar } tlm_slot_t;
1972654012fSReza Sabdar 
1982654012fSReza Sabdar typedef struct	tlm_library {
1992654012fSReza Sabdar 	struct tlm_library	*tl_next;
2002654012fSReza Sabdar 	int	tl_number;		/* number of this tape library */
2012654012fSReza Sabdar 	long	tl_capability_robot	: 1,
2022654012fSReza Sabdar 		tl_capability_door	: 1,
2032654012fSReza Sabdar 		tl_capability_lock	: 1,
2042654012fSReza Sabdar 		tl_capability_slots	: 1,
2052654012fSReza Sabdar 		tl_capability_export	: 1,
2062654012fSReza Sabdar 		tl_capability_drives	: 1,
2072654012fSReza Sabdar 		tl_capability_barcodes	: 1,
2082654012fSReza Sabdar 		tl_ghost_drives		: 1;
2092654012fSReza Sabdar 		/*
2102654012fSReza Sabdar 		 * "ghost_drives" is used to make sure that
2112654012fSReza Sabdar 		 * all drives claimed by the library really
2122654012fSReza Sabdar 		 * exist ... libraries have been known to lie.
2132654012fSReza Sabdar 		 */
2142654012fSReza Sabdar 	struct	scsi_link *tl_slink;
2152654012fSReza Sabdar 
2162654012fSReza Sabdar 	int		tl_robot_count;
2172654012fSReza Sabdar 	tlm_robot_t	*tl_robot;
2182654012fSReza Sabdar 	int		tl_drive_count;
2192654012fSReza Sabdar 	tlm_drive_t	*tl_drive;
2202654012fSReza Sabdar 	int		tl_slot_count;
2212654012fSReza Sabdar 	tlm_slot_t	*tl_slot;
2222654012fSReza Sabdar } tlm_library_t;
2232654012fSReza Sabdar 
2247bc22e45SReza Sabdar typedef struct {
2257bc22e45SReza Sabdar #ifdef _BIG_ENDIAN
2267bc22e45SReza Sabdar 	uint8_t	di_peripheral_qual	: 3,
2277bc22e45SReza Sabdar 		di_peripheral_dev_type	: 5;
2287bc22e45SReza Sabdar 	uint8_t	di_page_code;
2297bc22e45SReza Sabdar 	uint16_t	di_page_length;
2307bc22e45SReza Sabdar #else
2317bc22e45SReza Sabdar 	uint8_t	di_peripheral_dev_type	: 5,
2327bc22e45SReza Sabdar 		di_peripheral_qual	: 3;
2337bc22e45SReza Sabdar 	uint8_t	di_page_code;
2347bc22e45SReza Sabdar 	uint16_t	di_page_length;
2357bc22e45SReza Sabdar #endif
2367bc22e45SReza Sabdar } device_ident_header_t;
2377bc22e45SReza Sabdar 
2387bc22e45SReza Sabdar typedef struct {
2397bc22e45SReza Sabdar #ifdef _BIG_ENDIAN
2407bc22e45SReza Sabdar 	uint8_t	ni_proto_ident	: 4,
2417bc22e45SReza Sabdar 		ni_code_set	: 4;
2427bc22e45SReza Sabdar 
2437bc22e45SReza Sabdar 	uint8_t	ni_PIV		: 1,
2447bc22e45SReza Sabdar 				: 1,
2457bc22e45SReza Sabdar 		ni_asso		: 2,
2467bc22e45SReza Sabdar 		ni_ident_type	: 4;
2477bc22e45SReza Sabdar 
2487bc22e45SReza Sabdar 	uint8_t	ni_reserved;
2497bc22e45SReza Sabdar 	uint8_t	ni_ident_length;
2507bc22e45SReza Sabdar #else
2517bc22e45SReza Sabdar 	uint8_t	ni_code_set	: 4,
2527bc22e45SReza Sabdar 		ni_proto_ident	: 4;
2537bc22e45SReza Sabdar 
2547bc22e45SReza Sabdar 	uint8_t	ni_ident_type	: 4,
2557bc22e45SReza Sabdar 		ni_asso		: 2,
2567bc22e45SReza Sabdar 				: 1,
2577bc22e45SReza Sabdar 		ni_PIV		: 1;
2587bc22e45SReza Sabdar 	uint8_t	ni_reserved;
2597bc22e45SReza Sabdar 	uint8_t	ni_ident_length;
2607bc22e45SReza Sabdar #endif
2617bc22e45SReza Sabdar } name_ident_t;
2627bc22e45SReza Sabdar 
2632654012fSReza Sabdar #define	TLM_NO_ERRORS			0x00000000
2642654012fSReza Sabdar #define	TLM_ERROR_BUSY			0x00000001
2652654012fSReza Sabdar #define	TLM_ERROR_INTERNAL		0x00000002
2662654012fSReza Sabdar #define	TLM_ERROR_NO_ROBOTS		0x00000003
2672654012fSReza Sabdar #define	TLM_TIMEOUT			0x00000004
2682654012fSReza Sabdar #define	TLM_ERROR_RANGE			0x00000005
2692654012fSReza Sabdar #define	TLM_EMPTY			0x00000006
2702654012fSReza Sabdar #define	TLM_DRIVE_NOT_ASSIGNED		0x00000007
2712654012fSReza Sabdar #define	TLM_NO_TAPE_NAME		0x00000008
2722654012fSReza Sabdar #define	TLM_NO_BACKUP_DIR		0x00000009
2732654012fSReza Sabdar #define	TLM_NO_BACKUP_HARDWARE		0x0000000a
2742654012fSReza Sabdar #define	TLM_NO_SOURCE_FILE		0x0000000b
2752654012fSReza Sabdar #define	TLM_NO_FREE_TAPES		0x0000000c
2762654012fSReza Sabdar #define	TLM_EOT				0x0000000d
2772654012fSReza Sabdar #define	TLM_SERIAL_NOT_FOUND		0x0000000e
2782654012fSReza Sabdar #define	TLM_SMALL_READ			0x0000000f
2792654012fSReza Sabdar #define	TLM_NO_RESTORE_FILE		0x00000010
2802654012fSReza Sabdar #define	TLM_EOF				0x00000011
2812654012fSReza Sabdar #define	TLM_NO_DIRECTORY		0x00000012
2822654012fSReza Sabdar #define	TLM_NO_MEMORY			0x00000013
2832654012fSReza Sabdar #define	TLM_WRITE_ERROR			0x00000014
2842654012fSReza Sabdar #define	TLM_NO_SCRATCH_SPACE		0x00000015
2852654012fSReza Sabdar #define	TLM_INVALID			0x00000016
2862654012fSReza Sabdar #define	TLM_MOVE			0x00000017
2872654012fSReza Sabdar #define	TLM_SKIP			0x00000018
2882654012fSReza Sabdar #define	TLM_OPEN_ERR			0x00000019
2892654012fSReza Sabdar 
2902654012fSReza Sabdar 
2912654012fSReza Sabdar #define	TLM_MAX_TAPE_DRIVES	16
2922654012fSReza Sabdar #define	TLM_NAME_SIZE		100
2932654012fSReza Sabdar #define	TLM_MAX_TAR_IMAGE	017777777770
2942654012fSReza Sabdar 
2952654012fSReza Sabdar #define	TLM_VOLNAME_MAX_LENGTH	255
2962654012fSReza Sabdar #define	NAME_MAX		255
2972654012fSReza Sabdar 
2982654012fSReza Sabdar #define	TLM_MAGIC		"ustar  "
2992654012fSReza Sabdar #define	TLM_SNAPSHOT_PREFIX	".zfs"
3002654012fSReza Sabdar #define	TLM_SNAPSHOT_DIR	".zfs/snapshot"
3012654012fSReza Sabdar 
3022654012fSReza Sabdar #define	RECORDSIZE	512
3032654012fSReza Sabdar #define	NAMSIZ	100
3042654012fSReza Sabdar 
3052654012fSReza Sabdar typedef struct	tlm_tar_hdr {
3062654012fSReza Sabdar 	char	th_name[TLM_NAME_SIZE];
3072654012fSReza Sabdar 	char	th_mode[8];
3082654012fSReza Sabdar 	char	th_uid[8];
3092654012fSReza Sabdar 	char	th_gid[8];
3102654012fSReza Sabdar 	char	th_size[12];
3112654012fSReza Sabdar 	char	th_mtime[12];
3122654012fSReza Sabdar 	char	th_chksum[8];
3132654012fSReza Sabdar 	char	th_linkflag;
3142654012fSReza Sabdar 	char	th_linkname[TLM_NAME_SIZE];
3152654012fSReza Sabdar 	char	th_magic[8];
316b6b15642SReza Sabdar 	char	th_uname[32];
317b6b15642SReza Sabdar 	char	th_gname[32];
3182654012fSReza Sabdar 	union {
3192654012fSReza Sabdar 		struct {
3202654012fSReza Sabdar 			char	th_devmajor[8];
3212654012fSReza Sabdar 			char	th_devminor[8];
3222654012fSReza Sabdar 		} th_dev;
3232654012fSReza Sabdar 		char	th_hlink_ino[12];
3242654012fSReza Sabdar 	} th_shared;
3252654012fSReza Sabdar } tlm_tar_hdr_t;
3262654012fSReza Sabdar 
3272654012fSReza Sabdar 
3282654012fSReza Sabdar 
3292654012fSReza Sabdar /*
3302654012fSReza Sabdar  * The linkflag defines the type of file
3312654012fSReza Sabdar  */
3322654012fSReza Sabdar #define	LF_OLDNORMAL	'\0'		/* Normal disk file, Unix compat */
3332654012fSReza Sabdar #define	LF_NORMAL	'0'		/* Normal disk file */
3342654012fSReza Sabdar #define	LF_LINK		'1'		/* Link to previously dumped file */
3352654012fSReza Sabdar #define	LF_SYMLINK	'2'		/* Symbolic link */
3362654012fSReza Sabdar #define	LF_CHR		'3'		/* Character special file */
3372654012fSReza Sabdar #define	LF_BLK		'4'		/* Block special file */
3382654012fSReza Sabdar #define	LF_DIR		'5'		/* Directory */
3392654012fSReza Sabdar #define	LF_FIFO		'6'		/* FIFO special file */
3402654012fSReza Sabdar #define	LF_CONTIG	'7'		/* Contiguous file */
3412654012fSReza Sabdar /* Further link types may be defined later. */
3422654012fSReza Sabdar 
3432654012fSReza Sabdar #define	LF_DUMPDIR	'D'
3442654012fSReza Sabdar 					/*
3452654012fSReza Sabdar 					 * This is a dir entry that contains
3462654012fSReza Sabdar 					 * the names of files that were in
3472654012fSReza Sabdar 					 * the dir at the time the dump
3482654012fSReza Sabdar 					 * was made
3492654012fSReza Sabdar 					 */
3502654012fSReza Sabdar #define	LF_HUMONGUS	'H'
3512654012fSReza Sabdar 					/*
3522654012fSReza Sabdar 					 * Identifies the NEXT file on the tape
3532654012fSReza Sabdar 					 * as a HUGE file
3542654012fSReza Sabdar 					 */
3552654012fSReza Sabdar #define	LF_LONGLINK	'K'
3562654012fSReza Sabdar 					/*
3572654012fSReza Sabdar 					 * Identifies the NEXT file on the tape
3582654012fSReza Sabdar 					 * as having a long linkname
3592654012fSReza Sabdar 					 */
3602654012fSReza Sabdar #define	LF_LONGNAME	'L'
3612654012fSReza Sabdar 					/*
3622654012fSReza Sabdar 					 * Identifies the NEXT file on the tape
3632654012fSReza Sabdar 					 * as having a long name.
3642654012fSReza Sabdar 					 */
3652654012fSReza Sabdar #define	LF_MULTIVOL	'M'
3662654012fSReza Sabdar 					/*
3672654012fSReza Sabdar 					 * This is the continuation
3682654012fSReza Sabdar 					 * of a file that began on another
3692654012fSReza Sabdar 					 * volume
3702654012fSReza Sabdar 					 */
3712654012fSReza Sabdar 
3722654012fSReza Sabdar #define	LF_VOLHDR	'V'		/* This file is a tape/volume header */
3732654012fSReza Sabdar 					/* Ignore it on extraction */
3742654012fSReza Sabdar 
3752654012fSReza Sabdar #define	LF_ACL		'A'		/* Access Control List */
3762654012fSReza Sabdar 
3772654012fSReza Sabdar #define	LF_XATTR	'E'		/* Extended attribute */
3782654012fSReza Sabdar 
3792654012fSReza Sabdar #define	KILOBYTE	1024
3802654012fSReza Sabdar 
3812654012fSReza Sabdar 
3822654012fSReza Sabdar /*
3832654012fSReza Sabdar  * ACL support structure
3842654012fSReza Sabdar  */
3852654012fSReza Sabdar typedef struct sec_attr {
3862654012fSReza Sabdar 	char attr_type;
3872654012fSReza Sabdar 	char attr_len[7];
3882654012fSReza Sabdar 	char attr_info[TLM_MAX_ACL_TXT];
3892654012fSReza Sabdar } sec_attr_t;
3902654012fSReza Sabdar 
3912654012fSReza Sabdar typedef struct	tlm_acls {
3922654012fSReza Sabdar 	int	acl_checkpointed	: 1,	/* are checkpoints active ? */
3932654012fSReza Sabdar 		acl_clear_archive	: 1,	/* clear archive bit ? */
3942654012fSReza Sabdar 		acl_overwrite		: 1,	/* always overwrite ? */
3952654012fSReza Sabdar 		acl_update		: 1,	/* only update ? */
3962654012fSReza Sabdar 		acl_non_trivial		: 1;	/* real ACLs? */
3972654012fSReza Sabdar 		/*
3982654012fSReza Sabdar 		 * The following fields are here to allow
3992654012fSReza Sabdar 		 * the backup reader to open a file one time
4002654012fSReza Sabdar 		 * and keep the information for ACL, ATTRs,
4012654012fSReza Sabdar 		 * and reading the file.
4022654012fSReza Sabdar 		 */
4032654012fSReza Sabdar 	sec_attr_t acl_info;
4042654012fSReza Sabdar 
4052654012fSReza Sabdar 	char acl_root_dir[TLM_VOLNAME_MAX_LENGTH]; /* name of root filesystem */
4062654012fSReza Sabdar 	fs_fhandle_t acl_dir_fh;		/* parent dir's info */
4072654012fSReza Sabdar 	fs_fhandle_t acl_fil_fh;		/* file's info */
4082654012fSReza Sabdar 	struct stat64 acl_attr;			/* file system attributes */
409b6b15642SReza Sabdar 	char uname[32];
410b6b15642SReza Sabdar 	char gname[32];
4112654012fSReza Sabdar } tlm_acls_t;
4122654012fSReza Sabdar 
4132654012fSReza Sabdar 
4142654012fSReza Sabdar /*
4152654012fSReza Sabdar  * Tape manager's data archiving ops vector
4162654012fSReza Sabdar  *
4172654012fSReza Sabdar  * This vector represents the granular operations for
4182654012fSReza Sabdar  * performing backup/restore. Each backend should provide
4192654012fSReza Sabdar  * such a vector interface in order to be invoked by NDMP
4202654012fSReza Sabdar  * server.
4212654012fSReza Sabdar  * The reserved callbacks are kept for different backup
4222654012fSReza Sabdar  * types which are volume-based rather than file-based
4232654012fSReza Sabdar  * e.g. zfs send.
4242654012fSReza Sabdar  */
4252654012fSReza Sabdar typedef struct tm_ops {
4262654012fSReza Sabdar 	char *tm_name;
4272654012fSReza Sabdar 	int (*tm_putfile)();
4282654012fSReza Sabdar 	int (*tm_putdir)();
4292654012fSReza Sabdar 	int (*tm_putvol)();	/* Reserved */
43082049ff5SToomas Soome 	void * (*tm_getfile)(void *);
4312654012fSReza Sabdar 	int (*tm_getdir)();
4322654012fSReza Sabdar 	int (*tm_getvol)();	/* Reserved */
4332654012fSReza Sabdar } tm_ops_t;
4342654012fSReza Sabdar 
4352654012fSReza Sabdar /* The checksum field is filled with this while the checksum is computed. */
4362654012fSReza Sabdar #define	CHKBLANKS	"        "	/* 8 blanks, no null */
4372654012fSReza Sabdar 
4382654012fSReza Sabdar #define	LONGNAME_PREFIX	"././_LoNg_NaMe_"
4392654012fSReza Sabdar extern void ndmp_log(ulong_t, char *, char *, ...);
440*b0d8599cSToomas Soome extern char ndmp_log_info[256];
4412654012fSReza Sabdar #define	NDMP_LOG(p, ...) { \
4422654012fSReza Sabdar 				(void) snprintf(ndmp_log_info, \
4432654012fSReza Sabdar 				    sizeof (ndmp_log_info), \
4442654012fSReza Sabdar 				    "[%d][%s:%d]", \
4452654012fSReza Sabdar 				    (int)pthread_self(), __func__, __LINE__); \
4462654012fSReza Sabdar 				ndmp_log(p, ndmp_log_info, __VA_ARGS__); \
4472654012fSReza Sabdar 			}
4482654012fSReza Sabdar extern void *ndmp_malloc(size_t size);
4492654012fSReza Sabdar 
4502654012fSReza Sabdar /*
4512654012fSReza Sabdar  * ZFS metadata plug-in module structures
4522654012fSReza Sabdar  */
4532654012fSReza Sabdar #define	ZFS_MAX_PROPS		100
4542654012fSReza Sabdar #define	ZFS_META_MAGIC		"ZFSMETA"
45542ed7838SReza Sabdar #define	ZFS_META_MAGIC_EXT	"ZFSMETA2"
4562654012fSReza Sabdar 
45742ed7838SReza Sabdar /* Add new major/minor for header changes */
45842ed7838SReza Sabdar typedef enum {
45942ed7838SReza Sabdar 	META_HDR_MAJOR_0,	/* Original format */
46042ed7838SReza Sabdar 	META_HDR_MAJOR_1,	/* Extended format */
46142ed7838SReza Sabdar } ndmp_metadata_header_major_t;
46242ed7838SReza Sabdar 
46342ed7838SReza Sabdar #define	META_HDR_MAJOR_VERSION	META_HDR_MAJOR_1
46442ed7838SReza Sabdar 
46542ed7838SReza Sabdar typedef enum {
46642ed7838SReza Sabdar 	META_HDR_MINOR_0,
46742ed7838SReza Sabdar } ndmp_metadata_header_minor_t;
46842ed7838SReza Sabdar 
46942ed7838SReza Sabdar #define	META_HDR_MINOR_VERSION	META_HDR_MINOR_0
47042ed7838SReza Sabdar 
47142ed7838SReza Sabdar /* To support older backups */
4722654012fSReza Sabdar typedef struct ndmp_metadata_property {
4732654012fSReza Sabdar 	char mp_name[NAME_MAX];
4742654012fSReza Sabdar 	char mp_value[NAME_MAX];
4752654012fSReza Sabdar 	char mp_source[NAME_MAX];
4762654012fSReza Sabdar } ndmp_metadata_property_t;
4772654012fSReza Sabdar 
47842ed7838SReza Sabdar typedef struct ndmp_metadata_property_ext {
4799adfa60dSMatthew Ahrens 	char mp_name[ZFS_MAX_DATASET_NAME_LEN];
48042ed7838SReza Sabdar 	char mp_value[ZFS_MAXPROPLEN];
48142ed7838SReza Sabdar 	char mp_source[ZFS_MAXPROPLEN];
48242ed7838SReza Sabdar } ndmp_metadata_property_ext_t;
48342ed7838SReza Sabdar 
48442ed7838SReza Sabdar typedef struct ndmp_metadata_top_header {
48542ed7838SReza Sabdar 	char th_plname[100];
48642ed7838SReza Sabdar 	uint_t th_plversion;
48742ed7838SReza Sabdar 	char th_magic[10];
48842ed7838SReza Sabdar 	void *th_reserved_1;
48942ed7838SReza Sabdar 	int th_count;
49042ed7838SReza Sabdar } ndmp_metadata_top_header_t;
49142ed7838SReza Sabdar 
49242ed7838SReza Sabdar /* Original metadata format */
4932654012fSReza Sabdar typedef struct ndmp_metadata_header {
49442ed7838SReza Sabdar 	ndmp_metadata_top_header_t nh_hdr;
4952654012fSReza Sabdar 	char nh_dataset[NAME_MAX];
4962654012fSReza Sabdar 	ndmp_metadata_property_t nh_property[1];
4972654012fSReza Sabdar } ndmp_metadata_header_t;
4982654012fSReza Sabdar 
49942ed7838SReza Sabdar /* Extended metadata format */
50042ed7838SReza Sabdar typedef struct ndmp_metadata_header_ext {
50142ed7838SReza Sabdar 	ndmp_metadata_top_header_t nh_hdr;
5029adfa60dSMatthew Ahrens 	char nh_dataset[ZFS_MAX_DATASET_NAME_LEN];
50342ed7838SReza Sabdar 	int32_t nh_total_bytes;
50442ed7838SReza Sabdar 	int32_t nh_major;
50542ed7838SReza Sabdar 	int32_t nh_minor;
50642ed7838SReza Sabdar 	ndmp_metadata_property_ext_t nh_property[1];
50742ed7838SReza Sabdar } ndmp_metadata_header_ext_t;
50842ed7838SReza Sabdar 
50942ed7838SReza Sabdar #define	nh_plname	nh_hdr.th_plname
51042ed7838SReza Sabdar #define	nh_plversion	nh_hdr.th_plversion
51142ed7838SReza Sabdar #define	nh_magic	nh_hdr.th_magic
51242ed7838SReza Sabdar #define	nh_count	nh_hdr.th_count
51342ed7838SReza Sabdar 
51442ed7838SReza Sabdar typedef struct ndmp_metadata_handle {
51542ed7838SReza Sabdar 	void *ml_handle;
51642ed7838SReza Sabdar 	int32_t ml_quota_prop;
51742ed7838SReza Sabdar 	union {
51842ed7838SReza Sabdar 		ndmp_metadata_header_t *u_hdr;
51942ed7838SReza Sabdar 		ndmp_metadata_header_ext_t *u_xhdr;
52042ed7838SReza Sabdar 	} ml_hdr_u;
52142ed7838SReza Sabdar } ndmp_metadata_handle_t;
52242ed7838SReza Sabdar 
52342ed7838SReza Sabdar #define	ml_hdr	ml_hdr_u.u_hdr
52442ed7838SReza Sabdar #define	ml_xhdr	ml_hdr_u.u_xhdr
52542ed7838SReza Sabdar 
5262654012fSReza Sabdar /*
5272654012fSReza Sabdar  * Node in struct hardlink_q
5282654012fSReza Sabdar  *
5292654012fSReza Sabdar  * inode: the inode of the hardlink
5302654012fSReza Sabdar  * path: the name of the hardlink, used during restore
5312654012fSReza Sabdar  * offset: tape offset of the data records for the hardlink, used during backup
5322654012fSReza Sabdar  * is_tmp: indicate whether the file was created temporarily for restoring
5332654012fSReza Sabdar  * other links during a non-DAR partial restore
5342654012fSReza Sabdar  */
5352654012fSReza Sabdar struct hardlink_node {
5362654012fSReza Sabdar 	unsigned long inode;
5372654012fSReza Sabdar 	char *path;
5382654012fSReza Sabdar 	unsigned long long offset;
5392654012fSReza Sabdar 	int is_tmp;
5402654012fSReza Sabdar 	SLIST_ENTRY(hardlink_node) next_hardlink;
5412654012fSReza Sabdar };
5422654012fSReza Sabdar 
5432654012fSReza Sabdar /*
5442654012fSReza Sabdar  * Hardlinks that have been backed up or restored.
5452654012fSReza Sabdar  *
5462654012fSReza Sabdar  * During backup, each node represents a file whose
5472654012fSReza Sabdar  *   (1) inode has multiple links
5482654012fSReza Sabdar  *   (2) data has been backed up
5492654012fSReza Sabdar  *
5502654012fSReza Sabdar  * When we run into a file with multiple links during backup,
5512654012fSReza Sabdar  * we first check the list to see whether a file with the same inode
5522654012fSReza Sabdar  * has been backed up.  If yes, we backup an empty record, while
5532654012fSReza Sabdar  * making the file history of this file contain the data offset
5542654012fSReza Sabdar  * of the offset of the file that has been backed up.  If no,
5552654012fSReza Sabdar  * we backup this file, and add an entry to the list.
5562654012fSReza Sabdar  *
5572654012fSReza Sabdar  * During restore, each node represents an LF_LINK type record whose
5582654012fSReza Sabdar  * data has been restored (v.s. a hard link has been created).
5592654012fSReza Sabdar  *
5602654012fSReza Sabdar  * During restore, when we run into a record of LF_LINK type, we
5612654012fSReza Sabdar  * first check the queue to see whether a file with the same inode
5622654012fSReza Sabdar  * has been restored.  If yes, we create a hardlink to it.
5632654012fSReza Sabdar  * If no, we restore the data, and add an entry to the list.
5642654012fSReza Sabdar  */
5652654012fSReza Sabdar struct hardlink_q {
5662654012fSReza Sabdar 	struct hardlink_node *slh_first;
5672654012fSReza Sabdar };
5682654012fSReza Sabdar 
5692654012fSReza Sabdar /* Utility functions from handling hardlink */
5702654012fSReza Sabdar extern struct hardlink_q *hardlink_q_init();
5712654012fSReza Sabdar extern void hardlink_q_cleanup(struct hardlink_q *qhead);
5722654012fSReza Sabdar extern int hardlink_q_get(struct hardlink_q *qhead, unsigned long inode,
5732654012fSReza Sabdar     unsigned long long *offset, char **path);
5742654012fSReza Sabdar extern int hardlink_q_add(struct hardlink_q *qhead, unsigned long inode,
5752654012fSReza Sabdar     unsigned long long offset, char *path, int is_tmp);
5762654012fSReza Sabdar 
5772654012fSReza Sabdar #endif	/* !_TLM_H_ */
578