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
72typedef 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
95typedef 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
109typedef 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
121typedef 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
132typedef 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
147struct 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 */
159typedef 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
167typedef 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 */
178struct rs_name_maker;
179typedef char *(*rsm_fp_t)(struct rs_name_maker *,
180	char *buf,
181	int pos,
182	char *path);
183
184struct 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
215extern tlm_job_stats_t *tlm_new_job_stats(char *);
216extern tlm_job_stats_t *tlm_ref_job_stats(char *);
217extern void tlm_un_ref_job_stats(char *);
218extern boolean_t tlm_is_excluded(char *, char *, char **);
219extern char *tlm_build_snapshot_name(char *, char *, char *);
220extern char *tlm_remove_checkpoint(char *, char *);
221extern tlm_buffers_t *tlm_allocate_buffers(boolean_t, long);
222extern tlm_buffer_t *tlm_buffer_advance_in_idx(tlm_buffers_t *);
223extern tlm_buffer_t *tlm_buffer_advance_out_idx(tlm_buffers_t *);
224extern tlm_buffer_t *tlm_buffer_in_buf(tlm_buffers_t *, int *);
225extern tlm_buffer_t *tlm_buffer_out_buf(tlm_buffers_t *, int *);
226extern void tlm_buffer_mark_empty(tlm_buffer_t *);
227extern void tlm_buffer_release_in_buf(tlm_buffers_t *);
228extern void tlm_buffer_release_out_buf(tlm_buffers_t *);
229extern void tlm_buffer_in_buf_wait(tlm_buffers_t *);
230extern void tlm_buffer_out_buf_wait(tlm_buffers_t *);
231extern void tlm_buffer_in_buf_timed_wait(tlm_buffers_t *, unsigned);
232extern void tlm_buffer_out_buf_timed_wait(tlm_buffers_t *, unsigned);
233extern char *tlm_get_write_buffer(long, long *, tlm_buffers_t *, int);
234extern char *tlm_get_read_buffer(int, int *, tlm_buffers_t *, int *);
235extern void tlm_unget_read_buffer(tlm_buffers_t *, int);
236extern void tlm_unget_write_buffer(tlm_buffers_t *, int);
237extern void tlm_release_buffers(tlm_buffers_t *);
238extern tlm_cmd_t *tlm_create_reader_writer_ipc(boolean_t, long);
239extern void tlm_release_reader_writer_ipc(tlm_cmd_t *);
240
241extern void tlm_cmd_wait(tlm_cmd_t *, uint32_t);
242extern void tlm_cmd_signal(tlm_cmd_t *, uint32_t);
243
244typedef int (*path_hist_func_t)(lbr_fhlog_call_backs_t *,
245    char *,
246    struct stat64 *,
247    u_longlong_t);
248
249typedef int (*dir_hist_func_t)(lbr_fhlog_call_backs_t *,
250    char *,
251    struct stat64 *);
252
253typedef int (*node_hist_func_t)(lbr_fhlog_call_backs_t *,
254    char *,
255    char *,
256    struct stat64 *,
257    u_longlong_t);
258
259lbr_fhlog_call_backs_t *lbrlog_callbacks_init(void *,
260    path_hist_func_t,
261    dir_hist_func_t,
262    node_hist_func_t);
263
264typedef 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
273extern void lbrlog_callbacks_done(lbr_fhlog_call_backs_t *);
274
275extern boolean_t tlm_cat_path(char *, char *, char *);
276
277extern char *trim_name(char *);
278
279extern struct full_dir_info *dup_dir_info(struct full_dir_info *);
280extern void write_tar_eof(tlm_cmd_t *);
281extern int tlm_get_chkpnt_time(char *, int, time_t *, char *);
282extern struct full_dir_info *tlm_new_dir_info(fs_fhandle_t *,
283    char *,
284    char *);
285extern void tlm_release_list(char **);
286extern longlong_t tlm_get_data_offset(tlm_cmd_t *);
287extern int tlm_tarhdr_size(void);
288
289#endif	/* _TLM_BUFFERS_H_ */
290