1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
|
/*
* 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 <sys/types.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/stat.h>
#include <thread.h>
#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_ */
|