Print this page
NEX-13374 NDMP should be able to backup unmounted ZFS filesystems
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-9532 NDMP: readdir errors when file/directory has special characters
Reviewed by: Peer Dampmann <peer.dampmann@nexenta.com>
Reviewed by: Alexander Eremin <alexander.eremin@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-5801 Snapshots left over after failed backups
Reviewed by: Rick Mesta <rick.mesta@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-2911 NDMP logging should use syslog and is too chatty
NEX-2110 NDMP leaving zombie restore and backup threads around which hold up resources
NEX-727 Netbackup Catalog verification hangs waiting for NDMP server

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/ndmpd/ndmp/ndmpd_data.c
          +++ new/usr/src/cmd/ndmpd/ndmp/ndmpd_data.c
   1    1  /*
   2    2   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
   3      - * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
        3 + * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
   4    4   */
   5    5  
   6    6  /*
   7    7   * BSD 3 Clause License
   8    8   *
   9    9   * Copyright (c) 2007, The Storage Networking Industry Association.
  10   10   *
  11   11   * Redistribution and use in source and binary forms, with or without
  12   12   * modification, are permitted provided that the following conditions
  13   13   * are met:
↓ open down ↓ 20 lines elided ↑ open up ↑
  34   34   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  35   35   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  36   36   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  37   37   * POSSIBILITY OF SUCH DAMAGE.
  38   38   */
  39   39  /* Copyright (c) 2007, The Storage Networking Industry Association. */
  40   40  /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
  41   41  #include <sys/types.h>
  42   42  #include <sys/param.h>
  43   43  #include <sys/socket.h>
       44 +#include <syslog.h>
  44   45  #include <netinet/in.h>
  45   46  #include <errno.h>
  46   47  #include <arpa/inet.h>
  47   48  #include <stdlib.h>
  48   49  #include <string.h>
  49   50  #include "ndmpd_common.h"
  50   51  #include "ndmpd.h"
  51   52  
  52   53  static int ndmpd_data_error_send_v4(ndmpd_session_t *session,
  53   54      ndmp_data_halt_reason reason);
↓ open down ↓ 10 lines elided ↑ open up ↑
  64   65  
  65   66  static ndmp_error ndmpd_tar_start_backup_v2(ndmpd_session_t *, char *,
  66   67      ndmp_pval *, ulong_t);
  67   68  static ndmp_error ndmpd_tar_start_recover_v2(ndmpd_session_t *, char *,
  68   69      ndmp_pval *, ulong_t, ndmp_name *, ulong_t);
  69   70  static ndmp_error ndmpd_tar_start_backup_v3(ndmpd_session_t *, char *,
  70   71      ndmp_pval *, ulong_t);
  71   72  static ndmp_error ndmpd_tar_start_recover_v3(ndmpd_session_t *,
  72   73      ndmp_pval *, ulong_t, ndmp_name_v3 *, ulong_t);
  73   74  
  74      -static ndmp_error ndmpd_zfs_start_op(ndmpd_session_t *,
  75      -    ndmp_pval *, ulong_t, ndmp_name_v3 *, ulong_t, enum ndmp_data_operation);
  76      -
  77      -
  78   75  /*
  79   76   * ************************************************************************
  80   77   * NDMP V2 HANDLERS
  81   78   * ************************************************************************
  82   79   */
  83   80  
  84   81  /*
  85   82   * ndmpd_data_get_state_v2
  86   83   *
  87   84   * Request handler. Returns current data state.
↓ open down ↓ 61 lines elided ↑ open up ↑
 149  146          session->ns_data.dd_mover = request->mover;
 150  147  
 151  148          err = ndmpd_tar_start_backup_v2(session, request->bu_type,
 152  149              request->env.env_val, request->env.env_len);
 153  150  
 154  151          /*
 155  152           * start_backup sends the reply if the backup is successfully started.
 156  153           * Otherwise, send the reply containing the error here.
 157  154           */
 158  155          if (err != NDMP_NO_ERR) {
 159      -                NDMP_LOG(LOG_DEBUG, "err: %d", err);
      156 +                syslog(LOG_ERR, "err: %d", err);
 160  157                  reply.error = err;
 161  158                  ndmp_send_reply(connection, &reply,
 162  159                      "sending data_start_backup reply");
 163  160                  ndmpd_data_cleanup(session);
 164  161          }
 165  162  }
 166  163  
 167  164  /*
 168  165   * ndmpd_data_start_recover_v2
 169  166   *
↓ open down ↓ 49 lines elided ↑ open up ↑
 219  216   */
 220  217  /*ARGSUSED*/
 221  218  void
 222  219  ndmpd_data_get_env_v2(ndmp_connection_t *connection, void *body)
 223  220  {
 224  221          ndmp_data_get_env_reply reply;
 225  222          ndmpd_session_t *session = ndmp_get_client_data(connection);
 226  223  
 227  224          (void) memset((void*)&reply, 0, sizeof (reply));
 228  225          if (session->ns_data.dd_operation != NDMP_DATA_OP_BACKUP) {
 229      -                NDMP_LOG(LOG_ERR, "Backup operation not active.");
      226 +                syslog(LOG_ERR, "Backup operation not active.");
 230  227                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 231  228                  reply.env.env_len = 0;
 232  229          } else {
 233  230                  reply.error = NDMP_NO_ERR;
 234  231                  reply.env.env_len = session->ns_data.dd_env_len;
 235  232                  reply.env.env_val = session->ns_data.dd_env;
 236  233          }
 237  234  
 238  235          ndmp_send_reply(connection, &reply, "sending data_get_env reply");
 239  236  }
