1 /*
2 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2015 by Delphix. All rights reserved.
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 /* Copyright (c) 2007, The Storage Networking Industry Association. */
40 /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
41 /* Copyright 2017 Nexenta Systems, Inc. All rights reserved. */
42
43 #ifndef _NDMPD_H
44 #define _NDMPD_H
45
46 #include <sys/types.h>
47 #include <libzfs.h>
48 #include <ndmpd_door.h>
49 #include <libndmp.h>
50 #include "ndmpd_common.h"
51 #include "tlm_buffers.h"
52 #include <dirent.h>
53 #include "ndmpd_prop.h"
54 #include "traverse.h"
55 #include <pthread.h>
56 #include <libndmp.h>
57 #include <atomic.h>
58
59 #define MAX_RECORD_SIZE (126*512)
60 #define REMOTE_RECORD_SIZE (60*KILOBYTE)
61 #define SCSI_MAX_NAME 32
62 #define MD5_CHALLENGE_SIZE 64
63 #define MD5_PASS_LIMIT 32
64
65 /* Test unit ready */
66 #define TUR_WAIT 3000000
67 #define TUR_MAX_TRY 3
68
69
70 /* File handler classes */
71 #define HC_CLIENT 1
72 #define HC_MOVER 2
73 #define HC_MODULE 4
74 #define HC_ALL 0xffffffff
75
76 #define IN_ADDR(x) \
77 (*(struct in_addr *)&x)
78
79 #define FS_READONLY(fs) (hasmntopt(fs, "ro") ? 1 : 0)
80
81 typedef void *(*funct_t)(void *); /* function pointer */
82
83 #define HOSTNAMELEN 256
84
85 #define VENDOR_NAME "Sun Microsystems"
86 #define PRODUCT_NAME "Solaris 5.11"
87
88 /*
89 * Calculate array length based on its size and size of
90 * its elements.
91 */
92 #define ARRAY_LEN(a, t) (sizeof (a) / sizeof (t))
93 /*
94 * Default maximum permitted sequence number for the token-based backup.
95 */
96 #define NDMP_MAX_TOKSEQ 9
97
98 /*
99 * Hard-limit for the sequence number in the token-based backup.
100 * It's one less than the ASCII value of 'A'. The 'A' letter
101 * can be used as level in the lbr-type backups.
102 */
103 #define NDMP_TOKSEQ_HLIMIT ('A' - 1)
104
105
106 /*
107 * Soft-limit for the sequence number in the token-based backup.
108 */
109 #define NDMP_TOKSEQ_SLIMIT (NDMP_TOKSEQ_HLIMIT - 5)
110
111
112 /*
113 * Root inode number of dump format in V2.
114 */
115 #define ROOT_INODE 2
116
117 /*
118 * NDMP backup image signature
119 */
120 #define NDMPUTF8MAGIC "NDMPUTF8MAGIC"
121
122 /*
123 * Supported BU types
124 */
125 #define NDMP_TAR_TYPE "tar"
126 #define NDMP_DUMP_TYPE "dump"
127 #define NDMP_ZFS_TYPE "zfs"
128
129 /* All 1's binary maximum mover window */
130 #define MAX_WINDOW_SIZE 0xffffffffffffffffULL
131
132 #define NDMP_FREE(cp) { free((char *)(cp)); (cp) = NULL; }
133
134 #define NDMP_YORN(f) ((f) ? 'Y' : 'N')
135 #define NDMP_TORF(f) ((f) ? "TRUE" : "FALSE")
136 #define NDMP_SVAL(cp) ((cp) ? (cp) : "NULL")
137
138 #define NDMP_SETENV(env, nm, val) \
139 { \
140 env->name = nm; \
141 env->value = val; \
142 env++; \
143 }
144
145 #define NDMP_CL_ADDR_LEN 24
146 #define NDMP_TCP_ADDR_SIZE 32
147 #define NDMP_TAPE_DEV_NAME 256
148
149 typedef struct {
150 char *bk_path;
151 int bk_llevel; /* last backup level */
152 time_t bk_ldate; /* last backup date */
153 int bk_clevel; /* current backup level */
154 time_t bk_cdate; /* current backup date */
155 int bk_map;
156 int bk_dirino;
157 char *bk_dmpnm;
158 char **bk_exl; /* exlude list */
159 char **bk_inc; /* include list */
160 } ndmp_backup_params_t;
161
162
163 typedef struct {
164 ulong_t rs_nf; /* number of files to restore */
165 char *rs_path;
166 char *rs_bkpath;
167 int *rs_restored;
168 int rs_bm;
169 int rs_lastidx;
170 } ndmp_restore_params_t;
171
172 /*
173 * Used to find latest snapshot in a dataset
174 */
175 typedef struct snap_data {
176 time_t creation_time;
177 const char *last_snapshot;
178 } snap_data_t;
179
180 /*
181 * Tar format archiving ops table
182 */
183 extern tm_ops_t tm_tar_ops;
184
185 /*
186 * IS_LBR_BKTYPE shows if the backup type is one of these
187 * 'F' of 'f': 'Full' backup type.
188 * 'A' of 'a': 'Archive' backup type.
189 * 'I' of 'i': 'Incremental' backup type.
190 * 'D' of 'd': 'Differntial' backup type.
191 */
192 #define IS_LBR_BKTYPE(t) (((t) && strchr("FAID", toupper(t))) ? 1 : 0)
193
194
195 /*
196 * NLP flags.
197 */
198 #define NLPF_CHKPNTED_PATH (1 << 0)
199 #define NLPF_FH (1 << 1)
200 #define NLPF_DIRECT (1 << 2)
201 #define NLPF_UPDATE (1 << 3)
202 #define NLPF_DUMP (1 << 4)
203 #define NLPF_TAR (1 << 5)
204 #define NLPF_ABORTED (1 << 6)
205 #define NLPF_TOKENBK (1 << 8)
206 #define NLPF_LBRBK (1 << 9)
207 #define NLPF_LEVELBK (1 << 10)
208 #define NLPF_IGNCTIME (1 << 11)
209 #define NLPF_INCLMTIME (1 << 12)
210 #define NLPF_RECURSIVE (1 << 13)
211
212 /*
213 * Macros on NLP flags.
214 */
215 #define NLP_ISSET(n, f) (((n)->nlp_flags & (f)) != 0)
216 #define NLP_SET(n, f) (n)->nlp_flags |= (f)
217 #define NLP_UNSET(n, f) (n)->nlp_flags &= ~(f)
218
219
220 #define NLP_ISCHKPNTED(n) NLP_ISSET(n, NLPF_CHKPNTED_PATH)
221 #define NLP_SHOULD_UPDATE(n) NLP_ISSET(n, NLPF_UPDATE)
222 #define NLP_ISDUMP(n) NLP_ISSET(n, NLPF_DUMP)
223 #define NLP_ISTAR(n) NLP_ISSET(n, NLPF_TAR)
224 #define NLP_IGNCTIME(n) NLP_ISSET(n, NLPF_IGNCTIME)
225 #define NLP_INCLMTIME(n) NLP_ISSET(n, NLPF_INCLMTIME)
226
227 /*
228 * NDMP statistics
229 */
230 #define NS_INC(s) (atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s))
231 #define NS_DEC(s) (atomic_dec_32((volatile uint32_t *)&ndstat.ns_##s))
232 #define NS_ADD(s, d) (atomic_add_64((volatile uint64_t *)&ndstat.ns_##s, \
233 (uint64_t)d))
234 #define NS_UPD(s, t) { \
235 atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s); \
236 atomic_dec_32((volatile uint32_t *)&ndstat.ns_##t); \
237 }
238
239 #define NLP_READY 1
240
241 typedef struct ndmp_lbr_params {
242 struct ndmpd_session *nlp_session;
243 int nlp_flags;
244 char nlp_job_name[ZFS_MAX_DATASET_NAME_LEN];
245 char nlp_vol[ZFS_MAX_DATASET_NAME_LEN];
246 char nlp_snapname[ZFS_MAX_DATASET_NAME_LEN];
247 char nlp_clonename[ZFS_MAX_DATASET_NAME_LEN];
248 char nlp_mountpoint[ZFS_MAX_DATASET_NAME_LEN];
249
250 ndmp_backup_params_t bk_params;
251 ndmp_restore_params_t rs_params;
252 #define nlp_backup_path bk_params.bk_path
253 #define nlp_llevel bk_params.bk_llevel
254 #define nlp_ldate bk_params.bk_ldate
255 #define nlp_clevel bk_params.bk_clevel
256 #define nlp_tokseq nlp_clevel
257 #define nlp_tokdate nlp_ldate
258 #define nlp_cdate bk_params.bk_cdate
259 #define nlp_bkmap bk_params.bk_map
260 #define nlp_bkdirino bk_params.bk_dirino
261 #define nlp_dmpnm bk_params.bk_dmpnm
262 #define nlp_exl bk_params.bk_exl
263 #define nlp_inc bk_params.bk_inc
264
265 #define nlp_nfiles rs_params.rs_nf
266 #define nlp_restore_path rs_params.rs_path
267 #define nlp_restore_bk_path rs_params.rs_bkpath
268 #define nlp_restored rs_params.rs_restored
269 #define nlp_rsbm rs_params.rs_bm
270 #define nlp_lastidx rs_params.rs_lastidx
271
272 ndmpd_module_params_t *nlp_params;
273 tlm_job_stats_t *nlp_jstat;
274 lbr_fhlog_call_backs_t *nlp_logcallbacks;
275 tlm_commands_t nlp_cmds;
276
277 cond_t nlp_cv; /* for signaling a processed request */
278 mutex_t nlp_mtx; /* mutex to synchronize access to nlp_cv */
279 u_longlong_t nlp_bytes_total;
280 } ndmp_lbr_params_t;
281
282
283 typedef struct mem_ndmp_name_v3 {
284 char *nm3_opath;
285 char *nm3_dpath;
286 char *nm3_newnm;
287 u_longlong_t nm3_node;
288 u_longlong_t nm3_fh_info;
289 ndmp_error nm3_err;
290 } mem_ndmp_name_v3_t;
291
292 typedef struct ndmpd_file_handler {
293 int fh_fd;
294 ulong_t fh_mode;
295 ulong_t fh_class;
296 void *fh_cookie;
297 ndmpd_file_handler_func_t *fh_func;
298 struct ndmpd_file_handler *fh_next;
299 } ndmpd_file_handler_t;
300
301 typedef struct ndmpd_session_scsi_desc {
302 int sd_is_open;
303 int sd_devid;
304 boolean_t sd_valid_target_set;
305 int sd_sid;
306 int sd_lun;
307 char sd_adapter_name[SCSI_MAX_NAME];
308 } ndmpd_session_scsi_desc_t;
309
310 typedef struct ndmpd_session_tape_desc {
311 int td_fd; /* tape device file descriptor */
312 ulong_t td_record_count; /* number of records written */
313 ndmp_tape_open_mode td_mode; /* tape device open mode */
314 u_longlong_t td_pos; /* current position on the current tape */
315 int td_sid;
316 int td_lun;
317 char td_adapter_name[SCSI_MAX_NAME];
318 } ndmpd_session_tape_desc_t;
319
320 typedef struct ndmpd_session_mover_desc {
321 ndmp_mover_state md_state; /* current state */
322 ndmp_mover_mode md_mode; /* current mode */
323 ndmp_mover_pause_reason md_pause_reason; /* current reason */
324 ndmp_mover_halt_reason md_halt_reason; /* current reason */
325 u_longlong_t md_data_written; /* total written to tape */
326 u_longlong_t md_seek_position; /* current seek position */
327 u_longlong_t md_bytes_left_to_read; /* #bytes to end of seek window */
328 u_longlong_t md_window_offset; /* valid data window begin */
329 u_longlong_t md_window_length; /* valid data window length */
330 u_longlong_t md_position; /* current data stream pos */
331 boolean_t md_pre_cond; /* used for precondition checks */
332 ulong_t md_record_size; /* tape I/O record size */
333 ulong_t md_record_num; /* current record num */
334 int md_listen_sock; /* data conn listen socket */
335 int md_sock; /* data conn socket */
336 ulong_t md_r_index; /* buffer read index */
337 ulong_t md_w_index; /* buffer write index */
338 char *md_buf; /* data buffer */
339 /*
340 * V2 fields.
341 */
342 ulong_t md_discard_length; /* bytes to discard */
343
344 /*
345 * V3 fields.
346 */
347 ndmp_addr_v3 md_data_addr;
348 /*
349 * V4 fields.
350 */
351 ndmp_addr_v4 md_data_addr_v4;
352 } ndmpd_session_mover_desc_t;
353
354
355 typedef struct ndmpd_session_data_module {
356 void *dm_module_cookie; /* sent as abort_func param */
357 module_start_func_t *dm_start_func; /* start function */
358 module_abort_func_t *dm_abort_func; /* abort function */
359 ndmpd_module_stats dm_stats; /* statistics buffer */
360 } ndmpd_session_data_module_t;
361
362 typedef struct ndmpd_session_data_desc {
363 /*
364 * Common fields.
365 */
366 ndmp_data_operation dd_operation; /* current operation */
367 boolean_t dd_abort; /* abort operation flag */
368 boolean_t dd_io_ready; /* mover sock read for I/O */
369 ndmp_pval *dd_env; /* environment from backup or recover request */
370 ulong_t dd_env_len; /* environment length */
371 ulong_t dd_nlist_len; /* recover file list length */
372 int dd_sock; /* listen and data socket */
373 u_longlong_t dd_read_offset; /* data read seek offset */
374 u_longlong_t dd_read_length; /* data read length */
375 u_longlong_t dd_data_size; /* data size to be backed up */
376 ndmpd_session_data_module_t dd_module;
377
378 ndmp_data_state dd_state; /* current state */
379 ndmp_data_halt_reason dd_halt_reason; /* current reason */
380 /*
381 * V2 fields.
382 */
383 ndmp_name *dd_nlist; /* recover file list */
384 ndmp_mover_addr dd_mover; /* mover address */
385 /*
386 * V3 fields.
387 */
388 mem_ndmp_name_v3_t *dd_nlist_v3;
389 ndmp_addr_v3 dd_data_addr;
390 int dd_listen_sock; /* socket for listening for remote */
391 /* mover connections */
392 u_longlong_t dd_bytes_left_to_read;
393 u_longlong_t dd_position;
394 u_longlong_t dd_discard_length;
395 /*
396 * V4 fields.
397 */
398 ndmp_addr_v4 dd_data_addr_v4;
399 } ndmpd_session_data_desc_t;
400
401 typedef struct ndmpd_session_file_history {
402 ndmp_fh_unix_path *fh_path_entries;
403 ndmp_fh_unix_dir *fh_dir_entries;
404 ndmp_fh_unix_node *fh_node_entries;
405 char *fh_path_name_buf;
406 char *fh_dir_name_buf;
407 ulong_t fh_path_index;
408 ulong_t fh_dir_index;
409 ulong_t fh_node_index;
410 ulong_t fh_path_name_buf_index;
411 ulong_t fh_dir_name_buf_index;
412 } ndmpd_session_file_history_t;
413
414 typedef struct ndmpd_session_file_history_v3 {
415 ndmp_file_v3 *fh_files;
416 ndmp_dir_v3 *fh_dirs;
417 ndmp_node_v3 *fh_nodes;
418 ndmp_file_name_v3 *fh_file_names;
419 ndmp_file_name_v3 *fh_dir_names;
420 ndmp_file_stat_v3 *fh_file_stats;
421 ndmp_file_stat_v3 *fh_node_stats;
422 char *fh_file_name_buf;
423 char *fh_dir_name_buf;
424 ulong_t fh_file_index;
425 ulong_t fh_dir_index;
426 ulong_t fh_node_index;
427 ulong_t fh_file_name_buf_index;
428 ulong_t fh_dir_name_buf_index;
429 } ndmpd_session_file_history_v3_t;
430
431 /*
432 * zfs-based backup (zfs send/recv)
433 */
434
435 typedef enum {
436 NDMPD_ZFS_MAJOR_0,
437 } ndmpd_zfs_major_t;
438
439 typedef enum {
440 NDMPD_ZFS_MINOR_0,
441 } ndmpd_zfs_minor_t;
442
443 typedef enum {
444 NDMPD_ZFS_PROP_MAJOR_0,
445 } ndmpd_zfs_prop_major_t;
446
447 typedef enum {
448 NDMPD_ZFS_PROP_MINOR_0,
449 } ndmpd_zfs_prop_minor_t;
450
451 #define NDMPD_ZFS_MAJOR_VERSION NDMPD_ZFS_MAJOR_0
452 #define NDMPD_ZFS_MINOR_VERSION NDMPD_ZFS_MINOR_0
453 #define NDMPD_ZFS_PROP_MAJOR_VERSION NDMPD_ZFS_PROP_MAJOR_0
454 #define NDMPD_ZFS_PROP_MINOR_VERSION NDMPD_ZFS_PROP_MINOR_0
455
456 #pragma pack(1)
457 typedef struct {
458 char nzh_magic[14]; /* NDMPUTF8MAGIC\0 */
459 uint32_t nzh_major; /* major version */
460 uint32_t nzh_minor; /* minor version */
461 uint32_t nzh_hdrlen; /* length of hdr in bytes including magic */
462 /* future extensions */
463 } ndmpd_zfs_header_t;
464 #pragma pack()
465
466 #define PIPE_TAPE 0
467 #define PIPE_ZFS 1
468
469 #define NDMPD_ZFS_DMP_NAME_MAX 32
470
471 typedef struct ndmpd_zfs_args {
472 zfs_type_t nz_type; /* type of ZFS dataset */
473 char nz_dataset[ZFS_MAX_DATASET_NAME_LEN]; /* dataset name */
474 char nz_snapname[ZFS_MAX_DATASET_NAME_LEN]; /* snapname (following @) */
475 char nz_fromsnap[ZFS_MAX_DATASET_NAME_LEN]; /* snap of L-1 bkup */
476 char nz_snapprop[ZFS_MAXPROPLEN]; /* contents of snap incr prop */
477 boolean_t nz_ndmpd_snap; /* ndmpd-generated snap? */
478
479 pthread_t nz_sendrecv_thread; /* thread for send/recv */
480 pthread_t nz_tape_thread; /* thread for tape r/w */
481 int32_t nz_pipe_fd[2]; /* pipe for above 2 threads */
482 int32_t nz_bufsize; /* tape r/w buf size */
483 int64_t nz_window_len; /* DMA window length */
484
485 int nz_level; /* val of LEVEL env var */
486 char nz_zfs_mode; /* val of ZFS_MODE env var */
487 boolean_t nz_zfs_force; /* val of ZFS_FORCE env var */
488 boolean_t nz_update; /* val of UPDATE env var */
489 char nz_dmp_name[NDMPD_ZFS_DMP_NAME_MAX]; /* val of DMP_NAME env var */
490 u_longlong_t nz_zfs_backup_size; /* used for restore only */
491
492 ndmpd_module_params_t nz_params;
493 ndmp_lbr_params_t *nz_nlp;
494 libzfs_handle_t *nz_zlibh; /* session-specific lzfs hdl */
495 ndmp_context_t nz_nctx; /* used by plugin */
496
497 ndmpd_zfs_header_t nz_tape_header; /* tape hdr for "zfs" backup */
498 } ndmpd_zfs_args_t;
499
500 #define ndmpd_zfs_params (&(ndmpd_zfs_args)->nz_params)
501
502 typedef struct ndmpd_session {
503 ndmp_connection_t *ns_connection; /* NDMP connection to client */
504 boolean_t ns_eof; /* connection EOF flag */
505 ushort_t ns_protocol_version; /* connection protocol version */
506 ndmpd_session_scsi_desc_t ns_scsi;
507 ndmpd_session_tape_desc_t ns_tape;
508 ndmpd_session_mover_desc_t ns_mover;
509 ndmpd_session_data_desc_t ns_data;
510 ndmpd_session_file_history_t ns_fh;
511 ndmpd_file_handler_t *ns_file_handler_list; /* for I/O multiplexing */
512 int ns_nref;
513 ndmp_lbr_params_t *ns_ndmp_lbr_params;
514 struct ndmpd_zfs_args ns_ndmpd_zfs_args;
515 ndmpd_backup_type_t ns_butype;
516 mutex_t ns_lock;
517
518 /*
519 * NDMP V3
520 * Tape, SCSI, mover, data and file handlers will
521 * be shared between V2 and V3.
522 */
523 ndmpd_session_file_history_v3_t ns_fh_v3;
524 unsigned char ns_challenge[MD5_CHALLENGE_SIZE]; /* For MD5 */
525
526 /*
527 * NDMP V4 related data
528 */
529 boolean_t ns_get_ext_list;
530 boolean_t ns_set_ext_list;
531
532 /* handling of hardlink, hardlink queue head */
533 struct hardlink_q *hardlink_q;
534 } ndmpd_session_t;
535
536
537 /*
538 * NDMP request handler functions.
539 */
540
541 /* Config */
542 ndmp_msg_handler_func_t ndmpd_config_get_host_info_v2;
543 ndmp_msg_handler_func_t ndmpd_config_get_butype_attr_v2;
544 ndmp_msg_handler_func_t ndmpd_config_get_mover_type_v2;
545 ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v2;
546
547 ndmp_msg_handler_func_t ndmpd_config_get_host_info_v3;
548 ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v3;
549 ndmp_msg_handler_func_t ndmpd_config_get_connection_type_v3;
550 ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v3;
551 ndmp_msg_handler_func_t ndmpd_config_get_fs_info_v3;
552 ndmp_msg_handler_func_t ndmpd_config_get_tape_info_v3;
553 ndmp_msg_handler_func_t ndmpd_config_get_scsi_info_v3;
554 ndmp_msg_handler_func_t ndmpd_config_get_server_info_v3;
555
556 ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v4;
557 ndmp_msg_handler_func_t ndmpd_config_get_ext_list_v4;
558 ndmp_msg_handler_func_t ndmpd_config_set_ext_list_v4;
559
560
561 /* Scsi */
562 ndmp_msg_handler_func_t ndmpd_scsi_open_v2;
563 ndmp_msg_handler_func_t ndmpd_scsi_close_v2;
564 ndmp_msg_handler_func_t ndmpd_scsi_get_state_v2;
565 ndmp_msg_handler_func_t ndmpd_scsi_set_target_v2;
566 ndmp_msg_handler_func_t ndmpd_scsi_reset_device_v2;
567 ndmp_msg_handler_func_t ndmpd_scsi_reset_bus_v2;
568 ndmp_msg_handler_func_t ndmpd_scsi_execute_cdb_v2;
569
570 ndmp_msg_handler_func_t ndmpd_scsi_open_v3;
571 ndmp_msg_handler_func_t ndmpd_scsi_set_target_v3;
572
573
574 /* Tape */
575 ndmp_msg_handler_func_t ndmpd_tape_open_v2;
576 ndmp_msg_handler_func_t ndmpd_tape_close_v2;
577 ndmp_msg_handler_func_t ndmpd_tape_get_state_v2;
578 ndmp_msg_handler_func_t ndmpd_tape_mtio_v2;
579 ndmp_msg_handler_func_t ndmpd_tape_write_v2;
580 ndmp_msg_handler_func_t ndmpd_tape_read_v2;
581 ndmp_msg_handler_func_t ndmpd_tape_execute_cdb_v2;
582
583 ndmp_msg_handler_func_t ndmpd_tape_open_v3;
584 ndmp_msg_handler_func_t ndmpd_tape_get_state_v3;
585 ndmp_msg_handler_func_t ndmpd_tape_write_v3;
586 ndmp_msg_handler_func_t ndmpd_tape_read_v3;
587
588
589 ndmp_msg_handler_func_t ndmpd_tape_close_v4;
590 /* Data */
591 ndmp_msg_handler_func_t ndmpd_data_get_state_v2;
592 ndmp_msg_handler_func_t ndmpd_data_start_backup_v2;
593 ndmp_msg_handler_func_t ndmpd_data_start_recover_v2;
594 ndmp_msg_handler_func_t ndmpd_data_get_env_v2;
595 ndmp_msg_handler_func_t ndmpd_data_stop_v2;
596 ndmp_msg_handler_func_t ndmpd_data_abort_v2;
597
598 ndmp_msg_handler_func_t ndmpd_data_get_state_v3;
599 ndmp_msg_handler_func_t ndmpd_data_connect_v3;
600 ndmp_msg_handler_func_t ndmpd_data_listen_v3;
601 ndmp_msg_handler_func_t ndmpd_data_stop_v3;
602 ndmp_msg_handler_func_t ndmpd_data_abort_v3;
603 ndmp_msg_handler_func_t ndmpd_data_start_recover_v3;
604 ndmp_msg_handler_func_t ndmpd_data_start_backup_v3;
605
606 ndmp_msg_handler_func_t ndmpd_data_get_env_v4;
607 ndmp_msg_handler_func_t ndmpd_data_get_state_v4;
608 ndmp_msg_handler_func_t ndmpd_data_connect_v4;
609 ndmp_msg_handler_func_t ndmpd_data_listen_v4;
610 ndmp_msg_handler_func_t ndmpd_data_start_recover_filehist_v4;
611
612
613 /* Connect */
614 ndmp_msg_handler_func_t ndmpd_connect_open_v2;
615 ndmp_msg_handler_func_t ndmpd_connect_client_auth_v2;
616 ndmp_msg_handler_func_t ndmpd_connect_server_auth_v2;
617 ndmp_msg_handler_func_t ndmpd_connect_close_v2;
618
619 ndmp_msg_handler_func_t ndmpd_connect_client_auth_v3;
620 ndmp_msg_handler_func_t ndmpd_connect_close_v3;
621
622
623 /* Mover */
624 ndmp_msg_handler_func_t ndmpd_mover_get_state_v2;
625 ndmp_msg_handler_func_t ndmpd_mover_listen_v2;
626 ndmp_msg_handler_func_t ndmpd_mover_continue_v2;
627 ndmp_msg_handler_func_t ndmpd_mover_abort_v2;
628 ndmp_msg_handler_func_t ndmpd_mover_stop_v2;
629 ndmp_msg_handler_func_t ndmpd_mover_set_window_v2;
630 ndmp_msg_handler_func_t ndmpd_mover_read_v2;
631 ndmp_msg_handler_func_t ndmpd_mover_close_v2;
632 ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v2;
633
634 ndmp_msg_handler_func_t ndmpd_mover_get_state_v3;
635 ndmp_msg_handler_func_t ndmpd_mover_listen_v3;
636 ndmp_msg_handler_func_t ndmpd_mover_continue_v3;
637 ndmp_msg_handler_func_t ndmpd_mover_abort_v3;
638 ndmp_msg_handler_func_t ndmpd_mover_set_window_v3;
639 ndmp_msg_handler_func_t ndmpd_mover_read_v3;
640 ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v3;
641 ndmp_msg_handler_func_t ndmpd_mover_connect_v3;
642
643
644 ndmp_msg_handler_func_t ndmpd_mover_get_state_v4;
645 ndmp_msg_handler_func_t ndmpd_mover_listen_v4;
646 ndmp_msg_handler_func_t ndmpd_mover_connect_v4;
647
648
649 /*
650 * Backup/recover module API functions.
651 */
652 ndmpd_get_env_func_t ndmpd_api_get_env;
653 ndmpd_add_env_func_t ndmpd_api_add_env;
654 ndmpd_add_env_func_t ndmpd_api_set_env;
655 ndmpd_get_name_func_t ndmpd_api_get_name;
656 ndmpd_dispatch_func_t ndmpd_api_dispatch;
657 ndmpd_done_func_t ndmpd_api_done_v2;
658
659
660 ndmpd_write_func_t ndmpd_api_write_v2;
661 ndmpd_file_history_path_func_t ndmpd_api_file_history_path_v2;
662 ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v2;
663 ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v2;
664 ndmpd_read_func_t ndmpd_api_read_v2;
665 ndmpd_seek_func_t ndmpd_api_seek_v2;
666 ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v2;
667 ndmpd_add_file_handler_func_t ndmpd_api_add_file_handler;
668 ndmpd_remove_file_handler_func_t ndmpd_api_remove_file_handler;
669
670
671 /*
672 * NDMP V3
673 */
674 ndmpd_done_func_t ndmpd_api_done_v3;
675 ndmpd_write_func_t ndmpd_api_write_v3;
676 ndmpd_read_func_t ndmpd_api_read_v3;
677 ndmpd_seek_func_t ndmpd_api_seek_v3;
678 ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v3;
679 ndmpd_get_name_func_t ndmpd_api_get_name_v3;
680 ndmpd_file_history_path_func_t ndmpd_api_file_history_file_v3;
681 ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v3;
682 ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v3;
683
684 /*
685 * NDMP V4
686 */
687 ndmpd_log_func_v3_t ndmpd_api_log_v4;
688 ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v4;
689
690 #ifndef NO_NDMP_API_LOG_PROTOTYPES
691 ndmpd_log_func_t ndmpd_api_log_v2;
692 ndmpd_log_func_v3_t ndmpd_api_log_v3;
693 #endif /* NO_NDMP_API_LOG_PROTOTYPES */
694
695 typedef void ndmpd_func_t(ndmp_connection_t *, void *);
696
697 /*
698 * pthread call arg parameters
699 */
700 typedef struct {
701 int nw_sock;
702 long nw_ipaddr;
703 ndmp_con_handler_func_t nw_con_handler_func;
704 } ndmpd_worker_arg_t;
705
706 typedef struct {
707 ndmp_lbr_params_t *br_nlp;
708 tlm_commands_t *br_cmds;
709 pthread_barrier_t br_barrier;
710 } backup_reader_arg_t;
711
712 typedef struct {
713 ndmpd_session_t *tr_session;
714 ndmpd_module_params_t *tr_mod_params;
715 tlm_commands_t *tr_cmds;
716 } ndmp_tar_reader_arg_t;
717
718 typedef struct {
719 ndmpd_session_t *bs_session;
720 char *bs_jname;
721 char *bs_path;
722 } ndmp_bkup_size_arg_t;
723
724 /*
725 * Variables from ndmpd_comm.c
726 */
727 extern int ndmp_ver;
728 extern int ndmp_full_restore_path;
729 extern int ndmp_dar_support;
730 extern int ndmp_autosync_support;
731 extern int ndmp_hpr_support;
732 extern int ndmp_port;
733 extern ndmp_stat_t ndstat;
734
735 extern void ndmpd_main(void);
736 extern void connection_handler(ndmp_connection_t *);
737 extern void ndmpd_audit_backup(ndmp_connection_t *conn, char *path,
738 int dest, char *local_path, int result);
739 extern void ndmpd_audit_restore(ndmp_connection_t *conn,
740 char *path, int dest, char *local_path, int result);
741 extern void ndmpd_audit_connect(ndmp_connection_t *conn,
742 int result);
743 extern void ndmpd_audit_disconnect(ndmp_connection_t *conn);
744
745 /* Variables from ndmpd_main.c */
746 extern libzfs_handle_t *zlibh;
747 extern mutex_t zlib_mtx;
748
749 /*
750 * Utility from ndmpd_connect.c.
751 */
752 extern int ndmp_connect_list_add(ndmp_connection_t *, int *);
753 extern int ndmp_connect_list_del(ndmp_connection_t *);
754 extern int ndmpd_connect_kill_id(int);
755 extern void ndmp_connect_list_get(ndmp_door_ctx_t *);
756 extern void ndmpd_get_devs(ndmp_door_ctx_t *);
757
758 /*
759 * Utility functions form ndmpd_data.c.
760 */
761 extern void ndmpd_data_cleanup(ndmpd_session_t *);
762 extern int ndmpd_data_init(ndmpd_session_t *);
763 extern char *ndmp_data_get_mover_mode(ndmpd_session_t *);
764 extern void ndmpd_data_error(ndmpd_session_t *, ndmp_data_halt_reason);
765
766
767 /*
768 * Utility functions from ndmpd_mover.c.
769 */
770 extern int ndmpd_mover_init(ndmpd_session_t *);
771 extern void ndmpd_mover_cleanup(ndmpd_session_t *);
772 extern ndmp_error ndmpd_mover_connect(ndmpd_session_t *,
773 ndmp_mover_mode);
774 extern void ndmpd_mover_error(ndmpd_session_t *,
775 ndmp_mover_halt_reason);
776 extern int ndmpd_mover_seek(ndmpd_session_t *,
777 u_longlong_t,
778 u_longlong_t);
779 extern int ndmpd_local_write(ndmpd_session_t *,
780 char *,
781 ulong_t);
782 extern int ndmpd_remote_write(ndmpd_session_t *,
783 char *,
784 ulong_t);
785 extern int ndmpd_local_read(ndmpd_session_t *,
786 char *,
787 ulong_t);
788 extern int ndmpd_remote_read(ndmpd_session_t *,
789 char *,
790 ulong_t);
791
792 extern void ndmpd_mover_shut_down(ndmpd_session_t *);
793 extern void ndmpd_mover_error(ndmpd_session_t *,
794 ndmp_mover_halt_reason);
795 extern int ndmpd_local_write_v3(ndmpd_session_t *,
796 char *,
797 ulong_t);
798 extern int ndmpd_local_read_v3(ndmpd_session_t *,
799 char *,
800 ulong_t);
801 extern int ndmpd_remote_read_v3(ndmpd_session_t *,
802 char *,
803 ulong_t);
804
805
806 /*
807 * Utility functions from ndmpd_file_history.c
808 */
809 extern void ndmpd_file_history_init(ndmpd_session_t *);
810 extern void ndmpd_file_history_cleanup(ndmpd_session_t *,
811 boolean_t);
812 extern int ndmpd_file_history_path(lbr_fhlog_call_backs_t *,
813 char *,
814 struct stat64 *,
815 u_longlong_t);
816 extern int ndmpd_file_history_dir(lbr_fhlog_call_backs_t *,
817 char *,
818 struct stat64 *);
819 extern int ndmpd_file_history_node(lbr_fhlog_call_backs_t *,
820 char *,
821 char *,
822 struct stat64 *,
823 u_longlong_t);
824 extern int
825 ndmpd_path_restored(lbr_fhlog_call_backs_t *,
826 char *,
827 struct stat64 *,
828 u_longlong_t);
829 extern int ndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t *,
830 char *,
831 struct stat64 *,
832 u_longlong_t);
833 extern int ndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t *,
834 char *,
835 struct stat64 *);
836 extern int ndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t *,
837 char *,
838 char *,
839 struct stat64 *,
840 u_longlong_t);
841 extern int ndmpd_path_restored_v3(lbr_fhlog_call_backs_t *,
842 char *,
843 struct stat64 *,
844 u_longlong_t);
845
846 extern int ndmp_send_recovery_stat_v3(ndmpd_module_params_t *,
847 ndmp_lbr_params_t *,
848 int,
849 int);
850
851
852 /*
853 * Utility functions from ndmpd_dtime.c
854 */
855 extern int ndmpd_put_dumptime(char *, int, time_t);
856 extern int ndmpd_get_dumptime(char *, int *, time_t *);
857 extern int ndmpd_append_dumptime(char *, char *, int, time_t);
858
859
860 /*
861 * Global variables from ndmpd_tar3.c
862 */
863 extern char **ndmp_excl_list;
864
865
866 /*
867 * Global variables from ndmpd_util.c
868 */
869 extern int ndmp_force_bk_dirs;
870 extern int ndmp_rbs;
871 extern int ndmp_sbs;
872 extern boolean_t ndmp_dump_path_node;
873 extern boolean_t ndmp_tar_path_node;
874 extern boolean_t ndmp_ignore_ctime;
875 extern boolean_t ndmp_include_lmtime;
876
877
878 /*
879 * Utility functions from ndmpd_util.c.
880 */
881 extern int ndmpd_select(ndmpd_session_t *,
882 boolean_t,
883 ulong_t);
884
885 extern ndmp_error ndmpd_save_env(ndmpd_session_t *,
886 ndmp_pval *,
887 ulong_t);
888
889 extern void ndmpd_free_env(ndmpd_session_t *);
890 extern ndmp_error ndmpd_save_nlist_v2(ndmpd_session_t *,
891 ndmp_name *,
892 ulong_t);
893
894 extern void ndmpd_free_nlist(ndmpd_session_t *);
895 extern int ndmpd_add_file_handler(ndmpd_session_t *,
896 void *,
897 int,
898 ulong_t,
899 ulong_t,
900 ndmpd_file_handler_func_t *);
901
902 extern int ndmpd_remove_file_handler(ndmpd_session_t *,
903 int);
904
905 extern void ndmp_send_reply(ndmp_connection_t *,
906 void *,
907 char *);
908
909 extern int ndmp_mtioctl(int, int, int);
910
911 extern u_longlong_t quad_to_long_long(ndmp_u_quad);
912 extern ndmp_u_quad long_long_to_quad(u_longlong_t);
913
914 extern void set_socket_options(int sock);
915
916 extern long ndmp_buffer_get_size(ndmpd_session_t *);
917 extern int ndmp_lbr_init(ndmpd_session_t *);
918 extern void ndmp_lbr_cleanup(ndmpd_session_t *);
919
920 extern int ndmp_wait_for_mover(ndmpd_session_t *);
921 extern boolean_t is_buffer_erroneous(tlm_buffer_t *);
922 extern void ndmp_execute_cdb(ndmpd_session_t *,
923 char *,
924 int,
925 int,
926 ndmp_execute_cdb_request *);
927
928 extern scsi_adapter_t *scsi_get_adapter(int);
929 extern boolean_t is_tape_unit_ready(char *, int);
930
931 extern int ndmp_open_list_add(ndmp_connection_t *, char *, int, int, int);
932 extern int ndmp_open_list_del(char *, int, int);
933 extern void ndmp_open_list_release(ndmp_connection_t *);
934
935 extern void ndmp_stop_buffer_worker(ndmpd_session_t *);
936 extern void ndmp_stop_reader_thread(ndmpd_session_t *);
937 extern void ndmp_stop_writer_thread(ndmpd_session_t *);
938 extern void ndmp_free_reader_writer_ipc(ndmpd_session_t *);
939 extern void ndmp_waitfor_op(ndmpd_session_t *);
940
941 extern char *cctime(time_t *);
942 extern int ndmp_new_job_name(char *, size_t);
943 extern char *ndmpd_mk_temp(char *, char *);
944 extern char *ndmpd_make_bk_dir_path(char *, char *);
945 extern boolean_t ndmp_is_chkpnt_root(char *);
946 extern char **ndmpd_make_exc_list(void);
947 extern void ndmp_sort_nlist_v3(ndmpd_session_t *);
948 extern int ndmp_get_bk_dir_ino(ndmp_lbr_params_t *);
949 extern int ndmp_write_utf8magic(tlm_cmd_t *);
950 extern int ndmp_tar_writer(ndmpd_session_t *,
951 ndmpd_module_params_t *,
952 tlm_commands_t *);
953 extern void ndmp_wait_for_reader(tlm_commands_t *);
954 extern ndmp_error ndmpd_save_nlist_v3(ndmpd_session_t *,
955 ndmp_name_v3 *,
956 ulong_t);
957 extern void ndmpd_free_nlist_v3(ndmpd_session_t *);
958 extern int ndmp_create_socket(ulong_t *, ushort_t *);
959 extern int ndmp_connect_sock_v3(ulong_t, ushort_t);
960 extern void ndmp_copy_addr_v3(ndmp_addr_v3 *, ndmp_addr_v3 *);
961 extern void ndmp_copy_addr_v4(ndmp_addr_v4 *, ndmp_addr_v4 *);
962 extern char *ndmp_addr2str_v3(ndmp_addr_type);
963 extern boolean_t ndmp_valid_v3addr_type(ndmp_addr_type);
964 extern boolean_t ndmp_check_utf8magic(tlm_cmd_t *);
965 extern int ndmp_get_cur_bk_time(ndmp_lbr_params_t *,
966 time_t *);
967 extern char *ndmp_get_relative_path(char *, char *);
968
969 extern boolean_t ndmp_fhinode;
970 extern void ndmp_load_params(void);
971 extern void randomize(unsigned char *, int);
972 extern int ndmp_find_latest_autosync(zfs_handle_t *, void *);
973
974
975 /*
976 * Utility functions from ndmpd_tar3.c.
977 */
978 extern ndmp_error ndmp_restore_get_params_v3(ndmpd_session_t *,
979 ndmpd_module_params_t *);
980 extern ndmp_error ndmp_backup_get_params_v3(ndmpd_session_t *,
981 ndmpd_module_params_t *);
982
983 /*
984 * door init and fini function from ndmpd_door_serv.c
985 */
986 extern int ndmp_door_init(void);
987 extern void ndmp_door_fini(void);
988 extern boolean_t ndmp_door_check(void);
989
990 extern int ndmp_get_max_tok_seq(void);
991
992 extern int get_zfsvolname(char *, int, char *);
993 extern int ndmp_create_snapshot(char *, char *);
994 extern int ndmp_remove_snapshot(ndmp_bkup_size_arg_t *);
995 extern int ndmpd_mark_inodes_v2(ndmpd_session_t *, ndmp_lbr_params_t *);
996 extern void ndmpd_abort_marking_v2(ndmpd_session_t *);
997 extern int ndmpd_mark_inodes_v3(ndmpd_session_t *, ndmp_lbr_params_t *);
998 extern ndmp_lbr_params_t *ndmp_get_nlp(void *);
999 extern int ndmp_clone_snapshot(ndmp_lbr_params_t *);
1000
1001 module_start_func_t ndmpd_tar_backup_starter;
1002 module_abort_func_t ndmpd_tar_backup_abort;
1003
1004 module_start_func_t ndmpd_tar_restore_starter;
1005 module_abort_func_t ndmpd_tar_restore_abort;
1006
1007 module_start_func_t ndmpd_tar_backup_starter_v3;
1008 module_abort_func_t ndmpd_tar_backup_abort_v3;
1009
1010 module_start_func_t ndmpd_tar_restore_starter_v3;
1011 module_abort_func_t ndmpd_tar_restore_abort_v3;
1012
1013 extern int ndmp_backup_extract_params(ndmpd_session_t *,
1014 ndmpd_module_params_t *);
1015 extern int ndmp_restore_extract_params(ndmpd_session_t *,
1016 ndmpd_module_params_t *);
1017 extern int ndmp_tar_reader(ndmp_tar_reader_arg_t *);
1018
1019 extern int tape_open(char *, int);
1020 extern int tape_is_at_bot(ndmpd_session_t *);
1021 extern int tape_is_at_bof(ndmpd_session_t *);
1022 extern void fm_dance(ndmpd_session_t *);
1023
1024 extern void ndmp_session_ref(ndmpd_session_t *);
1025 extern void ndmp_session_unref(ndmpd_session_t *);
1026
1027 void ndmpd_get_file_entry_type(int, ndmp_file_type *);
1028
1029 extern int tcp_accept(int, unsigned int *);
1030 extern int tcp_get_peer(int, unsigned int *, int *);
1031
1032 extern char *gethostaddr(void);
1033 extern char *get_default_nic_addr(void);
1034 extern int tlm_init(void);
1035
1036 extern int backup_dataset_create(ndmp_lbr_params_t *);
1037 extern int backup_dataset_destroy(ndmp_lbr_params_t *);
1038
1039 extern boolean_t fs_is_chkpntvol(char *);
1040 extern boolean_t fs_is_chkpnt_enabled(char *);
1041 extern boolean_t fs_is_rdonly(char *);
1042 extern boolean_t fs_volexist(char *);
1043 extern boolean_t fs_is_valid_logvol(char *);
1044 extern boolean_t rootfs_dot_or_dotdot(char *);
1045 extern int dp_readdir(DIR *, unsigned long *, char *,
1046 int *, unsigned long *);
1047
1048 extern void scsi_find_sid_lun();
1049 extern char *sasd_slink_name();
1050 extern int scsi_dev_exists(char *, int, int);
1051 extern int scsi_get_devtype(char *, int, int);
1052 extern struct open_list *ndmp_open_list_find(char *, int, int);
1053 extern int filecopy(char *, char *);
1054
1055 extern void ndmp_stop_local_reader();
1056 extern void ndmp_stop_remote_reader();
1057
1058 extern boolean_t match(char *, char *);
1059 extern char *trim_whitespace(char *);
1060 extern int fs_getstat(char *, struct fs_fhandle *, struct stat64 *);
1061 extern int fs_readdir(struct fs_fhandle *, char *, long *,
1062 char *, int *, struct fs_fhandle *, struct stat64 *);
1063 extern int iscreated(ndmp_lbr_params_t *nlp, char *name, tlm_acls_t *tacl,
1064 time_t t);
1065
1066 extern int sasd_dev_count(void);
1067 extern struct scsi_link *sasd_dev_slink(int);
1068 extern struct sasd_drive *sasd_drive(int);
1069 extern void *ndmp_malloc(size_t size);
1070
1071 extern ndmp_plugin_t *ndmp_pl;
1072
1073 #define NDMP_APILOG(s, t, m, ...) \
1074 { \
1075 if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV4) \
1076 (void) ndmpd_api_log_v4(s, t, m, __VA_ARGS__); \
1077 else if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV3) \
1078 (void) ndmpd_api_log_v3(s, t, m, __VA_ARGS__); \
1079 else \
1080 (void) ndmpd_api_log_v2(s, __VA_ARGS__); \
1081 }
1082
1083 /*
1084 * Backup path utility functions
1085 */
1086 extern char *get_backup_path_v3(ndmpd_module_params_t *);
1087 extern char *get_backup_path_v2(ndmpd_module_params_t *);
1088
1089 /*
1090 * Functions for zfs-based backup
1091 */
1092
1093 module_start_func_t ndmpd_zfs_backup_starter;
1094 module_start_func_t ndmpd_zfs_restore_starter;
1095 module_abort_func_t ndmpd_zfs_abort;
1096
1097 int ndmpd_zfs_init(ndmpd_session_t *);
1098 void ndmpd_zfs_fini(ndmpd_zfs_args_t *);
1099
1100 boolean_t ndmpd_zfs_backup_parms_valid(ndmpd_zfs_args_t *);
1101 boolean_t ndmpd_zfs_restore_parms_valid(ndmpd_zfs_args_t *);
1102
1103 int ndmpd_zfs_pre_backup(ndmpd_zfs_args_t *);
1104 int ndmpd_zfs_pre_restore(ndmpd_zfs_args_t *);
1105 int ndmpd_zfs_post_backup(ndmpd_zfs_args_t *);
1106 int ndmpd_zfs_post_restore(ndmpd_zfs_args_t *);
1107
1108 void ndmpd_zfs_dma_log(ndmpd_zfs_args_t *, ndmp_log_type, char *, ...);
1109
1110 #endif /* _NDMPD_H */