Print this page
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>
Revert "NEX-5801 Snapshots left over after failed backups"
This reverts commit f182fb95f09036db71fbfc6f0a6b90469b761f21.
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>
NEX-2911 NDMP logging should use syslog and is too chatty
NEX-1123 NDMP commands can not uniquely identify Nexenta and the file server version (currently 4.0.1) and Sun Microsystems.
OS-49 Switch back to illumos' version of wcwidth()
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-426 ndmp_config_get_ext_list failed
NEX-250 Failed to open device /dev/rmt/0n because of too many files open
        
*** 35,51 ****
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGE.
   */
  /* Copyright (c) 2007, The Storage Networking Industry Association. */
  /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
! /* Copyright 2014 Nexenta Systems, Inc.  All rights reserved. */
  
  #include <dirent.h>
  #include <errno.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <sys/stat.h>
  #include <sys/mnttab.h>
  #include <sys/mntent.h>
  #include <sys/mntio.h>
  #include <sys/statvfs.h>
--- 35,52 ----
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGE.
   */
  /* Copyright (c) 2007, The Storage Networking Industry Association. */
  /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
! /* Copyright 2016 Nexenta Systems, Inc.  All rights reserved. */
  
  #include <dirent.h>
  #include <errno.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
+ #include <syslog.h>
  #include <sys/stat.h>
  #include <sys/mnttab.h>
  #include <sys/mntent.h>
  #include <sys/mntio.h>
  #include <sys/statvfs.h>
*** 120,130 ****
          (void) uname(&uts);
          reply.os_type = uts.sysname;
          reply.os_vers = uts.release;
  
          if (sysinfo(SI_HW_SERIAL, hostidstr, sizeof (hostidstr)) < 0) {
!                 NDMP_LOG(LOG_DEBUG, "sysinfo error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
          }
  
          /*
           * Convert the hostid to hex. The returned string must match
--- 121,131 ----
          (void) uname(&uts);
          reply.os_type = uts.sysname;
          reply.os_vers = uts.release;
  
          if (sysinfo(SI_HW_SERIAL, hostidstr, sizeof (hostidstr)) < 0) {
!                 syslog(LOG_ERR, "sysinfo error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
          }
  
          /*
           * Convert the hostid to hex. The returned string must match
*** 169,180 ****
          if (strcmp(request->name, "dump") == 0) {
                  (void) simple_get_attrs(&reply.attrs);
          } else if (strcmp(request->name, "tar") == 0) {
                  reply.attrs = NDMP_NO_BACKUP_FILELIST;
          } else {
!                 NDMP_LOG(LOG_ERR, "Invalid backup type: %s.", request->name);
!                 NDMP_LOG(LOG_ERR,
                      "Supported backup types are 'dump' and 'tar' only.");
                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
          }
  
          ndmp_send_reply(connection, (void *) &reply,
--- 170,181 ----
          if (strcmp(request->name, "dump") == 0) {
                  (void) simple_get_attrs(&reply.attrs);
          } else if (strcmp(request->name, "tar") == 0) {
                  reply.attrs = NDMP_NO_BACKUP_FILELIST;
          } else {
!                 syslog(LOG_ERR, "Invalid backup type: %s.", request->name);
!                 syslog(LOG_ERR,
                      "Supported backup types are 'dump' and 'tar' only.");
                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
          }
  
          ndmp_send_reply(connection, (void *) &reply,
*** 250,262 ****
                      session->ns_challenge, MD5_CHALLENGE_SIZE);
                  break;
          case NDMP_AUTH_NONE:
                  /* FALL THROUGH */
          default:
!                 NDMP_LOG(LOG_ERR, "Invalid authentication type: %d.",
                      request->auth_type);
!                 NDMP_LOG(LOG_ERR,
                      "Supported authentication types are md5 and cleartext.");
                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
                  break;
          }
  
--- 251,263 ----
                      session->ns_challenge, MD5_CHALLENGE_SIZE);
                  break;
          case NDMP_AUTH_NONE:
                  /* FALL THROUGH */
          default:
!                 syslog(LOG_ERR, "Invalid authentication type: %d.",
                      request->auth_type);
