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

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/ndmpd/tlm/tlm_init.c
          +++ new/usr/src/cmd/ndmpd/tlm/tlm_init.c
↓ open down ↓ 27 lines elided ↑ open up ↑
  28   28   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29   29   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  30   30   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  31   31   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  32   32   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  33   33   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  34   34   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  35   35   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  36   36   * POSSIBILITY OF SUCH DAMAGE.
  37   37   */
       38 +/* Copyright 2016 Nexenta Systems, Inc. All rights reserved. */
       39 +
  38   40  #include <sys/errno.h>
  39   41  #include <sys/types.h>
       42 +#include <syslog.h>
  40   43  #include <stdlib.h>
  41   44  #include <unistd.h>
  42   45  #include <ctype.h>
  43   46  #include <sys/byteorder.h>
  44   47  #include <sys/scsi/impl/uscsi.h>
  45   48  #include <sys/scsi/scsi.h>
  46   49  #include <tlm.h>
  47   50  #include <pthread.h>
  48   51  #include "tlm_proto.h"
  49   52  
↓ open down ↓ 24 lines elided ↑ open up ↑
  74   77          if (cdb->scc_cmd == SCMD_READ_ELEMENT_STATUS) {
  75   78                  uscsi_cmd.uscsi_flags |= USCSI_RQENABLE;
  76   79                  uscsi_cmd.uscsi_rqbuf = data;
  77   80                  uscsi_cmd.uscsi_rqlen = size;
  78   81          }
  79   82          uscsi_cmd.uscsi_cdblen = command_size;
  80   83  
  81   84          dname = sasd_slink_name(slink);
  82   85          dev = open(dname, O_RDWR | O_NDELAY);
  83   86          if (dev == -1) {
  84      -                NDMP_LOG(LOG_DEBUG, "Open failed for %s err=%d",
       87 +                syslog(LOG_DEBUG, "Open failed for %s err=%d",
  85   88                      dname, errno);
  86   89                  return (errno);
  87   90          }
  88   91          if (tlm_ioctl(dev, USCSICMD, &uscsi_cmd) < 0) {
  89      -                NDMP_LOG(LOG_DEBUG, "SCSI cmd %d failed for %s err=%d",
       92 +                syslog(LOG_DEBUG, "SCSI cmd %d failed for %s err=%d",
  90   93                      cdb->scc_cmd, dname, errno);
  91   94                  (void) close(dev);
  92   95                  return (errno);
  93   96          }
  94   97          (void) close(dev);
  95   98          return (uscsi_cmd.uscsi_status);
  96   99  }
  97  100  
  98  101  /*
  99  102   * Read the Inquiry Page.
↓ open down ↓ 166 lines elided ↑ open up ↑
 266  269   * Add the tape library call back function (used while scanning the bus)
 267  270   */
 268  271  static int
 269  272  add_lib(scsi_link_t *slink, struct scsi_inquiry *sd, void *arg)
 270  273  {
 271  274          int l;
 272  275          int *nlp; /* pointer to library counter */
 273  276          sasd_drive_t *ssd;
 274  277  
 275  278          if (!slink || !sd) {
 276      -                NDMP_LOG(LOG_DEBUG, "Invalid argument %x %x %x",
      279 +                syslog(LOG_DEBUG, "Invalid argument %x %x %x",
 277  280                      slink, sd, arg);
 278  281                  return (-TLM_INVALID);
 279  282          }
 280  283  
 281  284          if (sd->inq_dtype == DTYPE_CHANGER) {
 282  285                  /* This is a robot, which means this is also a library */
 283  286                  nlp = (int *)arg;
 284  287                  (*nlp)++;
 285  288                  l = tlm_insert_new_library(slink);
 286  289                  tlm_enable_barcode(l);
 287  290  
 288      -                NDMP_LOG(LOG_DEBUG, "lib %d sid %d lun %d",
      291 +                syslog(LOG_DEBUG, "lib %d sid %d lun %d",
 289  292                      l, slink->sl_sid, slink->sl_lun);
 290  293  
 291  294                  if ((ssd = sasd_slink_drive(slink)) != NULL) {
 292  295                          (void) strlcpy(ssd->sd_vendor, sd->inq_vid,
 293  296                              sizeof (ssd->sd_vendor));
 294  297                          (void) strlcpy(ssd->sd_id, sd->inq_pid,
 295  298                              sizeof (ssd->sd_id));
 296  299                          (void) strlcpy(ssd->sd_rev, sd->inq_revision,
 297  300                              sizeof (ssd->sd_rev));
 298  301                          (void) read_serial_num_page(slink, ssd->sd_serial,
↓ open down ↓ 9 lines elided ↑ open up ↑
 308  311  /*
 309  312   * Create some virutal slots
 310  313   */
 311  314  static int
 312  315  make_virtual_slot(int l, tlm_drive_t *dp)
 313  316  {
 314  317          int s;
 315  318          tlm_slot_t *sp;
 316  319  
 317  320          if (l <= 0 || !dp) {
 318      -                NDMP_LOG(LOG_DEBUG, "Invalid argument %d, %x", l, dp);
      321 +                syslog(LOG_DEBUG, "Invalid argument %d, %x", l, dp);
 319  322                  return (-TLM_INVALID);
 320  323          }
 321  324  
 322  325          if ((s = tlm_insert_new_slot(l)) <= 0)
 323  326                  return (-TLM_NO_MEMORY);
 324  327  
 325  328          if (!(sp = tlm_slot(l, s))) {
 326      -                NDMP_LOG(LOG_DEBUG, "Internal error: slot not found %d", s);
      329 +                syslog(LOG_DEBUG, "Internal error: slot not found %d", s);
 327  330                  return (-TLM_ERROR_INTERNAL);
 328  331          }
 329  332          /*
 330  333           * For virtual slots element number is 0 and they are always full.
 331  334           */
 332  335          sp->ts_element = 0;
 333  336          sp->ts_status_full = TRUE;
 334  337          return (TLM_NO_ERRORS);
 335  338  }
 336  339  
 337  340  /*
 338  341   * Make the tape drive not part of a tape library (stand alone)
 339  342   */
 340  343  static int
 341  344  make_stand_alone_drive(scsi_link_t *slink, int l)
 342  345  {
 343  346          int d;
 344  347          tlm_drive_t *dp;
 345  348  
 346  349          if (!slink || l <= 0) {
 347      -                NDMP_LOG(LOG_DEBUG, "Invalid argument %x %d", slink, l);
      350 +                syslog(LOG_DEBUG, "Invalid argument %x %d", slink, l);
 348  351                  return (-TLM_INVALID);
 349  352          }
 350  353  
 351  354          d = tlm_insert_new_drive(l);
 352  355          if (!(dp = tlm_drive(l, d))) {
 353      -                NDMP_LOG(LOG_DEBUG, "Internal error: drive not found %d", d);
      356 +                syslog(LOG_DEBUG, "Internal error: drive not found %d", d);
 354  357                  return (-TLM_ERROR_INTERNAL);
 355  358          }
 356  359  
 357  360          /* For stand-alone drives, the element number is the drive number. */
 358  361          dp->td_element = d;
 359  362          dp->td_slink = slink;
 360  363          dp->td_scsi_id = slink->sl_sid;
 361  364          dp->td_lun = slink->sl_lun;
 362  365          dp->td_exists = TRUE;
 363  366  
↓ open down ↓ 40 lines elided ↑ open up ↑
 404  407  static int
 405  408  add_drv(scsi_link_t *slink, struct scsi_inquiry *sd, void *arg)
 406  409  {
 407  410          int l, d;
 408  411          int *vlp; /* pointer to virtual library number */
 409  412          sasd_drive_t *ssd;
 410  413          tlm_library_t *library;
 411  414          tlm_drive_t *drive;
 412  415  
 413  416          if (!slink || !sd) {
 414      -                NDMP_LOG(LOG_DEBUG, "Invalid argument %x %x %x",
      417 +                syslog(LOG_DEBUG, "Invalid argument %x %x %x",
 415  418                      slink, sd, arg);
 416  419                  return (-TLM_INVALID);
 417  420          }
 418  421  
 419  422          if (sd->inq_dtype == DTYPE_SEQUENTIAL) {
 420  423                  vlp = (int *)arg;
 421  424                  d = new_drive(slink, &l);
 422  425                  if (d == 0) {
 423  426                          /* This tape drive was not found inside any robot. */
 424  427                          if (*vlp == 0) {
↓ open down ↓ 3 lines elided ↑ open up ↑
 428  431                                   */
 429  432                                  *vlp = tlm_insert_new_library(slink);
 430  433                                  if ((library = tlm_library(*vlp)) != NULL)
 431  434                                          library->tl_capability_robot = FALSE;
 432  435                          }
 433  436                          if ((d = make_stand_alone_drive(slink, *vlp)) < 0) {
 434  437                                  /* sorry, we can not clean up the vlib now * */
 435  438                                  return (-TLM_INVALID);
 436  439                          }
 437  440                          l = *vlp;
 438      -                        NDMP_LOG(LOG_DEBUG, "vlib(%d, %d) sid %d lun %d",
      441 +                        syslog(LOG_DEBUG, "vlib(%d, %d) sid %d lun %d",
 439  442                              l, d, slink->sl_sid, slink->sl_lun);
 440  443                  } else
 441      -                        NDMP_LOG(LOG_DEBUG, "(%d, %d) sid %d lun %d",
      444 +                        syslog(LOG_DEBUG, "(%d, %d) sid %d lun %d",
 442  445                              l, d, slink->sl_sid, slink->sl_lun);
 443  446  
 444  447                  if ((drive = tlm_drive(l, d)) != NULL) {
 445  448                          drive->td_exists = TRUE;
 446  449                          drive->td_slink = slink;
 447  450                  }
 448  451                  if ((ssd = sasd_slink_drive(slink)) != NULL) {
 449  452                          (void) strlcpy(ssd->sd_vendor,
 450  453                              sd->inq_vid, sizeof (ssd->sd_vendor));
 451  454                          (void) strlcpy(ssd->sd_id, sd->inq_pid,
↓ open down ↓ 44 lines elided ↑ open up ↑
 496  499          char *dname;
 497  500          int l, d;
 498  501          tlm_library_t *lp;
 499  502  
 500  503          for (l = start; l < max; l++) {
 501  504                  if (!(lp = tlm_library(l)))
 502  505                          continue;
 503  506                  if (lp->tl_drive_count <= 0)
 504  507                          continue;
 505  508  
 506      -                NDMP_LOG(LOG_DEBUG,
      509 +                syslog(LOG_DEBUG,
 507  510                      "Warning: The following drives are not accessible:");
 508  511                  for (d = 1; d <= lp->tl_drive_count; d++)
 509  512                          if (!(dname = tlm_get_tape_name(l, d))) {
 510      -                                NDMP_LOG(LOG_DEBUG,
      513 +                                syslog(LOG_DEBUG,
 511  514                                      "Error getting drive(%d, %d)", l, d);
 512  515                          } else
 513      -                                NDMP_LOG(LOG_DEBUG, "%s", dname);
      516 +                                syslog(LOG_DEBUG, "%s", dname);
 514  517  
 515  518                  /*
 516  519                   * Note: Make the slots inaccessible to prevent running
 517  520                   * discovery on these libraries.  The better idea is
 518  521                   * removing these libraries, but we don't have that
 519  522                   * feature available now.
 520  523                   */
 521  524                  lp->tl_slot_count = 0;
 522  525          }
 523  526  }
↓ open down ↓ 22 lines elided ↑ open up ↑
 546  549           * probe will happen somewhere else.
 547  550           */
 548  551          if (probe_scsi() < 0)
 549  552                  return (-1);
 550  553  
 551  554          nsa = scsi_get_adapter_count();
 552  555          for (i = 0; i < nsa; i++)
 553  556                  if ((sa = scsi_get_adapter(i)))
 554  557                          (void) scan_bus(sa, add_lib, (void *)&nlibs);
 555  558  
 556      -        NDMP_LOG(LOG_DEBUG, "nlibs %d", nlibs);
 557      -
 558  559          /* Search through all SCSI adapters, look for tape drives. */
 559  560          vlibs = 0;
 560  561          for (i = 0; i < nsa; i++)
 561  562                  if ((sa = scsi_get_adapter(i)))
 562  563                          (void) scan_bus(sa, add_drv, (void *)&vlibs);
 563  564  
 564      -        NDMP_LOG(LOG_DEBUG, "vlibs %d", vlibs);
 565      -
 566  565          if (nlibs > 0 && vlibs > 0)
 567  566                  inaccbl_drv_warn(nlibs + 1, vlibs + nlibs + 1);
 568  567  
 569  568          for (l = 1; l <= tlm_library_count(); l++) {
 570  569                  if (!(lp = tlm_library(l))) {
 571      -                        NDMP_LOG(LOG_DEBUG, "can't find lib %d", l);
      570 +                        syslog(LOG_DEBUG, "can't find lib %d", l);
 572  571                          continue;
 573  572                  }
 574  573  
 575  574                  /*
 576  575                   * Make sure all libraries have tape drives.
 577  576                   */
 578  577                  if (lp->tl_drive_count == 0)
 579  578                          continue;
 580  579  
 581  580                  /*
 582  581                   * Make sure all tape drives exist. A drive that is not
 583  582                   * linked into the SCSI chain will be seen by the library
 584  583                   * but we cannot talk to it.
 585  584                   */
 586  585                  for (d = 1; d <= lp->tl_drive_count; d++) {
 587  586                          dp = tlm_drive(l, d);
 588  587                          if (dp && !dp->td_exists) {
 589      -                                NDMP_LOG(LOG_DEBUG, "Ghost drive found %d.%d",
      588 +                                syslog(LOG_DEBUG, "Ghost drive found %d.%d",
 590  589                                      l, d);
 591  590                                  lp->tl_ghost_drives = TRUE;
 592  591                                  continue;
 593  592                          }
 594  593                  }
 595  594          }
 596  595  
 597  596          if (nlibs > 0)
 598  597                  rv = (vlibs > 0) ? 0 : nlibs;
 599  598          else
 600  599                  rv = vlibs;
 601  600  
 602  601          return (rv);
 603  602  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX