Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 /*
      7  * BSD 3 Clause License
      8  *
      9  * Copyright (c) 2007, The Storage Networking Industry Association.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 	- Redistributions of source code must retain the above copyright
     15  *	  notice, this list of conditions and the following disclaimer.
     16  *
     17  * 	- Redistributions in binary form must reproduce the above copyright
     18  *	  notice, this list of conditions and the following disclaimer in
     19  *	  the documentation and/or other materials provided with the
     20  *	  distribution.
     21  *
     22  *	- Neither the name of The Storage Networking Industry Association (SNIA)
     23  *	  nor the names of its contributors may be used to endorse or promote
     24  *	  products derived from this software without specific prior written
     25  *	  permission.
     26  *
     27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     28  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     30  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37  * POSSIBILITY OF SUCH DAMAGE.
     38  */
     39 /*
     40  * This defines structures used to pass information between threads
     41  * for both local-backup and NDMP.
     42  *
     43  */
     44 
     45 #ifndef	_TLM_BUFFERS_H_
     46 #define	_TLM_BUFFERS_H_
     47 
     48 #include <sys/types.h>
     49 #include <stdlib.h>
     50 #include <limits.h>
     51 #include <sys/stat.h>
     52 #include <thread.h>
     53 #include "tlm.h"
     54 
     55 #ifndef RECORDSIZE
     56 #define	RECORDSIZE	512
     57 #endif /* !RECORDSIZE */
     58 
     59 #define	DOTDOT_DIR	".."
     60 #define	IS_DOTDOT(s)	(strcmp(s, DOTDOT_DIR) == 0)
     61 #define	SLASH	'/'
     62 
     63 #define	NDMP_MAX_SELECTIONS	64
     64 
     65 /*
     66  * List of files/directories to be excluded from backup list.
     67  */
     68 #define	EXCL_PROC	"/proc"
     69 #define	EXCL_TMP	"/tmp"
     70 
     71 
     72 typedef struct	tlm_buffer {
     73 	char	*tb_buffer_data;	/* area to be used for I/O */
     74 	long	tb_buffer_size;	/* number of valid bytes in the buffer */
     75 	long	tb_buffer_spot;	/* current location in the I/O buffer */
     76 	longlong_t tb_seek_spot;	/* for BACKUP */
     77 				/* where in the file this buffer stops. */
     78 				/* this is used for the Multi Volume */
     79 				/* Header record. */
     80 	longlong_t tb_file_size;	/* for BACKUP */
     81 					/* how much of the file is left. */
     82 	long	tb_full	: 1,
     83 		tb_eot	: 1,
     84 		tb_eof	: 1;
     85 	int	tb_errno;	/* I/O error values */
     86 } tlm_buffer_t;
     87 
     88 
     89 /*
     90  * Flags for tlm_buffers.
     91  */
     92 #define	TLM_BUF_IN_READY	0x00000001
     93 #define	TLM_BUF_OUT_READY	0x00000002
     94 
     95 typedef struct	tlm_buffers {
     96 	int	tbs_ref;	/* number of threads using this */
     97 	short	tbs_buffer_in;	/* buffer to be filled */
     98 	short	tbs_buffer_out;	/* buffer to be emptied */
     99 				/* these are indexes into tlm_buffers */
    100 	mutex_t	tbs_mtx;
    101 	cond_t	tbs_in_cv;
    102 	cond_t	tbs_out_cv;
    103 	uint32_t	tbs_flags;
    104 	long	tbs_data_transfer_size;	/* max size of read/write buffer */
    105 	longlong_t tbs_offset;
    106 	tlm_buffer_t tbs_buffer[TLM_TAPE_BUFFERS];
    107 } tlm_buffers_t;
    108 
    109 typedef struct	tlm_cmd {
    110 	int	tc_ref;			/* number of threads using this */
    111 	mutex_t	tc_mtx;
    112 	cond_t	tc_cv;
    113 	uint32_t	tc_flags;
    114 	int	tc_reader;		/* writer to reader */
    115 	int	tc_writer;		/* reader to writer */
    116 	char	tc_file_name[TLM_MAX_PATH_NAME]; /* name of last file */
    117 						/* for restore */
    118 	tlm_buffers_t *tc_buffers; /* reader-writer speedup buffers */
    119 } tlm_cmd_t;
    120 
    121 typedef struct	tlm_commands {
    122 	int	tcs_reader;	/* commands to all readers */
    123 	int	tcs_writer;	/* commands to all writers */
    124 	int	tcs_reader_count;	/* number of active readers */
    125 	int	tcs_writer_count;	/* number of active writers */
    126 	int	tcs_error;	/* worker errors */
    127 	char	tcs_message[TLM_LINE_SIZE]; /* worker message back to user */
    128 	tlm_cmd_t *tcs_command;	/* IPC area between read-write */
    129 } tlm_commands_t;
    130 
    131 
    132 typedef struct	tlm_job_stats {
    133 	char	js_job_name[TLM_MAX_BACKUP_JOB_NAME];
    134 	longlong_t js_bytes_total;	/* tape bytes in or out so far */
    135 	longlong_t js_bytes_in_file;	/* remaining data in a file */
    136 	longlong_t js_files_so_far;	/* files backed up so far */
    137 	longlong_t js_files_total;	/* number of files to be backed up */
    138 	int	js_errors;
    139 	time_t	js_start_time;		/* start time (GMT time) */
    140 	time_t	js_start_ltime;		/* start time (local time) */
    141 	time_t	js_stop_time;		/* stop time (local time) */
    142 	time_t	js_chkpnt_time;		/* checkpoint creation (GMT time) */
    143 	void	*js_callbacks;
    144 } tlm_job_stats_t;
    145 
    146 
    147 struct full_dir_info {
    148 	fs_fhandle_t fd_dir_fh;
    149 	char fd_dir_name[TLM_MAX_PATH_NAME];
    150 };
    151 
    152 /*
    153  * For more info please refer to
    154  * "Functional Specification Document: Usgin new LBR engine in NDMP",
    155  * Revision: 0.2
    156  * Document No.: 101438.
    157  * the "File history of backup" section
    158  */
    159 typedef struct lbr_fhlog_call_backs {
    160 	void *fh_cookie;
    161 	int (*fh_logpname)();
    162 	int (*fh_log_dir)();
    163 	int (*fh_log_node)();
    164 } lbr_fhlog_call_backs_t;
    165 
    166 
    167 typedef struct bk_selector {
    168 	void *bs_cookie;
    169 	int bs_level;
    170 	int bs_ldate;
    171 	boolean_t (*bs_fn)(struct bk_selector *bks, struct stat64 *s);
    172 } bk_selector_t;
    173 
    174 
    175 /*
    176  * Call back structure to create new name for objects at restore time.
    177  */
    178 struct rs_name_maker;
    179 typedef char *(*rsm_fp_t)(struct rs_name_maker *,
    180 	char *buf,
    181 	int pos,
    182 	char *path);
    183 
    184 struct rs_name_maker {
    185 	rsm_fp_t rn_fp;
    186 	void *rn_nlp;
    187 };
    188 
    189 
    190 /*
    191  *  RSFLG_OVR_*: overwriting policies.  Refer to LBR FSD for more info.
    192  *  RSFLG_MATCH_WCARD: should wildcards be supported in the selection list.
    193  *  RSFLG_IGNORE_CASE: should the compare be case-insensetive.  NDMP needs
    194  *  	case-sensetive name comparison.
    195  */
    196 #define	RSFLG_OVR_ALWAYS	0x00000001
    197 #define	RSFLG_OVR_NEVER		0x00000002
    198 #define	RSFLG_OVR_UPDATE	0x00000004
    199 #define	RSFLG_MATCH_WCARD	0x00000008
    200 #define	RSFLG_IGNORE_CASE	0x00000010
    201 
    202 
    203 /*
    204  * Different cases where two paths can match with each other.
    205  * Parent means that the current path, is parent of an entry in
    206  * the selection list.
    207  * Child means that the current path, is child of an entry in the
    208  * selection list.
    209  */
    210 #define	PM_NONE		0
    211 #define	PM_EXACT	1
    212 #define	PM_PARENT	2
    213 #define	PM_CHILD	3
    214 
    215 extern tlm_job_stats_t *tlm_new_job_stats(char *);
    216 extern tlm_job_stats_t *tlm_ref_job_stats(char *);
    217 extern void tlm_un_ref_job_stats(char *);
    218 extern boolean_t tlm_is_excluded(char *, char *, char **);
    219 extern char *tlm_build_snapshot_name(char *, char *, char *);
    220 extern char *tlm_remove_checkpoint(char *, char *);
    221 extern tlm_buffers_t *tlm_allocate_buffers(boolean_t, long);
    222 extern tlm_buffer_t *tlm_buffer_advance_in_idx(tlm_buffers_t *);
    223 extern tlm_buffer_t *tlm_buffer_advance_out_idx(tlm_buffers_t *);
    224 extern tlm_buffer_t *tlm_buffer_in_buf(tlm_buffers_t *, int *);
    225 extern tlm_buffer_t *tlm_buffer_out_buf(tlm_buffers_t *, int *);
    226 extern void tlm_buffer_mark_empty(tlm_buffer_t *);
    227 extern void tlm_buffer_release_in_buf(tlm_buffers_t *);
    228 extern void tlm_buffer_release_out_buf(tlm_buffers_t *);
    229 extern void tlm_buffer_in_buf_wait(tlm_buffers_t *);
    230 extern void tlm_buffer_out_buf_wait(tlm_buffers_t *);
    231 extern void tlm_buffer_in_buf_timed_wait(tlm_buffers_t *, unsigned);
    232 extern void tlm_buffer_out_buf_timed_wait(tlm_buffers_t *, unsigned);
    233 extern char *tlm_get_write_buffer(long, long *, tlm_buffers_t *, int);
    234 extern char *tlm_get_read_buffer(int, int *, tlm_buffers_t *, int *);
    235 extern void tlm_unget_read_buffer(tlm_buffers_t *, int);
    236 extern void tlm_unget_write_buffer(tlm_buffers_t *, int);
    237 extern void tlm_release_buffers(tlm_buffers_t *);
    238 extern tlm_cmd_t *tlm_create_reader_writer_ipc(boolean_t, long);
    239 extern void tlm_release_reader_writer_ipc(tlm_cmd_t *);
    240 
    241 extern void tlm_cmd_wait(tlm_cmd_t *, uint32_t);
    242 extern void tlm_cmd_signal(tlm_cmd_t *, uint32_t);
    243 
    244 typedef int (*path_hist_func_t)(lbr_fhlog_call_backs_t *,
    245     char *,
    246     struct stat64 *,
    247     u_longlong_t);
    248 
    249 typedef int (*dir_hist_func_t)(lbr_fhlog_call_backs_t *,
    250     char *,
    251     struct stat64 *);
    252 
    253 typedef int (*node_hist_func_t)(lbr_fhlog_call_backs_t *,
    254     char *,
    255     char *,
    256     struct stat64 *,
    257     u_longlong_t);
    258 
    259 lbr_fhlog_call_backs_t *lbrlog_callbacks_init(void *,
    260     path_hist_func_t,
    261     dir_hist_func_t,
    262     node_hist_func_t);
    263 
    264 typedef struct {
    265 	tlm_commands_t *ba_commands;
    266 	tlm_cmd_t *ba_cmd;
    267 	char *ba_job;
    268 	char *ba_dir;
    269 	char *ba_sels[NDMP_MAX_SELECTIONS];
    270 	pthread_barrier_t ba_barrier;
    271 } tlm_backup_restore_arg_t;
    272 
    273 extern void lbrlog_callbacks_done(lbr_fhlog_call_backs_t *);
    274 
    275 extern boolean_t tlm_cat_path(char *, char *, char *);
    276 
    277 extern char *trim_name(char *);
    278 
    279 extern struct full_dir_info *dup_dir_info(struct full_dir_info *);
    280 extern void write_tar_eof(tlm_cmd_t *);
    281 extern int tlm_get_chkpnt_time(char *, int, time_t *, char *);
    282 extern struct full_dir_info *tlm_new_dir_info(fs_fhandle_t *,
    283     char *,
    284     char *);
    285 extern void tlm_release_list(char **);
    286 extern longlong_t tlm_get_data_offset(tlm_cmd_t *);
    287 extern int tlm_tarhdr_size(void);
    288 
    289 #endif	/* _TLM_BUFFERS_H_ */
    290