!                 syslog(LOG_ERR,
                      "Supported authentication types are md5 and cleartext.");
                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
                  break;
          }
  
*** 305,315 ****
          reply.os_type = uts.sysname;
          reply.os_vers = uts.release;
  
          if (sysinfo(SI_HW_SERIAL, hostidstr, sizeof (hostidstr)) < 0) {
  
!                 NDMP_LOG(LOG_DEBUG, "sysinfo error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
          }
  
          /*
           * Convert the hostid to hex. The returned string must match
--- 306,316 ----
          reply.os_type = uts.sysname;
          reply.os_vers = uts.release;
  
          if (sysinfo(SI_HW_SERIAL, hostidstr, sizeof (hostidstr)) < 0) {
  
!                 syslog(LOG_ERR, "sysinfo error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
          }
  
          /*
           * Convert the hostid to hex. The returned string must match
*** 396,408 ****
                      session->ns_challenge, MD5_CHALLENGE_SIZE);
                  break;
          case NDMP_AUTH_NONE:
                  /* FALL THROUGH */
          default:
!                 NDMP_LOG(LOG_ERR, "Invalid authentication type: %d.",
                      request->auth_type);
!                 NDMP_LOG(LOG_ERR,
                      "Supported authentication types are md5 and cleartext.");
                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
                  break;
          }
  
--- 397,409 ----
                      session->ns_challenge, MD5_CHALLENGE_SIZE);
                  break;
          case NDMP_AUTH_NONE:
                  /* FALL THROUGH */
          default:
!                 syslog(LOG_ERR, "Invalid authentication type: %d.",
                      request->auth_type);
!                 syslog(LOG_ERR,
                      "Supported authentication types are md5 and cleartext.");
                  reply.error = NDMP_ILLEGAL_ARGS_ERR;
                  break;
          }
  