↓ open down ↓ 12 lines elided ↑ open up ↑
 252  249   *   void
 253  250   */
 254  251  /*ARGSUSED*/
 255  252  void
 256  253  ndmpd_data_stop_v2(ndmp_connection_t *connection, void *body)
 257  254  {
 258  255          ndmp_data_stop_reply reply;
 259  256          ndmpd_session_t *session = ndmp_get_client_data(connection);
 260  257  
 261  258          if (session->ns_data.dd_state != NDMP_DATA_STATE_HALTED) {
 262      -                NDMP_LOG(LOG_ERR, "Invalid state to process stop request.");
 263  259                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 264  260                  ndmp_send_reply(connection, &reply,
 265  261                      "sending data_stop reply");
 266  262                  return;
 267  263          }
 268  264          ndmp_waitfor_op(session);
 269  265          ndmpd_data_cleanup(session);
 270  266          ndmpd_file_history_cleanup(session, FALSE);
 271  267  
 272  268          nlp_release_job_stat(session);
↓ open down ↓ 23 lines elided ↑ open up ↑
 296  292   */
 297  293  /*ARGSUSED*/
 298  294  void
 299  295  ndmpd_data_abort_v2(ndmp_connection_t *connection, void *body)
 300  296  {
 301  297          ndmp_data_abort_reply reply;
 302  298          ndmpd_session_t *session = ndmp_get_client_data(connection);
 303  299  
 304  300          if (session->ns_data.dd_state == NDMP_DATA_STATE_IDLE ||
 305  301              session->ns_data.dd_state == NDMP_DATA_STATE_HALTED) {
 306      -                NDMP_LOG(LOG_ERR, "Invalid state to process abort request.");
 307  302                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 308  303                  ndmp_send_reply(connection, &reply,
 309  304                      "sending data_abort reply");
 310  305                  return;
 311  306          }
 312  307          /*
 313  308           * Don't go to HALTED state yet. Need to wait for data operation to
 314  309           * abort. When this happens, ndmpd_done will get called and will
 315  310           * perform the halt processing.
 316  311           */
↓ open down ↓ 77 lines elided ↑ open up ↑
 394  389  {
 395  390          ndmp_data_start_backup_request_v3 *request;
 396  391          ndmp_data_start_backup_reply_v3 reply;
 397  392          ndmpd_session_t *session = ndmp_get_client_data(connection);
 398  393  
 399  394          request = (ndmp_data_start_backup_request_v3 *)body;
 400  395  
 401  396          (void) memset((void*)&reply, 0, sizeof (reply));
 402  397  
 403  398          if (session->ns_data.dd_state != NDMP_DATA_STATE_CONNECTED) {
 404      -                NDMP_LOG(LOG_ERR,
 405      -                    "Can't start new backup in current state.");
 406      -                NDMP_LOG(LOG_ERR,
 407      -                    "Connection to the mover is not established.");
      399 +                syslog(LOG_ERR,
      400 +                    "Can't start new backup in NOT CONNECTED state.");
 408  401                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 409  402                  goto _error;
 410  403          }
 411  404  
 412  405          if (session->ns_data.dd_data_addr.addr_type == NDMP_ADDR_LOCAL) {
 413  406                  if (session->ns_tape.td_mode == NDMP_TAPE_READ_MODE) {
 414      -                        NDMP_LOG(LOG_ERR, "Write protected device.");
      407 +                        syslog(LOG_ERR, "Write protected device.");
 415  408                          reply.error = NDMP_WRITE_PROTECT_ERR;
 416  409                          goto _error;
 417  410                  }
 418  411          }
 419  412  
 420  413          if (strcasecmp(request->bu_type, NDMP_TAR_TYPE) == 0) {
 421  414                  session->ns_butype = NDMP_BUTYPE_TAR;
 422  415          } else if (strcasecmp(request->bu_type, NDMP_DUMP_TYPE) == 0) {
 423  416                  session->ns_butype = NDMP_BUTYPE_DUMP;
 424  417          } else if (strcasecmp(request->bu_type, NDMP_ZFS_TYPE) == 0) {
 425  418                  session->ns_butype = NDMP_BUTYPE_ZFS;
 426  419          } else {
 427  420                  char msg_invalid[32];
 428  421                  char msg_types[32];
 429  422  
 430  423                  (void) snprintf(msg_invalid, 32, "Invalid backup type: %s.",
 431  424                      request->bu_type);
 432  425                  (void) snprintf(msg_types, 32,
 433      -                    "Supported backup types are tar, dump, and zfs.");
      426 +                    "Supported backup types are tar, dump.");
 434  427  
 435  428                  NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
 436  429                      msg_invalid);
 437  430                  NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
 438  431                      msg_types);
 439      -                NDMP_LOG(LOG_ERR, msg_invalid);
 440      -                NDMP_LOG(LOG_ERR, msg_types);
      432 +                syslog(LOG_ERR, "Invalid backup type: %s.",
      433 +                    request->bu_type);
      434 +                syslog(LOG_ERR,
      435 +                    "Supported backup types are tar, dump.");
 441  436  
 442  437                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 443  438                  goto _error;
 444  439          }
 445  440  
 446      -        if (session->ns_butype == NDMP_BUTYPE_ZFS) {
 447      -                reply.error = ndmpd_zfs_start_op(session, request->env.env_val,
 448      -                    request->env.env_len, NULL, 0, NDMP_DATA_OP_BACKUP);
 449      -        } else {
 450      -                reply.error = ndmpd_tar_start_backup_v3(session,
 451      -                    request->bu_type, request->env.env_val,
 452      -                    request->env.env_len);
 453      -        }
      441 +        reply.error = ndmpd_tar_start_backup_v3(session,
      442 +            request->bu_type, request->env.env_val,
      443 +            request->env.env_len);
 454  444  
 455  445          /*
 456  446           * *_start_backup* sends the reply if the backup is
 457  447           * successfully started.  Otherwise, send the reply
 458  448           * containing the error here.
 459  449           */
 460  450  
 461  451  _error:
 462  452  
 463  453          if (reply.error != NDMP_NO_ERR) {
↓ open down ↓ 20 lines elided ↑ open up ↑
 484  474  {
 485  475          ndmp_data_start_recover_request_v3 *request;
 486  476          ndmp_data_start_recover_reply_v3 reply;
 487  477          ndmpd_session_t *session = ndmp_get_client_data(connection);
 488  478  
 489  479          request = (ndmp_data_start_recover_request_v3 *)body;
 490  480  
 491  481          (void) memset((void*)&reply, 0, sizeof (reply));
 492  482  
 493  483          if (session->ns_data.dd_state != NDMP_DATA_STATE_CONNECTED) {
 494      -                NDMP_LOG(LOG_ERR, "Can't start new recover in current state.");
      484 +                syslog(LOG_ERR, "Can't start new recover in current state.");
 495  485                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 496  486                  goto _error;
 497  487          }
 498  488  
 499  489          if (strcasecmp(request->bu_type, NDMP_TAR_TYPE) == 0) {
 500  490                  session->ns_butype = NDMP_BUTYPE_TAR;
 501  491          } else if (strcasecmp(request->bu_type, NDMP_DUMP_TYPE) == 0) {
 502  492                  session->ns_butype = NDMP_BUTYPE_DUMP;
 503  493          } else if (strcasecmp(request->bu_type, NDMP_ZFS_TYPE) == 0) {
 504  494                  session->ns_butype = NDMP_BUTYPE_ZFS;
 505  495          } else {
 506  496                  char msg_invalid[32];
 507  497                  char msg_types[32];
 508  498  
 509  499                  (void) snprintf(msg_invalid, 32, "Invalid backup type: %s.",
 510  500                      request->bu_type);
 511  501                  (void) snprintf(msg_types, 32,
 512      -                    "Supported backup types are tar, dump, and zfs.");
      502 +                    "Supported backup types are tar, dump.");
 513  503  
 514  504                  NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
 515  505                      msg_invalid);
 516  506                  NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
 517  507                      msg_types);
 518      -                NDMP_LOG(LOG_ERR, msg_invalid);
 519      -                NDMP_LOG(LOG_ERR, msg_types);
      508 +                syslog(LOG_ERR, "Invalid backup type: %s.",
      509 +                    request->bu_type);
      510 +                syslog(LOG_ERR,
      511 +                    "Supported backup types are tar, dump.");
 520  512  
 521  513                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 522  514                  goto _error;
 523  515          }
 524  516  
 525      -        if (session->ns_butype == NDMP_BUTYPE_ZFS) {
 526      -                reply.error = ndmpd_zfs_start_op(session, request->env.env_val,
 527      -                    request->env.env_len, request->nlist.nlist_val,
 528      -                    request->nlist.nlist_len, NDMP_DATA_OP_RECOVER);
 529      -        } else {
 530      -                reply.error = ndmpd_tar_start_recover_v3(session,
 531      -                    request->env.env_val, request->env.env_len,
 532      -                    request->nlist.nlist_val, request->nlist.nlist_len);
 533      -        }
      517 +        reply.error = ndmpd_tar_start_recover_v3(session,
      518 +            request->env.env_val, request->env.env_len,
      519 +            request->nlist.nlist_val, request->nlist.nlist_len);
 534  520  
 535  521          /*
 536  522           * *_start_recover* sends the reply if the recover is
 537  523           * successfully started.  Otherwise, send the reply
 538  524           * containing the error here.
 539  525           */
 540  526  
 541  527  _error:
 542  528  
 543  529          if (reply.error != NDMP_NO_ERR) {
↓ open down ↓ 21 lines elided ↑ open up ↑
 565  551  /*ARGSUSED*/
 566  552  void
 567  553  ndmpd_data_abort_v3(ndmp_connection_t *connection, void *body)
 568  554  {
 569  555          ndmp_data_abort_reply reply;
 570  556          ndmpd_session_t *session = ndmp_get_client_data(connection);
 571  557  
 572  558          switch (session->ns_data.dd_state) {
 573  559          case NDMP_DATA_STATE_IDLE:
 574  560                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 575      -                NDMP_LOG(LOG_ERR, "Invalid state to process abort request.");
 576  561                  break;
 577  562  
 578  563          case NDMP_DATA_STATE_ACTIVE:
 579  564                  /*
 580  565                   * Don't go to HALTED state yet.  Need to wait for data
 581  566                   * operation to abort.  When this happens, ndmpd_done_v3
 582  567                   * will get called and will perform the halt processing.
 583  568                   */
 584  569                  reply.error = NDMP_NO_ERR;
 585  570                  session->ns_data.dd_abort = TRUE;
↓ open down ↓ 4 lines elided ↑ open up ↑
 590  575  
 591  576          case NDMP_DATA_STATE_HALTED:
 592  577          case NDMP_DATA_STATE_LISTEN:
 593  578          case NDMP_DATA_STATE_CONNECTED:
 594  579                  reply.error = NDMP_NO_ERR;
 595  580                  session->ns_data.dd_abort = TRUE;
 596  581                  ndmpd_data_error(session, NDMP_DATA_HALT_ABORTED);
 597  582                  break;
 598  583          default:
 599  584                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 600      -                NDMP_LOG(LOG_DEBUG, "Unknown data V3 state %d",
      585 +                syslog(LOG_ERR, "Unknown data V3 state %d",
 601  586                      session->ns_data.dd_state);
 602  587          }
 603  588  
 604  589          ndmp_send_reply(connection, &reply,
 605  590              "sending data_abort_v3 reply");
 606  591  }
 607  592  
 608  593  
 609  594  /*
 610  595   * ndmpd_data_stop_v3
↓ open down ↓ 8 lines elided ↑ open up ↑
 619  604   *   void
 620  605   */
 621  606  /*ARGSUSED*/
 622  607  void
 623  608  ndmpd_data_stop_v3(ndmp_connection_t *connection, void *body)
 624  609  {
 625  610          ndmp_data_stop_reply reply;
 626  611          ndmpd_session_t *session = ndmp_get_client_data(connection);
 627  612  
 628  613          if (session->ns_data.dd_state != NDMP_DATA_STATE_HALTED) {
 629      -                NDMP_LOG(LOG_ERR, "Invalid state to process stop request.");
 630  614                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 631  615                  ndmp_send_reply(connection, &reply,
 632  616                      "sending data_stop_v3 reply");
 633  617                  return;
 634  618          }
 635  619          ndmp_waitfor_op(session);
 636  620          ndmpd_data_cleanup(session);
 637  621          ndmpd_file_history_cleanup(session, FALSE);
 638  622  
 639  623          /* prepare for another data operation */
↓ open down ↓ 27 lines elided ↑ open up ↑
 667  651          ndmpd_session_t *session = ndmp_get_client_data(connection);
 668  652          ulong_t addr;
 669  653          ushort_t port;
 670  654  
 671  655          request = (ndmp_data_listen_request_v3 *)body;
 672  656  
 673  657          (void) memset((void*)&reply, 0, sizeof (reply));
 674  658  
 675  659          if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
 676  660                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 677      -                NDMP_LOG(LOG_ERR,
      661 +                syslog(LOG_ERR,
 678  662                      "Invalid internal data state to process listen request.");
 679  663          } else if (session->ns_mover.md_state != NDMP_MOVER_STATE_IDLE) {
 680  664                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 681      -                NDMP_LOG(LOG_ERR,
      665 +                syslog(LOG_ERR,
 682  666                      "Invalid mover state to process listen request.");
 683  667          } else {
 684  668                  reply.error = NDMP_NO_ERR;
 685  669          }
 686  670  
 687  671          if (reply.error != NDMP_NO_ERR) {
 688  672                  ndmp_send_reply(connection, &reply,
 689  673                      "ndmp_data_listen_request_v3 reply");
 690  674                  return;
 691  675          }
↓ open down ↓ 9 lines elided ↑ open up ↑
 701  685                          break;
 702  686                  }
 703  687  
 704  688                  reply.error = NDMP_NO_ERR;
 705  689                  reply.data_connection_addr.addr_type = request->addr_type;
 706  690                  reply.data_connection_addr.tcp_ip_v3 = htonl(addr);
 707  691                  reply.data_connection_addr.tcp_port_v3 = htons(port);
 708  692                  session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_TCP;
 709  693                  session->ns_data.dd_data_addr.tcp_ip_v3 = addr;
 710  694                  session->ns_data.dd_data_addr.tcp_port_v3 = ntohs(port);
 711      -                NDMP_LOG(LOG_DEBUG, "listen_socket: %d",
      695 +                syslog(LOG_DEBUG, "listen_socket: %d",
 712  696                      session->ns_data.dd_listen_sock);
 713  697                  break;
 714  698  
 715  699          default:
 716      -                NDMP_LOG(LOG_DEBUG, "Invalid address type: %d",
      700 +                syslog(LOG_ERR, "Invalid address type: %d",
 717  701                      request->addr_type);
 718  702                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 719  703                  break;
 720  704          }
 721  705  
 722  706          if (reply.error == NDMP_NO_ERR)
 723  707                  session->ns_data.dd_state = NDMP_DATA_STATE_LISTEN;
 724  708  
 725  709          ndmp_send_reply(connection, &reply,
 726  710              "ndmp_data_listen_request_v3 reply");
↓ open down ↓ 19 lines elided ↑ open up ↑
 746  730          ndmp_data_connect_request_v3 *request;
 747  731          ndmp_data_connect_reply_v3 reply;
 748  732          ndmpd_session_t *session = ndmp_get_client_data(connection);
 749  733  
 750  734          request = (ndmp_data_connect_request_v3 *)body;
 751  735  
 752  736          (void) memset((void*)&reply, 0, sizeof (reply));
 753  737  
 754  738          if (!ndmp_valid_v3addr_type(request->addr.addr_type)) {
 755  739                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 756      -                NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
      740 +                syslog(LOG_ERR, "Invalid address type %d",
 757  741                      request->addr.addr_type);
 758  742          } else if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
 759  743                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 760      -                NDMP_LOG(LOG_ERR, "Invalid state to process connect request.");
 761  744          } else {
 762  745                  reply.error = NDMP_NO_ERR;
 763  746          }
 764  747  
 765  748          if (reply.error != NDMP_NO_ERR) {
 766  749                  ndmp_send_reply(connection, &reply,
 767  750                      "sending ndmp_data_connect_v3 reply");
 768  751                  return;
 769  752          }
 770  753  
 771  754          switch (request->addr.addr_type) {
 772  755          case NDMP_ADDR_LOCAL:
 773  756                  /*
 774  757                   * Verify that the mover is listening for a
 775  758                   * local connection
 776  759                   */
 777  760                  if (session->ns_mover.md_state != NDMP_MOVER_STATE_LISTEN ||
 778  761                      session->ns_mover.md_listen_sock != -1) {
 779  762                          reply.error = NDMP_ILLEGAL_STATE_ERR;
 780      -                        NDMP_LOG(LOG_ERR,
      763 +                        syslog(LOG_ERR,
 781  764                              "Mover is not in local listen state.");
 782  765                  } else {
 783  766                          session->ns_mover.md_state = NDMP_MOVER_STATE_ACTIVE;
 784  767                  }
 785  768                  break;
 786  769  
 787  770          case NDMP_ADDR_TCP:
 788  771                  reply.error = data_connect_sock_v3(session,
 789  772                      request->addr.tcp_ip_v3, request->addr.tcp_port_v3);
 790  773                  break;
 791  774  
 792  775          default:
 793  776                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 794      -                NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
      777 +                syslog(LOG_ERR, "Invalid address type %d",
 795  778                      request->addr.addr_type);
 796  779          }
 797  780  
 798  781          if (reply.error == NDMP_NO_ERR)
 799  782                  session->ns_data.dd_state = NDMP_DATA_STATE_CONNECTED;
 800  783  
 801  784          ndmp_send_reply(connection, &reply,
 802  785              "sending ndmp_data_connect_v3 reply");
 803  786  }
 804  787  
↓ open down ↓ 22 lines elided ↑ open up ↑
 827  810  void
 828  811  ndmpd_data_get_env_v4(ndmp_connection_t *connection, void *body)
 829  812  {
 830  813          ndmp_data_get_env_reply reply;
 831  814          ndmpd_session_t *session = ndmp_get_client_data(connection);
 832  815  
 833  816          (void) memset((void*)&reply, 0, sizeof (reply));
 834  817  
 835  818          if (session->ns_data.dd_state != NDMP_DATA_STATE_ACTIVE &&
 836  819              session->ns_data.dd_state != NDMP_DATA_STATE_HALTED) {
 837      -                NDMP_LOG(LOG_ERR, "Invalid state for the data server.");
 838  820                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 839  821                  reply.env.env_len = 0;
 840  822          } else if (session->ns_data.dd_operation != NDMP_DATA_OP_BACKUP) {
 841      -                NDMP_LOG(LOG_ERR, "Backup operation not active.");
      823 +                syslog(LOG_ERR, "Backup operation not active.");
 842  824                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 843  825                  reply.env.env_len = 0;
 844  826          } else {
 845  827                  reply.error = NDMP_NO_ERR;
 846  828                  reply.env.env_len = session->ns_data.dd_env_len;
 847  829                  reply.env.env_val = session->ns_data.dd_env;
 848  830          }
 849  831  
 850  832          ndmp_send_reply(connection, &reply, "sending data_get_env reply");
 851  833  }
↓ open down ↓ 67 lines elided ↑ open up ↑
 919  901          ndmp_data_connect_request_v4 *request;
 920  902          ndmp_data_connect_reply_v4 reply;
 921  903          ndmpd_session_t *session = ndmp_get_client_data(connection);
 922  904  
 923  905          request = (ndmp_data_connect_request_v4 *)body;
 924  906  
 925  907          (void) memset((void*)&reply, 0, sizeof (reply));
 926  908  
 927  909          if (!ndmp_valid_v3addr_type(request->addr.addr_type)) {
 928  910                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 929      -                NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
      911 +                syslog(LOG_ERR, "Invalid address type %d",
 930  912                      request->addr.addr_type);
 931  913          } else if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
 932  914                  reply.error = NDMP_ILLEGAL_STATE_ERR;
 933      -                NDMP_LOG(LOG_ERR, "Invalid state to process connect request.");
 934  915          } else {
 935  916                  reply.error = NDMP_NO_ERR;
 936  917          }
 937  918  
 938  919          if (reply.error != NDMP_NO_ERR) {
 939  920                  ndmp_send_reply(connection, &reply,
 940  921                      "sending ndmp_data_connect_v4 reply");
 941  922                  return;
 942  923          }
 943  924  
 944  925          switch (request->addr.addr_type) {
 945  926          case NDMP_ADDR_LOCAL:
 946  927                  /*
 947  928                   * Verify that the mover is listening for a
 948  929                   * local connection
 949  930                   */
 950  931                  if (session->ns_mover.md_state != NDMP_MOVER_STATE_LISTEN ||
 951  932                      session->ns_mover.md_listen_sock != -1) {
 952  933                          reply.error = NDMP_ILLEGAL_STATE_ERR;
 953      -                        NDMP_LOG(LOG_ERR,
      934 +                        syslog(LOG_ERR,
 954  935                              "Mover is not in local listen state.");
 955  936                  } else {
 956  937                          session->ns_mover.md_state = NDMP_MOVER_STATE_ACTIVE;
 957  938                  }
 958  939                  break;
 959  940  
 960  941          case NDMP_ADDR_TCP:
 961  942                  reply.error = data_connect_sock_v3(session,
 962  943                      request->addr.tcp_ip_v4(0), request->addr.tcp_port_v4(0));
 963  944                  break;
 964  945  
 965  946          default:
 966  947                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
 967      -                NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
      948 +                syslog(LOG_ERR, "Invalid address type %d",
 968  949                      request->addr.addr_type);
 969  950          }
 970  951  
 971  952          if (reply.error == NDMP_NO_ERR)
 972  953                  session->ns_data.dd_state = NDMP_DATA_STATE_CONNECTED;
 973  954  
 974  955          ndmp_send_reply(connection, &reply,
 975  956              "sending ndmp_data_connect_v4 reply");
 976  957  }
 977  958  
↓ open down ↓ 18 lines elided ↑ open up ↑
 996  977          ndmpd_session_t *session = ndmp_get_client_data(connection);
 997  978          ulong_t addr;
 998  979          ushort_t port;
 999  980  
1000  981          request = (ndmp_data_listen_request_v4 *)body;
1001  982  
1002  983          (void) memset((void*)&reply, 0, sizeof (reply));
1003  984  
1004  985          if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
1005  986                  reply.error = NDMP_ILLEGAL_STATE_ERR;
1006      -                NDMP_LOG(LOG_ERR,
      987 +                syslog(LOG_ERR,
1007  988                      "Invalid internal data state to process listen request.");
1008  989          } else if (session->ns_mover.md_state != NDMP_MOVER_STATE_IDLE) {
1009  990                  reply.error = NDMP_ILLEGAL_STATE_ERR;
1010      -                NDMP_LOG(LOG_ERR,
      991 +                syslog(LOG_ERR,
1011  992                      "Invalid mover state to process listen request.");
1012  993          } else {
1013  994                  reply.error = NDMP_NO_ERR;
1014  995          }
1015  996  
1016  997          if (reply.error != NDMP_NO_ERR) {
1017  998                  ndmp_send_reply(connection, &reply,
1018  999                      "ndmp_data_listen_request_v4 reply");
1019 1000                  return;
1020 1001          }
↓ open down ↓ 23 lines elided ↑ open up ↑
1044 1025                      ndmp_malloc(sizeof (ndmp_tcp_addr_v4));
1045 1026  
1046 1027                  session->ns_data.dd_data_addr_v4.tcp_ip_v4(0) = addr;
1047 1028                  session->ns_data.dd_data_addr_v4.tcp_port_v4(0) = ntohs(port);
1048 1029                  session->ns_data.dd_data_addr_v4.tcp_len_v4 = 1;
1049 1030  
1050 1031                  /* Copy that to data_addr for compatibility */
1051 1032                  session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_TCP;
1052 1033                  session->ns_data.dd_data_addr.tcp_ip_v3 = addr;
1053 1034                  session->ns_data.dd_data_addr.tcp_port_v3 = ntohs(port);
1054      -                NDMP_LOG(LOG_DEBUG, "listen_socket: %d",
     1035 +                syslog(LOG_DEBUG, "listen_socket: %d",
1055 1036                      session->ns_data.dd_listen_sock);
1056 1037                  break;
1057 1038  
1058 1039          default:
1059      -                NDMP_LOG(LOG_DEBUG, "Invalid address type: %d",
     1040 +                syslog(LOG_ERR, "Invalid address type: %d",
1060 1041                      request->addr_type);
1061 1042                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
1062 1043                  break;
1063 1044          }
1064 1045  
1065 1046          if (reply.error == NDMP_NO_ERR)
1066 1047                  session->ns_data.dd_state = NDMP_DATA_STATE_LISTEN;
1067 1048  
1068 1049          ndmp_send_reply(connection, &reply,
1069 1050              "ndmp_data_listen_request_v4 reply");
↓ open down ↓ 12 lines elided ↑ open up ↑
1082 1063   *
1083 1064   * Returns:
1084 1065   *   void
1085 1066   */
1086 1067  /*ARGSUSED*/
1087 1068  void
1088 1069  ndmpd_data_start_recover_filehist_v4(ndmp_connection_t *connection, void *body)
1089 1070  {
1090 1071          ndmp_data_start_recover_filehist_reply_v4 reply;
1091 1072  
1092      -        NDMP_LOG(LOG_DEBUG, "Request not supported");
     1073 +        syslog(LOG_DEBUG, "Request not supported");
1093 1074          reply.error = NDMP_NOT_SUPPORTED_ERR;
1094 1075  
1095 1076          ndmp_send_reply(connection, &reply,
1096 1077              "sending ndmp_data_start_recover_filehist_reply_v4 reply");
1097 1078  }
1098 1079  
1099 1080  /*
1100 1081   * ************************************************************************
1101 1082   * LOCALS
1102 1083   * ************************************************************************
↓ open down ↓ 85 lines elided ↑ open up ↑
1188 1169                  if (session->ns_data.dd_data_addr.addr_type
1189 1170                      == NDMP_ADDR_LOCAL && reason == NDMP_DATA_HALT_SUCCESSFUL)
1190 1171                          (void) ndmpd_local_write_v3(session, 0, 0);
1191 1172          }
1192 1173  
1193 1174          session->ns_data.dd_state = NDMP_DATA_STATE_HALTED;
1194 1175          session->ns_data.dd_halt_reason = reason;
1195 1176  
1196 1177          if (session->ns_protocol_version == NDMPV4) {
1197 1178                  if (ndmpd_data_error_send_v4(session, reason) < 0)
1198      -                        NDMP_LOG(LOG_DEBUG,
     1179 +                        syslog(LOG_ERR,
1199 1180                              "Error sending notify_data_halted request");
1200 1181          } else {
1201 1182                  if (ndmpd_data_error_send(session, reason) < 0)
1202      -                        NDMP_LOG(LOG_DEBUG,
     1183 +                        syslog(LOG_ERR,
1203 1184                              "Error sending notify_data_halted request");
1204 1185          }
1205 1186  
1206 1187          if (session->ns_data.dd_data_addr.addr_type == NDMP_ADDR_TCP) {
1207 1188                  if (session->ns_data.dd_sock != -1) {
1208 1189                          (void) ndmpd_remove_file_handler(session,
1209 1190                              session->ns_data.dd_sock);
1210 1191                          /*
1211 1192                           * ndmpcopy: we use the same socket for the mover,
1212 1193                           * so expect to close when mover is done!
↓ open down ↓ 37 lines elided ↑ open up ↑
1250 1231  data_accept_connection_v3(void *cookie, int fd, ulong_t mode)
1251 1232  {
1252 1233          ndmpd_session_t *session = (ndmpd_session_t *)cookie;
1253 1234          int from_len;
1254 1235          struct sockaddr_in from;
1255 1236  
1256 1237          from_len = sizeof (from);
1257 1238          session->ns_data.dd_sock = accept(fd, (struct sockaddr *)&from,
1258 1239              &from_len);
1259 1240  
1260      -        NDMP_LOG(LOG_DEBUG, "sock fd: %d",
     1241 +        syslog(LOG_DEBUG, "sock fd: %d",
1261 1242              session->ns_data.dd_sock);
1262      -        NDMP_LOG(LOG_DEBUG, "sin: port %d addr %s",
     1243 +        syslog(LOG_DEBUG, "sin: port %d addr %s",
1263 1244              ntohs(from.sin_port),
1264 1245              inet_ntoa(IN_ADDR(from.sin_addr.s_addr)));
1265 1246  
1266 1247          (void) ndmpd_remove_file_handler(session, fd);
1267 1248          (void) close(session->ns_data.dd_listen_sock);
1268 1249          session->ns_data.dd_listen_sock = -1;
1269 1250  
1270 1251          if (session->ns_data.dd_sock < 0) {
1271      -                NDMP_LOG(LOG_DEBUG, "Accept error: %m");
     1252 +                syslog(LOG_ERR, "Accept error: %m");
1272 1253                  ndmpd_data_error(session, NDMP_DATA_HALT_CONNECT_ERROR);
1273 1254                  return;
1274 1255          }
1275 1256  
1276 1257          /*
1277 1258           * Save the peer address.
1278 1259           */
1279 1260          session->ns_data.dd_data_addr.tcp_ip_v3 = from.sin_addr.s_addr;
1280 1261          session->ns_data.dd_data_addr.tcp_port_v3 = ntohs(from.sin_port);
1281 1262  
↓ open down ↓ 22 lines elided ↑ open up ↑
1304 1285           * ndmpd_select will call data_accept_connection when a
1305 1286           * connection is ready to be accepted.
1306 1287           */
1307 1288          if (ndmpd_add_file_handler(session, (void*)session,
1308 1289              session->ns_data.dd_listen_sock, NDMPD_SELECT_MODE_READ, HC_MOVER,
1309 1290              data_accept_connection_v3) < 0) {
1310 1291                  (void) close(session->ns_data.dd_listen_sock);
1311 1292                  session->ns_data.dd_listen_sock = -1;
1312 1293                  return (-1);
1313 1294          }
1314      -        NDMP_LOG(LOG_DEBUG, "addr: %s:%d",
     1295 +        syslog(LOG_DEBUG, "addr: %s:%d",
1315 1296              inet_ntoa(IN_ADDR(*addr)), ntohs(*port));
1316 1297  
1317 1298          return (0);
1318 1299  }
1319 1300  
1320 1301  
1321 1302  /*
1322 1303   * data_connect_sock_v3
1323 1304   *
1324 1305   * Connect the data interface socket to the specified ip/port
↓ open down ↓ 41 lines elided ↑ open up ↑
1366 1347   *   otherwise - error code of backup start error.
1367 1348   */
1368 1349  static ndmp_error
1369 1350  ndmpd_tar_start_backup_v3(ndmpd_session_t *session, char *bu_type,
1370 1351      ndmp_pval *env_val, ulong_t env_len)
1371 1352  {
1372 1353          int err;
1373 1354          ndmp_lbr_params_t *nlp;
1374 1355          ndmpd_module_params_t *params;
1375 1356          ndmp_data_start_backup_reply_v3 reply;
     1357 +        pthread_t tid;
1376 1358  
1377 1359          (void) memset((void*)&reply, 0, sizeof (reply));
1378 1360  
1379 1361          err = ndmpd_save_env(session, env_val, env_len);
1380 1362          if (err != NDMP_NO_ERR)
1381 1363                  return (err);
1382 1364  
1383 1365          nlp = ndmp_get_nlp(session);
1384 1366          NDMP_FREE(nlp->nlp_params);
1385 1367          params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
↓ open down ↓ 49 lines elided ↑ open up ↑
1435 1417          session->ns_data.dd_nlist_v3 = 0;
1436 1418          session->ns_data.dd_nlist_len = 0;
1437 1419          session->ns_data.dd_bytes_left_to_read = 0;
1438 1420          session->ns_data.dd_position = 0;
1439 1421          session->ns_data.dd_discard_length = 0;
1440 1422          session->ns_data.dd_read_offset = 0;
1441 1423          session->ns_data.dd_read_length = 0;
1442 1424  
1443 1425          reply.error = ndmp_backup_get_params_v3(session, params);
1444 1426          if (reply.error != NDMP_NO_ERR) {
1445      -                NDMP_LOG(LOG_DEBUG, "err: %d", err);
     1427 +                syslog(LOG_ERR, "err: %d", err);
1446 1428                  NDMP_FREE(nlp->nlp_params);
1447 1429                  return (reply.error);
1448 1430          }
1449 1431  
1450 1432          reply.error = NDMP_NO_ERR;
1451 1433          if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
1452 1434              &reply) < 0) {
1453      -                NDMP_LOG(LOG_DEBUG, "Sending data_start_backup_v3 reply");
     1435 +                syslog(LOG_DEBUG, "Sending data_start_backup_v3 reply");
1454 1436                  return (NDMP_NO_ERR);
1455 1437          }
1456 1438  
1457 1439          NS_INC(nbk);
1458 1440          session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
1459 1441          session->ns_data.dd_operation = NDMP_DATA_OP_BACKUP;
1460 1442          session->ns_data.dd_abort = FALSE;
1461 1443  
1462 1444          /*
1463 1445           * perform the backup
1464 1446           *
1465 1447           * Cannot wait for the thread to exit as we are replying to the
1466 1448           * client request here.
1467 1449           */
1468      -        err = pthread_create(NULL, NULL,
     1450 +        err = pthread_create(&tid, NULL,
1469 1451              (funct_t)session->ns_data.dd_module.dm_start_func,
1470 1452              params);
     1453 +
1471 1454          if (err != 0) {
1472      -                NDMP_LOG(LOG_ERR, "Can't start backup session.");
     1455 +                syslog(LOG_ERR, "Can't start V3 backup session.");
1473 1456                  return (NDMP_ILLEGAL_ARGS_ERR);
1474 1457          }
1475 1458  
     1459 +        (void) pthread_detach(tid);
     1460 +
1476 1461          return (NDMP_NO_ERR);
1477 1462  }
1478 1463  
1479 1464  /*
1480 1465   * ndmpd_tar_start_recover_v3
1481 1466   *
1482 1467   * Start the restore work
1483 1468   *
1484 1469   * Parameters:
1485 1470   *   session   (input) - session pointer.
↓ open down ↓ 8 lines elided ↑ open up ↑
1494 1479   *   otherwise   - error code of recover start error.
1495 1480   */
1496 1481  static ndmp_error
1497 1482  ndmpd_tar_start_recover_v3(ndmpd_session_t *session,
1498 1483      ndmp_pval *env_val, ulong_t env_len, ndmp_name_v3 *nlist_val,
1499 1484      ulong_t nlist_len)
1500 1485  {
1501 1486          ndmp_data_start_recover_reply_v3 reply;
1502 1487          ndmpd_module_params_t *params;
1503 1488          ndmp_lbr_params_t *nlp;
     1489 +        pthread_t tid;
1504 1490          int err;
1505 1491  
1506 1492          (void) memset((void*)&reply, 0, sizeof (reply));
1507 1493  
1508 1494          nlp = ndmp_get_nlp(session);
1509 1495          NDMP_FREE(nlp->nlp_params);
1510 1496          params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
1511 1497          if (!params) {
1512 1498                  return (NDMP_NO_MEM_ERR);
1513 1499          }
↓ open down ↓ 56 lines elided ↑ open up ↑
1570 1556          if (err != NDMP_NO_ERR) {
1571 1557                  NDMP_FREE(nlp->nlp_params);
1572 1558                  return (err);
1573 1559          }
1574 1560  
1575 1561          reply.error = NDMP_NO_ERR;
1576 1562          if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
1577 1563              &reply) < 0) {
1578 1564                  NDMP_FREE(nlp->nlp_params);
1579 1565                  ndmpd_free_nlist_v3(session);
1580      -                NDMP_LOG(LOG_DEBUG,
     1566 +                syslog(LOG_ERR,
1581 1567                      "Error sending ndmp_data_start_recover_reply");
1582 1568                  ndmpd_data_error(session, NDMP_DATA_HALT_CONNECT_ERROR);
1583 1569                  return (NDMP_NO_ERR);
1584 1570          }
1585 1571  
1586 1572          NS_INC(nrs);
1587 1573          session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
1588 1574          session->ns_data.dd_operation = NDMP_DATA_OP_RECOVER;
1589 1575          session->ns_data.dd_abort = FALSE;
1590 1576  
1591 1577          /*
1592 1578           * perform the restore
1593 1579           *
1594 1580           * Cannot wait for the thread to exit as we are replying to the
1595 1581           * client request here.
1596 1582           */
1597      -        err = pthread_create(NULL, NULL,
     1583 +        err = pthread_create(&tid, NULL,
1598 1584              (funct_t)session->ns_data.dd_module.dm_start_func,
1599 1585              params);
1600 1586  
1601 1587          if (err != 0) {
1602      -                NDMP_LOG(LOG_ERR, "Can't start recover session.");
     1588 +                syslog(LOG_ERR, "Can't start V3 recover session.");
1603 1589                  return (NDMP_ILLEGAL_ARGS_ERR);
1604 1590          }
1605      -        return (NDMP_NO_ERR);
1606      -}
1607 1591  
1608      -static ndmp_error
1609      -ndmpd_zfs_start_op(ndmpd_session_t *session, ndmp_pval *env_val,
1610      -    ulong_t env_len, ndmp_name_v3 *nlist_val, ulong_t nlist_len,
1611      -    enum ndmp_data_operation op)
1612      -{
1613      -        ndmpd_zfs_args_t *ndmpd_zfs_args = &session->ns_ndmpd_zfs_args;
1614      -        ndmp_data_start_backup_reply_v3 backup_reply;
1615      -        ndmp_data_start_recover_reply_v3 recover_reply;
1616      -        pthread_t tid;
1617      -        void *reply;
1618      -        char str[8];
1619      -        int err;
1620      -
1621      -        if (ndmpd_zfs_init(session) != 0)
1622      -                return (NDMP_UNDEFINED_ERR);
1623      -
1624      -        err = ndmpd_save_env(session, env_val, env_len);
1625      -        if (err != NDMP_NO_ERR) {
1626      -                ndmpd_zfs_fini(ndmpd_zfs_args);
1627      -                return (err);
1628      -        }
1629      -
1630      -        switch (op) {
1631      -        case NDMP_DATA_OP_BACKUP:
1632      -                if (!ndmpd_zfs_backup_parms_valid(ndmpd_zfs_args)) {
1633      -                        ndmpd_zfs_fini(ndmpd_zfs_args);
1634      -                        return (NDMP_ILLEGAL_ARGS_ERR);
1635      -                }
1636      -
1637      -                if (ndmpd_zfs_pre_backup(ndmpd_zfs_args)) {
1638      -                        NDMP_LOG(LOG_ERR, "pre_backup error");
1639      -                        return (NDMP_ILLEGAL_ARGS_ERR);
1640      -                }
1641      -
1642      -                session->ns_data.dd_module.dm_start_func =
1643      -                    ndmpd_zfs_backup_starter;
1644      -                (void) strlcpy(str, "backup", 8);
1645      -                break;
1646      -        case NDMP_DATA_OP_RECOVER:
1647      -                err = ndmpd_save_nlist_v3(session, nlist_val, nlist_len);
1648      -                if (err != NDMP_NO_ERR) {
1649      -                        ndmpd_zfs_fini(ndmpd_zfs_args);
1650      -                        return (NDMP_NO_MEM_ERR);
1651      -                }
1652      -
1653      -                if (!ndmpd_zfs_restore_parms_valid(ndmpd_zfs_args)) {
1654      -                        ndmpd_zfs_fini(ndmpd_zfs_args);
1655      -                        return (NDMP_ILLEGAL_ARGS_ERR);
1656      -                }
1657      -
1658      -                if (ndmpd_zfs_pre_restore(ndmpd_zfs_args)) {
1659      -                        NDMP_LOG(LOG_ERR, "pre_restore error");
1660      -                        (void) ndmpd_zfs_post_restore(ndmpd_zfs_args);
1661      -                        return (NDMP_ILLEGAL_ARGS_ERR);
1662      -                }
1663      -                session->ns_data.dd_module.dm_start_func =
1664      -                    ndmpd_zfs_restore_starter;
1665      -                (void) strlcpy(str, "recover", 8);
1666      -                break;
1667      -        }
1668      -
1669      -        ndmpd_zfs_params->mp_operation = op;
1670      -        session->ns_data.dd_operation = op;
1671      -        session->ns_data.dd_module.dm_abort_func = ndmpd_zfs_abort;
1672      -        session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
1673      -        session->ns_data.dd_abort = FALSE;
1674      -
1675      -        if (op == NDMP_DATA_OP_BACKUP) {
1676      -                (void) memset((void*)&backup_reply, 0, sizeof (backup_reply));
1677      -                backup_reply.error = NDMP_NO_ERR;
1678      -                reply = &backup_reply;
1679      -        } else {
1680      -                (void) memset((void*)&recover_reply, 0, sizeof (recover_reply));
1681      -                recover_reply.error = NDMP_NO_ERR;
1682      -                reply = &recover_reply;
1683      -        }
1684      -
1685      -        if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
1686      -            reply) < 0) {
1687      -                NDMP_LOG(LOG_DEBUG, "Sending data_start_%s_v3 reply", str);
1688      -                if (op == NDMP_DATA_OP_RECOVER)
1689      -                        ndmpd_data_error(session, NDMP_DATA_HALT_CONNECT_ERROR);
1690      -                ndmpd_zfs_fini(ndmpd_zfs_args);
1691      -                return (NDMP_NO_ERR);
1692      -        }
1693      -
1694      -        err = pthread_create(&tid, NULL,
1695      -            (funct_t)session->ns_data.dd_module.dm_start_func, ndmpd_zfs_args);
1696      -
1697      -        if (err) {
1698      -                NDMP_LOG(LOG_ERR, "Can't start %s session (errno %d)",
1699      -                    str, err);
1700      -                ndmpd_zfs_fini(ndmpd_zfs_args);
1701      -                MOD_DONE(ndmpd_zfs_params, -1);
1702      -                return (NDMP_NO_ERR);
1703      -        }
1704      -
1705 1592          (void) pthread_detach(tid);
1706 1593  
1707      -        if (op == NDMP_DATA_OP_BACKUP)
1708      -                NS_INC(nbk);
1709      -        else
1710      -                NS_INC(nrs);
1711      -
1712      -        ndmpd_zfs_dma_log(ndmpd_zfs_args, NDMP_LOG_NORMAL,
1713      -            "'zfs' %s starting\n", str);
1714      -
1715 1594          return (NDMP_NO_ERR);
1716 1595  }
1717 1596  
1718 1597  /*
1719 1598   * discard_data_v3
1720 1599   *
1721 1600   * Read and discard data from the data connection.
1722 1601   * Called when a module has called ndmpd_seek() prior to
1723 1602   * reading all of the data from the previous seek.
1724 1603   *
↓ open down ↓ 9 lines elided ↑ open up ↑
1734 1613  {
1735 1614          static char buf[MAX_RECORD_SIZE];
1736 1615          int n, toread;
1737 1616  
1738 1617          toread = (length < MAX_RECORD_SIZE) ? length :
1739 1618              MAX_RECORD_SIZE;
1740 1619  
1741 1620          /* Read and discard the data. */
1742 1621          n = read(session->ns_data.dd_sock, buf, toread);
1743 1622          if (n < 0) {
1744      -                NDMP_LOG(LOG_ERR, "Socket read error: %m.");
     1623 +                syslog(LOG_ERR, "Socket read error: %m.");
1745 1624                  n = -1;
1746 1625          }
1747 1626  
1748 1627          return (n);
1749 1628  }
1750 1629  
1751 1630  
1752 1631  /*
1753 1632   * ndmpd_remote_read_v3
1754 1633   *
↓ open down ↓ 11 lines elided ↑ open up ↑
1766 1645  int
1767 1646  ndmpd_remote_read_v3(ndmpd_session_t *session, char *data, ulong_t length)
1768 1647  {
1769 1648          ulong_t count;
1770 1649          ulong_t len;
1771 1650          ssize_t n;
1772 1651          ndmp_notify_data_read_request request;
1773 1652          tlm_job_stats_t *jstat;
1774 1653          longlong_t fsize;
1775 1654  
1776      -        NDMP_LOG(LOG_DEBUG, "ns_data.dd_xx: [%llu, %llu, %llu, %llu, %llu]",
1777      -            session->ns_data.dd_bytes_left_to_read,
1778      -            session->ns_data.dd_read_offset,
1779      -            session->ns_data.dd_read_length,
1780      -            session->ns_data.dd_position,
1781      -            session->ns_data.dd_discard_length);
1782      -
1783 1655          count = 0;
1784 1656          while (count < length) {
1785 1657                  len = length - count;
1786 1658  
1787 1659                  /*
1788 1660                   * If the end of the seek window has been reached then
1789 1661                   * send an ndmp_read request to the client.
1790 1662                   * The NDMP client will then send a mover_data_read request to
1791 1663                   * the remote mover and the mover will send more data.
1792 1664                   * This condition can occur if the module attempts to read past
↓ open down ↓ 10 lines elided ↑ open up ↑
1803 1675                          } else {
1804 1676                                  /*
1805 1677                                   * While restoring a file, restoreFile()
1806 1678                                   * records the number of bytes still need to
1807 1679                                   * be restored.  We use this as a guidance
1808 1680                                   * when asking for data from the tape.
1809 1681                                   */
1810 1682                                  jstat = session->ns_ndmp_lbr_params->nlp_jstat;
1811 1683                                  fsize = jstat->js_bytes_in_file;
1812 1684  
1813      -                                NDMP_LOG(LOG_DEBUG, "bytes_left [%llu / %u]",
1814      -                                    fsize, len);
1815      -
1816 1685                                  /*
1817 1686                                   * Fall back to the old way if fsize if too
1818 1687                                   * small.
1819 1688                                   */
1820 1689                                  if (fsize < len)
1821 1690                                          fsize = len;
1822 1691  
1823 1692                                  session->ns_data.dd_bytes_left_to_read = fsize;
1824 1693                                  session->ns_data.dd_read_offset =
1825 1694                                      session->ns_data.dd_position;
1826 1695                                  session->ns_data.dd_read_length = fsize;
1827 1696                          }
1828 1697  
1829 1698                          request.offset =
1830 1699                              long_long_to_quad(session->ns_data.dd_read_offset);
1831 1700                          request.length =
1832 1701                              long_long_to_quad(session->ns_data.dd_read_length);
1833 1702  
1834      -                        NDMP_LOG(LOG_DEBUG, "to NOTIFY_DATA_READ [%llu, %llu]",
     1703 +                        syslog(LOG_DEBUG, "to NOTIFY_DATA_READ [%lu, %lu]",
1835 1704                              session->ns_data.dd_read_offset,
1836 1705                              session->ns_data.dd_read_length);
1837 1706  
1838 1707                          if (ndmp_send_request_lock(session->ns_connection,
1839 1708                              NDMP_NOTIFY_DATA_READ, NDMP_NO_ERR,
1840 1709                              &request, 0) < 0) {
1841      -                                NDMP_LOG(LOG_DEBUG,
     1710 +                                syslog(LOG_ERR,
1842 1711                                      "Sending notify_data_read request");
1843 1712                                  return (-1);
1844 1713                          }
1845 1714                  }
1846 1715  
1847 1716                  /*
1848 1717                   * If the module called ndmpd_seek() prior to reading all of the
1849 1718                   * data that the remote mover was requested to send, then the
1850 1719                   * excess data from the seek has to be discarded.
1851 1720                   */
↓ open down ↓ 8 lines elided ↑ open up ↑
1860 1729                  }
1861 1730  
1862 1731                  /*
1863 1732                   * Don't attempt to read more data than the remote is sending.
1864 1733                   */
1865 1734                  if (len > session->ns_data.dd_bytes_left_to_read)
1866 1735                          len = session->ns_data.dd_bytes_left_to_read;
1867 1736  
1868 1737                  if ((n = read(session->ns_data.dd_sock, &data[count],
1869 1738                      len)) < 0) {
1870      -                        NDMP_LOG(LOG_ERR, "Socket read error: %m.");
     1739 +                        syslog(LOG_ERR, "Socket read error: %m.");
1871 1740                          return (-1);
1872 1741                  }
1873 1742  
1874 1743                  /* read returns 0 if the connection was closed */
1875 1744                  if (n == 0) {
1876      -                        NDMP_LOG(LOG_DEBUG, "n 0 errno %d",
     1745 +                        syslog(LOG_ERR, "n 0 errno %d",
1877 1746                              errno);
1878 1747                          return (-1);
1879 1748                  }
1880 1749  
1881 1750                  count += n;
1882 1751                  session->ns_data.dd_bytes_left_to_read -= n;
1883 1752                  session->ns_data.dd_position += n;
1884 1753          }
1885 1754          return (0);
1886 1755  }
↓ open down ↓ 8 lines elided ↑ open up ↑
1895 1764   *
1896 1765   * Returns:
1897 1766   *   void
1898 1767   */
1899 1768  static void
1900 1769  nlp_release_job_stat(ndmpd_session_t *session)
1901 1770  {
1902 1771          ndmp_lbr_params_t *nlp;
1903 1772  
1904 1773          if ((nlp = ndmp_get_nlp(session)) == NULL) {
1905      -                NDMP_LOG(LOG_DEBUG, "nlp == NULL");
1906 1774                  return;
1907 1775          }
1908 1776          if (nlp->nlp_jstat != NULL) {
1909 1777                  nlp->nlp_bytes_total =
1910 1778                      (u_longlong_t)nlp->nlp_jstat->js_bytes_total;
1911 1779                  tlm_un_ref_job_stats(nlp->nlp_jstat->js_job_name);
1912 1780                  nlp->nlp_jstat = NULL;
1913      -        } else
1914      -                NDMP_LOG(LOG_DEBUG, "JSTAT == NULL");
     1781 +        }
