/* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * BSD 3 Clause License * * Copyright (c) 2007, The Storage Networking Industry Association. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * - Neither the name of The Storage Networking Industry Association (SNIA) * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * This defines structures used to pass information between threads * for both local-backup and NDMP. * */ #ifndef _TLM_BUFFERS_H_ #define _TLM_BUFFERS_H_ #include #include #include #include #include #include "tlm.h" #ifndef RECORDSIZE #define RECORDSIZE 512 #endif /* !RECORDSIZE */ #define DOTDOT_DIR ".." #define IS_DOTDOT(s) (strcmp(s, DOTDOT_DIR) == 0) #define SLASH '/' #define NDMP_MAX_SELECTIONS 64 /* * List of files/directories to be excluded from backup list. */ #define EXCL_PROC "/proc" #define EXCL_TMP "/tmp" typedef struct tlm_buffer { char *tb_buffer_data; /* area to be used for I/O */ long tb_buffer_size; /* number of valid bytes in the buffer */ long tb_buffer_spot; /* current location in the I/O buffer */ longlong_t tb_seek_spot; /* for BACKUP */ /* where in the file this buffer stops. */ /* this is used for the Multi Volume */ /* Header record. */ longlong_t tb_file_size; /* for BACKUP */ /* how much of the file is left. */ long tb_full : 1, tb_eot : 1, tb_eof : 1; int tb_errno; /* I/O error values */ } tlm_buffer_t; /* * Flags for tlm_buffers. */ #define TLM_BUF_IN_READY 0x00000001 #define TLM_BUF_OUT_READY 0x00000002 typedef struct tlm_buffers { int tbs_ref; /* number of threads using this */ short tbs_buffer_in; /* buffer to be filled */ short tbs_buffer_out; /* buffer to be emptied */ /* these are indexes into tlm_buffers */ mutex_t tbs_mtx; cond_t tbs_in_cv; cond_t tbs_out_cv; uint32_t tbs_flags; long tbs_data_transfer_size; /* max size of read/write buffer */ longlong_t tbs_offset; tlm_buffer_t tbs_buffer[TLM_TAPE_BUFFERS]; } tlm_buffers_t; typedef struct tlm_cmd { int tc_ref; /* number of threads using this */ mutex_t tc_mtx; cond_t tc_cv; uint32_t tc_flags; int tc_reader; /* writer to reader */ int tc_writer; /* reader to writer */ char tc_file_name[TLM_MAX_PATH_NAME]; /* name of last file */ /* for restore */ tlm_buffers_t *tc_buffers; /* reader-writer speedup buffers */ } tlm_cmd_t; typedef struct tlm_commands { int tcs_reader; /* commands to all readers */ int tcs_writer; /* commands to all writers */ int tcs_reader_count; /* number of active readers */ int tcs_writer_count; /* number of active writers */ int tcs_error; /* worker errors */ char tcs_message[TLM_LINE_SIZE]; /* worker message back to user */ tlm_cmd_t *tcs_command; /* IPC area between read-write */ } tlm_commands_t; typedef struct tlm_job_stats { char js_job_name[TLM_MAX_BACKUP_JOB_NAME]; longlong_t js_bytes_total; /* tape bytes in or out so far */ longlong_t js_bytes_in_file; /* remaining data in a file */ longlong_t js_files_so_far; /* files backed up so far */ longlong_t js_files_total; /* number of files to be backed up */ int js_errors; time_t js_start_time; /* start time (GMT time) */ time_t js_start_ltime; /* start time (local time) */ time_t js_stop_time; /* stop time (local time) */ time_t js_chkpnt_time; /* checkpoint creation (GMT time) */ void *js_callbacks; } tlm_job_stats_t; struct full_dir_info { fs_fhandle_t fd_dir_fh; char fd_dir_name[TLM_MAX_PATH_NAME]; }; /* * For more info please refer to * "Functional Specification Document: Usgin new LBR engine in NDMP", * Revision: 0.2 * Document No.: 101438. * the "File history of backup" section */ typedef struct lbr_fhlog_call_backs { void *fh_cookie; int (*fh_logpname)(); int (*fh_log_dir)(); int (*fh_log_node)(); } lbr_fhlog_call_backs_t; typedef struct bk_selector { void *bs_cookie; int bs_level; int bs_ldate; boolean_t (*bs_fn)(struct bk_selector *bks, struct stat64 *s); } bk_selector_t; /* * Call back structure to create new name for objects at restore time. */ struct rs_name_maker; typedef char *(*rsm_fp_t)(struct rs_name_maker *, char *buf, int pos, char *path); struct rs_name_maker { rsm_fp_t rn_fp; void *rn_nlp; }; /* * RSFLG_OVR_*: overwriting policies. Refer to LBR FSD for more info. * RSFLG_MATCH_WCARD: should wildcards be supported in the selection list. * RSFLG_IGNORE_CASE: should the compare be case-insensetive. NDMP needs * case-sensetive name comparison. */ #define RSFLG_OVR_ALWAYS 0x00000001 #define RSFLG_OVR_NEVER 0x00000002 #define RSFLG_OVR_UPDATE 0x00000004 #define RSFLG_MATCH_WCARD 0x00000008 #define RSFLG_IGNORE_CASE 0x00000010 /* * Different cases where two paths can match with each other. * Parent means that the current path, is parent of an entry in * the selection list. * Child means that the current path, is child of an entry in the * selection list. */ #define PM_NONE 0 #define PM_EXACT 1 #define PM_PARENT 2 #define PM_CHILD 3 extern tlm_job_stats_t *tlm_new_job_stats(char *); extern tlm_job_stats_t *tlm_ref_job_stats(char *); extern void tlm_un_ref_job_stats(char *); extern boolean_t tlm_is_excluded(char *, char *, char **); extern char *tlm_build_snapshot_name(char *, char *, char *); extern char *tlm_remove_checkpoint(char *, char *); extern tlm_buffers_t *tlm_allocate_buffers(boolean_t, long); extern tlm_buffer_t *tlm_buffer_advance_in_idx(tlm_buffers_t *); extern tlm_buffer_t *tlm_buffer_advance_out_idx(tlm_buffers_t *); extern tlm_buffer_t *tlm_buffer_in_buf(tlm_buffers_t *, int *); extern tlm_buffer_t *tlm_buffer_out_buf(tlm_buffers_t *, int *); extern void tlm_buffer_mark_empty(tlm_buffer_t *); extern void tlm_buffer_release_in_buf(tlm_buffers_t *); extern void tlm_buffer_release_out_buf(tlm_buffers_t *); extern void tlm_buffer_in_buf_wait(tlm_buffers_t *); extern void tlm_buffer_out_buf_wait(tlm_buffers_t *); extern void tlm_buffer_in_buf_timed_wait(tlm_buffers_t *, unsigned); extern void tlm_buffer_out_buf_timed_wait(tlm_buffers_t *, unsigned); extern char *tlm_get_write_buffer(long, long *, tlm_buffers_t *, int); extern char *tlm_get_read_buffer(int, int *, tlm_buffers_t *, int *); extern void tlm_unget_read_buffer(tlm_buffers_t *, int); extern void tlm_unget_write_buffer(tlm_buffers_t *, int); extern void tlm_release_buffers(tlm_buffers_t *); extern tlm_cmd_t *tlm_create_reader_writer_ipc(boolean_t, long); extern void tlm_release_reader_writer_ipc(tlm_cmd_t *); extern void tlm_cmd_wait(tlm_cmd_t *, uint32_t); extern void tlm_cmd_signal(tlm_cmd_t *, uint32_t); typedef int (*path_hist_func_t)(lbr_fhlog_call_backs_t *, char *, struct stat64 *, u_longlong_t); typedef int (*dir_hist_func_t)(lbr_fhlog_call_backs_t *, char *, struct stat64 *); typedef int (*node_hist_func_t)(lbr_fhlog_call_backs_t *, char *, char *, struct stat64 *, u_longlong_t); lbr_fhlog_call_backs_t *lbrlog_callbacks_init(void *, path_hist_func_t, dir_hist_func_t, node_hist_func_t); typedef struct { tlm_commands_t *ba_commands; tlm_cmd_t *ba_cmd; char *ba_job; char *ba_dir; char *ba_sels[NDMP_MAX_SELECTIONS]; pthread_barrier_t ba_barrier; } tlm_backup_restore_arg_t; extern void lbrlog_callbacks_done(lbr_fhlog_call_backs_t *); extern boolean_t tlm_cat_path(char *, char *, char *); extern char *trim_name(char *); extern struct full_dir_info *dup_dir_info(struct full_dir_info *); extern void write_tar_eof(tlm_cmd_t *); extern int tlm_get_chkpnt_time(char *, int, time_t *, char *); extern struct full_dir_info *tlm_new_dir_info(fs_fhandle_t *, char *, char *); extern void tlm_release_list(char **); extern longlong_t tlm_get_data_offset(tlm_cmd_t *); extern int tlm_tarhdr_size(void); #endif /* _TLM_BUFFERS_H_ */