*** 541,566 ****
  
          (void) memset((void*)&reply, 0, sizeof (reply));
          reply.error = NDMP_NO_ERR;
  
          if ((fd = open(MNTTAB, O_RDONLY)) == -1) {
!                 NDMP_LOG(LOG_ERR, "File mnttab open error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
                  goto send_reply;
          }
  
          /* nothing was found, send an empty reply */
          if (ioctl(fd, MNTIOC_NMNTS, &nmnt) != 0 || nmnt <= 0) {
                  (void) close(fd);
!                 NDMP_LOG(LOG_ERR, "No file system found.");
                  goto send_reply;
          }
  
          fp = fdopen(fd, "r");
          if (!fp) {
                  (void) close(fd);
!                 NDMP_LOG(LOG_ERR, "File mnttab open error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
                  goto send_reply;
          }
  
          fsip_save = fsip = ndmp_malloc(sizeof (ndmp_fs_info_v3) * nmnt);
--- 542,567 ----
  
          (void) memset((void*)&reply, 0, sizeof (reply));
          reply.error = NDMP_NO_ERR;
  
          if ((fd = open(MNTTAB, O_RDONLY)) == -1) {
!                 syslog(LOG_ERR, "File mnttab open error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
                  goto send_reply;
          }
  
          /* nothing was found, send an empty reply */
          if (ioctl(fd, MNTIOC_NMNTS, &nmnt) != 0 || nmnt <= 0) {
                  (void) close(fd);
!                 syslog(LOG_ERR, "No file system found.");
                  goto send_reply;
          }
  
          fp = fdopen(fd, "r");
          if (!fp) {
                  (void) close(fd);
!                 syslog(LOG_ERR, "File mnttab open error: %m.");
                  reply.error = NDMP_UNDEFINED_ERR;
                  goto send_reply;
          }
  
          fsip_save = fsip = ndmp_malloc(sizeof (ndmp_fs_info_v3) * nmnt);
*** 595,605 ****
                  (void) snprintf(fsip->fs_logical_device, log_dev_len, "%s",
                      fs->mnt_mountp);
                  fsip->invalid = 0;
  
                  if (statvfs64(fs->mnt_mountp, &stat_buf) < 0) {
!                         NDMP_LOG(LOG_DEBUG,
                              "statvfs(%s) error.", fs->mnt_mountp);
                          fsip->fs_status =
                              "statvfs error: unable to determine filesystem"
                              " attributes";
                  } else {
--- 596,606 ----
                  (void) snprintf(fsip->fs_logical_device, log_dev_len, "%s",
                      fs->mnt_mountp);
                  fsip->invalid = 0;
  
                  if (statvfs64(fs->mnt_mountp, &stat_buf) < 0) {
!                         syslog(LOG_ERR,
                              "statvfs(%s) error.", fs->mnt_mountp);
                          fsip->fs_status =
                              "statvfs error: unable to determine filesystem"
                              " attributes";
                  } else {
*** 719,729 ****
                   * Don't report dead links.
                   */
                  if ((access(sd->sd_name, F_OK) == -1) && (errno == ENOENT))
                          continue;
  
!                 NDMP_LOG(LOG_DEBUG,
                      "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name);
  
                  envp_head = envp;
                  NDMP_SETENV(envp, "EXECUTE_CDB", "b");
                  NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial);
--- 720,730 ----
                   * Don't report dead links.
                   */
                  if ((access(sd->sd_name, F_OK) == -1) && (errno == ENOENT))
                          continue;
  
!                 syslog(LOG_DEBUG,
                      "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name);
  
                  envp_head = envp;
                  NDMP_SETENV(envp, "EXECUTE_CDB", "b");
                  NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial);
*** 739,750 ****
                  tip++;
                  dcp++;
                  n++;
          }
  
-         NDMP_LOG(LOG_DEBUG, "n %d", n);
- 
          /*
           * We should not receive the get_tape_info when three-way backup is
           * running and we are acting as just data, but some clients try
           * to get the Tape information anyway.
           */
--- 740,749 ----
*** 821,831 ****
                   * Don't report dead links.
                   */
                  if ((access(sd->sd_name, F_OK) == -1) && (errno == ENOENT))
                          continue;
  
!                 NDMP_LOG(LOG_DEBUG,
                      "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name);
  
                  envp_head = envp;
                  NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial);
                  NDMP_SETENV(envp, "WORLD_WIDE_NAME", sd->sd_wwn);
--- 820,830 ----
                   * Don't report dead links.
                   */
                  if ((access(sd->sd_name, F_OK) == -1) && (errno == ENOENT))
                          continue;
  
!                 syslog(LOG_DEBUG,
                      "model \"%s\" dev \"%s\"", sd->sd_id, sd->sd_name);
  
                  envp_head = envp;
                  NDMP_SETENV(envp, "SERIAL_NUMBER", sd->sd_serial);
                  NDMP_SETENV(envp, "WORLD_WIDE_NAME", sd->sd_wwn);
*** 841,852 ****
                  sip++;
                  dcp++;
                  n++;
          }
  
-         NDMP_LOG(LOG_DEBUG, "n %d", n);
- 
          reply.scsi_info.scsi_info_len = n;
          reply.scsi_info.scsi_info_val = sip_save;
  
          ndmp_send_reply(connection, (void *)&reply,
              "error sending ndmp_config_get_scsi_info reply");
--- 840,849 ----
*** 876,906 ****
  {
          ndmp_config_get_server_info_reply_v3 reply;
          ndmp_auth_type auth_types[2];
          char rev_number[10];
          ndmpd_session_t *session = ndmp_get_client_data(connection);
  
          (void) memset((void*)&reply, 0, sizeof (reply));
          reply.error = NDMP_NO_ERR;
  
          if (connection->conn_authorized ||
              session->ns_protocol_version != NDMPV4) {
                  reply.vendor_name = VENDOR_NAME;
                  reply.product_name = PRODUCT_NAME;
                  (void) snprintf(rev_number, sizeof (rev_number), "%d",
                      ndmp_ver);
                  reply.revision_number = rev_number;
          } else {
                  reply.vendor_name = "\0";
                  reply.product_name = "\0";
                  reply.revision_number = "\0";
          }
  
-         NDMP_LOG(LOG_DEBUG,
-             "vendor \"%s\", product \"%s\" rev \"%s\"",
-             reply.vendor_name, reply.product_name, reply.revision_number);
- 
          auth_types[0] = NDMP_AUTH_TEXT;
          auth_types[1] = NDMP_AUTH_MD5;
          reply.auth_type.auth_type_len = ARRAY_LEN(auth_types, ndmp_auth_type);
          reply.auth_type.auth_type_val = auth_types;
  
--- 873,911 ----
  {
          ndmp_config_get_server_info_reply_v3 reply;
          ndmp_auth_type auth_types[2];
          char rev_number[10];
          ndmpd_session_t *session = ndmp_get_client_data(connection);
+         char *vendor;
+         char *product;
  
          (void) memset((void*)&reply, 0, sizeof (reply));
          reply.error = NDMP_NO_ERR;
  
          if (connection->conn_authorized ||
              session->ns_protocol_version != NDMPV4) {
+                 if ((vendor = ndmpd_get_prop(NDMP_VENDOR_NAME)) == NULL ||
+                     *vendor == 0) {
                          reply.vendor_name = VENDOR_NAME;
+                 } else {
+                         reply.vendor_name = vendor;
+                 }
+                 if ((product = ndmpd_get_prop(NDMP_PRODUCT_NAME)) == NULL ||
+                     *product == 0) {
                          reply.product_name = PRODUCT_NAME;
+                 } else {
+                         reply.product_name = product;
+                 }
                  (void) snprintf(rev_number, sizeof (rev_number), "%d",
                      ndmp_ver);
                  reply.revision_number = rev_number;
          } else {
                  reply.vendor_name = "\0";
                  reply.product_name = "\0";
                  reply.revision_number = "\0";
          }
  
          auth_types[0] = NDMP_AUTH_TEXT;
          auth_types[1] = NDMP_AUTH_MD5;
          reply.auth_type.auth_type_len = ARRAY_LEN(auth_types, ndmp_auth_type);
          reply.auth_type.auth_type_val = auth_types;
  
*** 1053,1063 ****
  
          if (session->ns_set_ext_list) {
                  /*
                   * Illegal request if extensions have already been selected.
                   */
!                 NDMP_LOG(LOG_ERR, "Extensions have already been selected.");
                  reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
          } else {
                  /*
                   * Reply with an empty set of extensions.
                   */
--- 1058,1068 ----
  
          if (session->ns_set_ext_list) {
                  /*
                   * Illegal request if extensions have already been selected.
                   */
!                 syslog(LOG_ERR, "Extensions have already been selected.");
                  reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
          } else {
                  /*
                   * Reply with an empty set of extensions.
                   */
*** 1098,1114 ****
          if (!session->ns_get_ext_list) {
                  /*
                   * The DMA is required to issue a NDMP_GET_EXT_LIST request
                   * prior sending a NDMP_SET_EXT_LIST request.
                   */
!                 NDMP_LOG(LOG_ERR, "No prior ndmp_config_get_ext_list issued.");
                  reply.error = NDMP_PRECONDITION_ERR;
          } else if (session->ns_set_ext_list) {
                  /*
                   * Illegal request if extensions have already been selected.
                   */
!                 NDMP_LOG(LOG_ERR, "Extensions have already been selected.");
                  reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
          } else {
                  /*
                   * We currently do not support any extensions, but the DMA
                   * may test NDMP_CONFIG_SET_EXT_LIST with an empty list.
--- 1103,1119 ----
          if (!session->ns_get_ext_list) {
                  /*
                   * The DMA is required to issue a NDMP_GET_EXT_LIST request
                   * prior sending a NDMP_SET_EXT_LIST request.
                   */
!                 syslog(LOG_ERR, "No prior ndmp_config_get_ext_list issued.");
                  reply.error = NDMP_PRECONDITION_ERR;
          } else if (session->ns_set_ext_list) {
                  /*
                   * Illegal request if extensions have already been selected.
                   */
!                 syslog(LOG_ERR, "Extensions have already been selected.");
                  reply.error = NDMP_EXT_DANDN_ILLEGAL_ERR;
          } else {
                  /*
                   * We currently do not support any extensions, but the DMA
                   * may test NDMP_CONFIG_SET_EXT_LIST with an empty list.