e461e790745fa2b2374e5734984107c7672c6c49Randall Ralphs * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens * Copyright (c) 2015 by Delphix. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_BACKUP_JOB_NAME 32 /* max size of a job's name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_TAPE_BUFFERS 10 /* number of rotating tape buffers */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_LINE_SIZE 128 /* size of text messages */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_ABORT 0x99999999 /* abandon the run */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_PATH_NAME (PATH_MAX + TLM_EXTRA_SPACE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ACL_ENTRY_SIZE (ENTRYTYPELEN + ID_STR_MAX + PERMS + APPENDED_ID_MAX)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_MAX_ACL_TXT MAX_ACL_ENTRIES * ACL_ENTRY_SIZE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* operation flags */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define TLM_OP_CHOOSE_ARCHIVE 0x00000001 /* look for archive bit */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Synchronization flags used when launching the TLM threads.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_library *ti_library; /* first in chain */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_chain_link *ti_job_stats; /* chain of job statistics */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_chain_link *tc_next; /* next blob of statistics */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct tlm_chain_link *tc_prev; /* previous blob in the chain */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int td_element; /* the library's number for the drive */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct scsi_link *td_slink; /* because the drive may be connected */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* to a different SCSI card than the */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* library */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* an index into the tape set */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar short ts_use_count; /* number of times used since loaded */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int tl_number; /* number of this tape library */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * "ghost_drives" is used to make sure that
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * all drives claimed by the library really
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * exist ... libraries have been known to lie.
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdartypedef struct {
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdartypedef struct {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The linkflag defines the type of file
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_OLDNORMAL '\0' /* Normal disk file, Unix compat */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_LINK '1' /* Link to previously dumped file */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Further link types may be defined later. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is a dir entry that contains
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the names of files that were in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the dir at the time the dump
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Identifies the NEXT file on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as a HUGE file
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Identifies the NEXT file on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as having a long linkname
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Identifies the NEXT file on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * as having a long name.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is the continuation
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * of a file that began on another
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define LF_VOLHDR 'V' /* This file is a tape/volume header */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Ignore it on extraction */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ACL support structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int acl_checkpointed : 1, /* are checkpoints active ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar acl_clear_archive : 1, /* clear archive bit ? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The following fields are here to allow
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the backup reader to open a file one time
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and keep the information for ACL, ATTRs,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and reading the file.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char acl_root_dir[TLM_VOLNAME_MAX_LENGTH]; /* name of root filesystem */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fs_fhandle_t acl_dir_fh; /* parent dir's info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 acl_attr; /* file system attributes */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Tape manager's data archiving ops vector
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This vector represents the granular operations for
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * performing backup/restore. Each backend should provide
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * such a vector interface in order to be invoked by NDMP
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The reserved callbacks are kept for different backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * types which are volume-based rather than file-based
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * e.g. zfs send.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* The checksum field is filled with this while the checksum is computed. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_log(ulong_t, char *, char *, ...);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "[%d][%s:%d]", \
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ZFS metadata plug-in module structures
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* Add new major/minor for header changes */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef enum {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef enum {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* To support older backups */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* Original metadata format */
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar/* Extended metadata format */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Node in struct hardlink_q
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * inode: the inode of the hardlink
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path: the name of the hardlink, used during restore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * offset: tape offset of the data records for the hardlink, used during backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is_tmp: indicate whether the file was created temporarily for restoring
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * other links during a non-DAR partial restore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Hardlinks that have been backed up or restored.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * During backup, each node represents a file whose
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * (1) inode has multiple links
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * (2) data has been backed up
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * When we run into a file with multiple links during backup,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * we first check the list to see whether a file with the same inode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * has been backed up. If yes, we backup an empty record, while
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * making the file history of this file contain the data offset
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * of the offset of the file that has been backed up. If no,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * we backup this file, and add an entry to the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * During restore, each node represents an LF_LINK type record whose
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data has been restored (v.s. a hard link has been created).
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * During restore, when we run into a record of LF_LINK type, we
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * first check the queue to see whether a file with the same inode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * has been restored. If yes, we create a hardlink to it.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If no, we restore the data, and add an entry to the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Utility functions from handling hardlink */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void hardlink_q_cleanup(struct hardlink_q *qhead);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int hardlink_q_get(struct hardlink_q *qhead, unsigned long inode,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int hardlink_q_add(struct hardlink_q *qhead, unsigned long inode,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned long long offset, char *path, int is_tmp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif /* !_TLM_H_ */