1915 1782  }
1916 1783  
1917 1784  
1918 1785  /* *** ndmpd global internal functions *********************************** */
1919 1786  
1920 1787  /*
1921 1788   * ndmpd_data_init
1922 1789   *
1923 1790   * Initializes data specific session variables.
1924 1791   *
↓ open down ↓ 43 lines elided ↑ open up ↑
1968 1835   * Parameters:
1969 1836   *   session (input) - session pointer.
1970 1837   *
1971 1838   * Returns:
1972 1839   *   void
1973 1840   */
1974 1841  void
1975 1842  ndmpd_data_cleanup(ndmpd_session_t *session)
1976 1843  {
1977 1844          if (session->ns_data.dd_listen_sock != -1) {
1978      -                NDMP_LOG(LOG_DEBUG, "data.listen_sock: %d",
     1845 +                syslog(LOG_DEBUG, "data.listen_sock: %d",
1979 1846                      session->ns_data.dd_listen_sock);
1980 1847                  (void) ndmpd_remove_file_handler(session,
1981 1848                      session->ns_data.dd_listen_sock);
1982 1849                  (void) close(session->ns_data.dd_listen_sock);
1983 1850                  session->ns_data.dd_listen_sock = -1;
1984 1851          }
1985 1852          if (session->ns_data.dd_sock != -1) {
1986      -                NDMP_LOG(LOG_DEBUG, "data.sock: %d",
     1853 +                syslog(LOG_ERR, "data.sock: %d",
1987 1854                      session->ns_data.dd_sock);
1988 1855  
1989 1856                  /*
1990 1857                   * ndmpcopy: we use the same socket for the mover,
1991 1858                   * so expect to close when mover is done!
1992 1859                   */
1993 1860                  if (session->ns_data.dd_sock != session->ns_mover.md_sock)
1994 1861                          (void) close(session->ns_data.dd_sock);
1995 1862  
1996 1863                  session->ns_data.dd_sock = -1;
↓ open down ↓ 31 lines elided ↑ open up ↑
2028 1895                      ? "remote" : "local");
2029 1896                  break;
2030 1897          case NDMPV4:
2031 1898                  rv = ((session->ns_data.dd_data_addr.addr_type ==
2032 1899                      NDMP_ADDR_TCP ||
2033 1900                      (session->ns_data.dd_data_addr_v4.addr_type ==
2034 1901                      NDMP_ADDR_TCP)) ? "remote" : "local");
2035 1902                  break;
2036 1903          default:
2037 1904                  rv = "Unknown";
2038      -                NDMP_LOG(LOG_ERR, "Invalid protocol version %d.",
     1905 +                syslog(LOG_ERR, "Invalid protocol version %d.",
2039 1906                      session->ns_protocol_version);
2040 1907          }
2041 1908  
2042 1909          return (rv);
2043 1910  }
2044 1911  
2045 1912  /* *** static functions ******************************************** */
2046 1913  
2047 1914  /*
2048 1915   * ndmpd_tar_start_backup_v2
↓ open down ↓ 11 lines elided ↑ open up ↑
2060 1927   *   NDMP_NO_ERR - backup successfully started.
2061 1928   *   otherwise - error code of backup start error.
2062 1929   */
2063 1930  static ndmp_error
2064 1931  ndmpd_tar_start_backup_v2(ndmpd_session_t *session, char *bu_type,
2065 1932      ndmp_pval *env_val, ulong_t env_len)
2066 1933  {
2067 1934          ndmp_data_start_backup_reply reply;
2068 1935          ndmpd_module_params_t *params;
2069 1936          ndmp_lbr_params_t *nlp;
     1937 +        pthread_t tid;
2070 1938          int err;
2071 1939  
2072 1940          if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2073      -                NDMP_LOG(LOG_ERR, "Can't start new backup in current state.");
     1941 +                syslog(LOG_ERR, "Can't start new backup in current state.");
2074 1942                  return (NDMP_ILLEGAL_STATE_ERR);
2075 1943          }
2076 1944          if (strcmp(bu_type, NDMP_DUMP_TYPE) != 0 &&
2077 1945              strcmp(bu_type, NDMP_TAR_TYPE) != 0) {
2078      -                NDMP_LOG(LOG_ERR, "Invalid backup type: %s.", bu_type);
2079      -                NDMP_LOG(LOG_ERR, "Supported backup types are tar and dump.");
     1946 +                syslog(LOG_ERR, "Invalid backup type: %s.", bu_type);
     1947 +                syslog(LOG_ERR, "Supported backup types are tar and dump.");
2080 1948                  return (NDMP_ILLEGAL_ARGS_ERR);
2081 1949          }
2082 1950          if ((err = ndmpd_save_env(session, env_val, env_len)) != NDMP_NO_ERR)
2083 1951                  return (err);
2084 1952  
2085 1953          nlp = ndmp_get_nlp(session);
2086 1954          NDMP_FREE(nlp->nlp_params);
2087 1955          params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
2088 1956          if (params == NULL)
2089 1957                  return (NDMP_NO_MEM_ERR);
↓ open down ↓ 40 lines elided ↑ open up ↑
2130 1998  
2131 1999          session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining = 0;
2132 2000          session->ns_data.dd_module.dm_stats.ms_est_time_remaining = 0;
2133 2001          session->ns_data.dd_nlist = 0;
2134 2002          session->ns_data.dd_nlist_len = 0;
2135 2003          session->ns_data.dd_read_offset = 0;
2136 2004          session->ns_data.dd_read_length = 0;
2137 2005  
2138 2006          if ((err = ndmp_backup_extract_params(session,
2139 2007              params)) != NDMP_NO_ERR) {
2140      -                NDMP_LOG(LOG_DEBUG, "err: %d", err);
     2008 +                syslog(LOG_ERR, "err: %d", err);
2141 2009                  NDMP_FREE(nlp->nlp_params);
2142 2010                  return (err);
2143 2011          }
2144 2012  
2145 2013          err = ndmpd_mover_connect(session, NDMP_MOVER_MODE_READ);
2146 2014          if (err != NDMP_NO_ERR) {
2147      -                NDMP_LOG(LOG_DEBUG,
     2015 +                syslog(LOG_ERR,
2148 2016                      "mover connect err: %d", err);
2149 2017                  NDMP_FREE(nlp->nlp_params);
2150 2018                  return (err);
2151 2019          }
2152 2020  
2153 2021          session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
2154 2022  
2155 2023          session->ns_data.dd_operation = NDMP_DATA_OP_BACKUP;
2156 2024          session->ns_data.dd_abort = FALSE;
2157 2025  
2158      -        NDMP_LOG(LOG_DEBUG, "starting backup");
     2026 +        syslog(LOG_DEBUG, "starting backup");
2159 2027  
2160 2028          reply.error = NDMP_NO_ERR;
2161 2029          if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2162 2030              &reply) < 0) {
2163      -                NDMP_LOG(LOG_DEBUG, "Sending data_start_backup reply");
     2031 +                syslog(LOG_DEBUG, "Sending data_start_backup reply");
2164 2032                  NDMP_FREE(nlp->nlp_params);
2165 2033                  if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) {
2166 2034                          /*
2167 2035                           * ndmpcopy: we use the same socket for the mover,
2168 2036                           * so expect to close when mover is done!
2169 2037                           */
2170 2038                          if (session->ns_data.dd_sock !=
2171 2039                              session->ns_mover.md_sock)
2172 2040                                  (void) close(session->ns_data.dd_sock);
2173 2041  
↓ open down ↓ 3 lines elided ↑ open up ↑
2177 2045                              NDMP_MOVER_HALT_CONNECT_CLOSED);
2178 2046                  return (NDMP_NO_ERR);
2179 2047          }
2180 2048  
2181 2049          /*
2182 2050           * perform the backup
2183 2051           *
2184 2052           * Cannot wait for the thread to exit as we are replying to the
2185 2053           * client request here.
2186 2054           */
2187      -        (void) pthread_create(NULL, NULL,
     2055 +        (void) pthread_create(&tid, NULL,
2188 2056              (funct_t)session->ns_data.dd_module.dm_start_func,
2189 2057              params);
2190 2058  
     2059 +        if (err) {
     2060 +                syslog(LOG_ERR, "Can't start V2 backup session.");
     2061 +                return (NDMP_ILLEGAL_ARGS_ERR);
     2062 +        }
     2063 +
     2064 +        (void) pthread_detach(tid);
     2065 +
2191 2066          return (NDMP_NO_ERR);
2192 2067  }
2193 2068  
2194 2069  /*
2195 2070   * ndmpd_tar_start_recover_v2
2196 2071   *
2197 2072   * The main recover/restore function
2198 2073   *
2199 2074   * Parameters:
2200 2075   *   session   (input) - session pointer.
↓ open down ↓ 8 lines elided ↑ open up ↑
2209 2084   *   otherwise - error code of backup start error.
2210 2085   */
2211 2086  static ndmp_error
2212 2087  ndmpd_tar_start_recover_v2(ndmpd_session_t *session, char *bu_type,
2213 2088      ndmp_pval *env_val, ulong_t env_len, ndmp_name *nlist_val,
2214 2089      ulong_t nlist_len)
2215 2090  {
2216 2091          ndmp_data_start_recover_reply_v2 reply;
2217 2092          ndmpd_module_params_t *params;
2218 2093          ndmp_lbr_params_t *nlp;
     2094 +        pthread_t tid;
2219 2095          int err;
2220 2096  
2221 2097          if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2222      -                NDMP_LOG(LOG_ERR, "Can't start new recover in current state.");
     2098 +                syslog(LOG_ERR, "Can't start new recover in current state.");
2223 2099                  return (NDMP_ILLEGAL_STATE_ERR);
2224 2100          }
2225 2101  
2226 2102          if (strcmp(bu_type, NDMP_DUMP_TYPE) != 0 &&
2227 2103              strcmp(bu_type, NDMP_TAR_TYPE) != 0) {
2228      -                NDMP_LOG(LOG_ERR, "Invalid backup type: %s.", bu_type);
2229      -                NDMP_LOG(LOG_ERR, "Supported backup types are tar and dump.");
     2104 +                syslog(LOG_ERR, "Invalid backup type: %s.", bu_type);
     2105 +                syslog(LOG_ERR, "Supported backup types are tar and dump.");
2230 2106                  return (NDMP_ILLEGAL_ARGS_ERR);
2231 2107          }
2232 2108  
2233 2109          reply.error = ndmpd_save_env(session, env_val, env_len);
2234 2110          if (reply.error != NDMP_NO_ERR)
2235 2111                  return (NDMP_NO_MEM_ERR);
2236 2112  
2237 2113          reply.error = ndmpd_save_nlist_v2(session, nlist_val, nlist_len);
2238 2114          if (reply.error != NDMP_NO_ERR)
2239 2115                  return (NDMP_NO_MEM_ERR);
↓ open down ↓ 48 lines elided ↑ open up ↑
2288 2164                  return (err);
2289 2165          }
2290 2166  
2291 2167          session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
2292 2168          session->ns_data.dd_operation = NDMP_DATA_OP_RECOVER;
2293 2169          session->ns_data.dd_abort = FALSE;
2294 2170  
2295 2171          reply.error = NDMP_NO_ERR;
2296 2172          if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2297 2173              &reply) < 0) {
2298      -                NDMP_LOG(LOG_DEBUG, "Sending data_start_recover reply");
     2174 +                syslog(LOG_DEBUG, "Sending data_start_recover reply");
2299 2175                  NDMP_FREE(nlp->nlp_params);
2300 2176                  if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) {
2301 2177                          /*
2302 2178                           * ndmpcopy: we use the same socket for the mover,
2303 2179                           * so expect to close when mover is done!
2304 2180                           */
2305 2181                          if (session->ns_data.dd_sock !=
2306 2182                              session->ns_mover.md_sock)
2307 2183                                  (void) close(session->ns_data.dd_sock);
2308 2184  
↓ open down ↓ 5 lines elided ↑ open up ↑
2314 2190                  return (NDMP_NO_ERR);
2315 2191          }
2316 2192  
2317 2193  
2318 2194          /*
2319 2195           * perform the restore
2320 2196           *
2321 2197           * Cannot wait for the thread to exit as we are replying to the
2322 2198           * client request here.
2323 2199           */
2324      -        (void) pthread_create(NULL, NULL,
     2200 +        (void) pthread_create(&tid, NULL,
2325 2201              (funct_t)session->ns_data.dd_module.dm_start_func,
2326 2202              params);
2327 2203  
     2204 +        if (err != 0) {
     2205 +                syslog(LOG_ERR, "Can't start V2 recover session.");
     2206 +                return (NDMP_ILLEGAL_ARGS_ERR);
     2207 +        }
     2208 +
     2209 +        (void) pthread_detach(tid);
     2210 +
2328 2211          return (NDMP_NO_ERR);
2329 2212  }
2330 2213  
2331 2214  /*
2332 2215   * ndmpd_data_get_info
2333 2216   *
2334 2217   * Return the total number of bytes processed
2335 2218   *
2336 2219   * Parameters:
2337 2220   *   session   (input) - session pointer.
↓ open down ↓ 18 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX