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