annotate usr/src/cmd/ndmpd/tlm/tlm_init.c @ 13036:9c1800b4023e

6956564 st debug asserts at EOM 6726523 Amber Road NDMP: ndmp should not assume device links represent devices 6968119 Amber Road NDMP: ndmp status page should show correct WWN for tape devices
author Randall Ralphs <Randall.Ralphs@Sun.COM>
date Thu, 05 Aug 2010 15:20:03 -0600
parents 9b3c96bc17e3
children 60ed88a16f55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
1 /*
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
2 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
3 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
4
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
5 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
6 * BSD 3 Clause License
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
7 *
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
8 * Copyright (c) 2007, The Storage Networking Industry Association.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
9 *
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
10 * Redistribution and use in source and binary forms, with or without
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
11 * modification, are permitted provided that the following conditions
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
12 * are met:
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
13 * - Redistributions of source code must retain the above copyright
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
14 * notice, this list of conditions and the following disclaimer.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
15 *
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
16 * - Redistributions in binary form must reproduce the above copyright
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
17 * notice, this list of conditions and the following disclaimer in
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
18 * the documentation and/or other materials provided with the
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
19 * distribution.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
20 *
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
21 * - Neither the name of The Storage Networking Industry Association (SNIA)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
22 * nor the names of its contributors may be used to endorse or promote
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
23 * products derived from this software without specific prior written
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
24 * permission.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
25 *
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
36 * POSSIBILITY OF SUCH DAMAGE.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
37 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
38 #include <sys/errno.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
39 #include <sys/types.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
40 #include <stdlib.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
41 #include <unistd.h>
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
42 #include <ctype.h>
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
43 #include <sys/byteorder.h>
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
44 #include <sys/scsi/impl/uscsi.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
45 #include <sys/scsi/scsi.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
46 #include <tlm.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
47 #include <pthread.h>
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
48 #include "tlm_proto.h"
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
49
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
50 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
51 * generic routine to read a SCSI page
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
52 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
53 int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
54 read_scsi_page(scsi_link_t *slink, union scsi_cdb *cdb,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
55 int command_size, caddr_t data, int size)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
56 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
57 struct uscsi_cmd uscsi_cmd;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
58 char *dname;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
59 int dev;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
60
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
61 if (slink == 0 || slink->sl_sa == 0)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
62 return (EINVAL);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
63
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
64 (void) memset(&uscsi_cmd, 0, sizeof (uscsi_cmd));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
65
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
66 /* Lun is in the 5th bit */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
67 cdb->scc_lun = slink->sl_lun;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
68 uscsi_cmd.uscsi_flags |= USCSI_READ | USCSI_ISOLATE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
69 uscsi_cmd.uscsi_bufaddr = data;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
70 uscsi_cmd.uscsi_buflen = size;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
71 uscsi_cmd.uscsi_timeout = 1000;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
72 uscsi_cmd.uscsi_cdb = (char *)cdb;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
73
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
74 if (cdb->scc_cmd == SCMD_READ_ELEMENT_STATUS) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
75 uscsi_cmd.uscsi_flags |= USCSI_RQENABLE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
76 uscsi_cmd.uscsi_rqbuf = data;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
77 uscsi_cmd.uscsi_rqlen = size;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
78 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
79 uscsi_cmd.uscsi_cdblen = command_size;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
80
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
81 dname = sasd_slink_name(slink);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
82 dev = open(dname, O_RDWR | O_NDELAY);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
83 if (dev == -1) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
84 NDMP_LOG(LOG_DEBUG, "Open failed for %s err=%d",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
85 dname, errno);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
86 return (errno);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
87 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
88 if (tlm_ioctl(dev, USCSICMD, &uscsi_cmd) < 0) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
89 NDMP_LOG(LOG_DEBUG, "SCSI cmd %d failed for %s err=%d",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
90 cdb->scc_cmd, dname, errno);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
91 (void) close(dev);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
92 return (errno);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
93 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
94 (void) close(dev);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
95 return (uscsi_cmd.uscsi_status);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
96 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
97
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
98 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
99 * Read the Inquiry Page.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
100 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
101 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
102 read_inquiry_page(scsi_link_t *slink, struct scsi_inquiry *inq)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
103 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
104 union scsi_cdb cdb;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
105
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
106 (void) memset(&cdb, 0, sizeof (union scsi_cdb));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
107 cdb.scc_cmd = SCMD_INQUIRY;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
108 cdb.g0_count0 = sizeof (struct scsi_inquiry);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
109
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
110 return (read_scsi_page(slink, &cdb, CDB_GROUP0,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
111 (caddr_t)inq, sizeof (*inq)) ? -1 : 0);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
112 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
113
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
114 /*
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
115 * Read the Product Data Page.
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
116 */
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
117 static int
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
118 read_data_page(scsi_link_t *slink, int pcode, char *snum, int size)
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
119 {
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
120 char cmd[CDB_GROUP0];
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
121
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
122 (void) memset(cmd, 0, sizeof (cmd));
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
123
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
124 cmd[0] = SCMD_INQUIRY;
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
125 cmd[1] = pcode ? 0x01 : 0x00;
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
126 cmd[2] = pcode;
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
127 cmd[4] = size;
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
128
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
129 /* LINTED improper alignment */
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
130 return (read_scsi_page(slink, (union scsi_cdb *)&cmd, CDB_GROUP0,
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
131 (caddr_t)snum, size) == -1 ? -1 : 0);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
132 }
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
133
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
134
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
135 /*
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
136 * Read the Serial Number Page.
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
137 */
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
138 static int
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
139 read_serial_num_page(scsi_link_t *slink, char *snum, int size)
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
140 {
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
141 scsi_serial_t serial;
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
142 int rv;
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
143
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
144 (void) memset(&serial, 0, sizeof (scsi_serial_t));
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
145 rv = read_data_page(slink, SCSI_SERIAL_PAGE, (caddr_t)&serial,
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
146 sizeof (scsi_serial_t));
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
147 (void) strlcpy(snum, serial.sr_num, size);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
148
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
149 return (rv == -1 ? -1 : 0);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
150 }
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
151
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
152
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
153 /*
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
154 * Read the Device Name Page.
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
155 */
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
156 static int
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
157 read_dev_name_page(scsi_link_t *slink, device_ident_header_t *devp, int len)
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
158 {
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
159 (void) memset(devp, 0, len);
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
160
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
161 if (read_data_page(slink, SCSI_DEVICE_IDENT_PAGE, (caddr_t)devp,
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
162 len) == -1)
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
163 return (-1);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
164
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
165 if (devp->di_page_code != SCSI_DEVICE_IDENT_PAGE)
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
166 return (-1);
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
167
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
168 return (0);
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
169 }
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
170
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
171 /*
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
172 * Formatted print of WWN
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
173 */
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
174 static void
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
175 snprintf_wwn(char *buf, int size, uint8_t *wwn)
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
176 {
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
177 if (wwn == NULL || buf == NULL)
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
178 return;
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
179
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
180 (void) snprintf(buf, size, "0x%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
181 wwn[0], wwn[1], wwn[2], wwn[3], wwn[4], wwn[5], wwn[6], wwn[7]);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
182 }
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
183
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
184
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
185 /*
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
186 * Extract and print the world wide name (WWN)
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
187 */
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
188 int
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
189 read_device_wwn(scsi_link_t *slink, char *wwnp, int wsize)
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
190 {
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
191 device_ident_header_t *header;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
192 name_ident_t *ident;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
193 uint16_t page_len = sizeof (device_ident_header_t);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
194 uint16_t act_len;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
195 int accessed;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
196 uint8_t *designator_data;
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
197
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
198 (void) memset(wwnp, 0, wsize);
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
199 resize:
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
200 header = malloc(page_len);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
201 if (header == NULL)
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
202 return (-1);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
203
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
204 if (read_dev_name_page(slink, header, page_len) == -1) {
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
205 free(header);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
206 return (-1);
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
207 }
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
208
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
209 act_len = BE_16(header->di_page_length);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
210 if (act_len > page_len) {
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
211 free(header);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
212 page_len = act_len;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
213 goto resize;
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
214 }
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
215
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
216 ident = (name_ident_t *)&header[1];
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
217 accessed = sizeof (device_ident_header_t);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
218
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
219 while (accessed < act_len) {
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
220
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
221 accessed += sizeof (name_ident_t);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
222 accessed += ident->ni_ident_length;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
223 designator_data = (uint8_t *)&ident[1];
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
224 /*
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
225 * Looking for code set 1 (Binary) ident type NAA 64 bit
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
226 * address that is associated with the node (0).
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
227 */
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
228 if ((ident->ni_code_set == 1) &&
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
229 (ident->ni_ident_type == 3)) {
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
230 snprintf_wwn(wwnp, wsize, designator_data);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
231 /*
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
232 * If assc is zero (Node) this is the one we want.
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
233 * If we find that we're done.
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
234 */
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
235 if (ident->ni_asso == 0)
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
236 break;
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
237 }
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
238 /*
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
239 * If we find a EUI-64 we can use that also.
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
240 */
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
241 if ((ident->ni_code_set == 2) &&
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
242 (ident->ni_ident_type == 1) &&
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
243 (ident->ni_asso == 0) &&
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
244 (isprint(wwnp[0] == 0))) { /* Don't overwrite */
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
245 /*
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
246 * This isn't our first choice but we'll print it
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
247 * in case there is nothing else to use.
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
248 */
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
249 (void) snprintf(wwnp, wsize, "%.*s",
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
250 ident->ni_ident_length, designator_data);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
251 }
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
252 ident =
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
253 (name_ident_t *)&designator_data[ident->ni_ident_length];
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
254 }
13036
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
255 free(header);
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
256 /*
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
257 * See if we found something.
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
258 * Memset above would leave wwnp not printable.
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
259 */
9c1800b4023e 6956564 st debug asserts at EOM
Randall Ralphs <Randall.Ralphs@Sun.COM>
parents: 8193
diff changeset
260 if (isprint(wwnp[0]))
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
261 return (0);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
262 return (-1);
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
263 }
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
264
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
265 /*
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
266 * Add the tape library call back function (used while scanning the bus)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
267 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
268 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
269 add_lib(scsi_link_t *slink, struct scsi_inquiry *sd, void *arg)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
270 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
271 int l;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
272 int *nlp; /* pointer to library counter */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
273 sasd_drive_t *ssd;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
274
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
275 if (!slink || !sd) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
276 NDMP_LOG(LOG_DEBUG, "Invalid argument %x %x %x",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
277 slink, sd, arg);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
278 return (-TLM_INVALID);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
279 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
280
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
281 if (sd->inq_dtype == DTYPE_CHANGER) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
282 /* This is a robot, which means this is also a library */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
283 nlp = (int *)arg;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
284 (*nlp)++;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
285 l = tlm_insert_new_library(slink);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
286 tlm_enable_barcode(l);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
287
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
288 NDMP_LOG(LOG_DEBUG, "lib %d sid %d lun %d",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
289 l, slink->sl_sid, slink->sl_lun);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
290
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
291 if ((ssd = sasd_slink_drive(slink)) != NULL) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
292 (void) strlcpy(ssd->sd_vendor, sd->inq_vid,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
293 sizeof (ssd->sd_vendor));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
294 (void) strlcpy(ssd->sd_id, sd->inq_pid,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
295 sizeof (ssd->sd_id));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
296 (void) strlcpy(ssd->sd_rev, sd->inq_revision,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
297 sizeof (ssd->sd_rev));
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
298 (void) read_serial_num_page(slink, ssd->sd_serial,
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
299 sizeof (ssd->sd_serial));
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
300 (void) read_device_wwn(slink, ssd->sd_wwn,
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
301 sizeof (ssd->sd_wwn));
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
302 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
303 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
304
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
305 return (TLM_NO_ERRORS);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
306 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
307
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
308 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
309 * Create some virutal slots
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
310 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
311 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
312 make_virtual_slot(int l, tlm_drive_t *dp)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
313 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
314 int s;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
315 tlm_slot_t *sp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
316
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
317 if (l <= 0 || !dp) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
318 NDMP_LOG(LOG_DEBUG, "Invalid argument %d, %x", l, dp);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
319 return (-TLM_INVALID);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
320 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
321
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
322 if ((s = tlm_insert_new_slot(l)) <= 0)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
323 return (-TLM_NO_MEMORY);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
324
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
325 if (!(sp = tlm_slot(l, s))) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
326 NDMP_LOG(LOG_DEBUG, "Internal error: slot not found %d", s);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
327 return (-TLM_ERROR_INTERNAL);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
328 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
329 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
330 * For virtual slots element number is 0 and they are always full.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
331 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
332 sp->ts_element = 0;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
333 sp->ts_status_full = TRUE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
334 return (TLM_NO_ERRORS);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
335 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
336
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
337 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
338 * Make the tape drive not part of a tape library (stand alone)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
339 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
340 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
341 make_stand_alone_drive(scsi_link_t *slink, int l)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
342 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
343 int d;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
344 tlm_drive_t *dp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
345
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
346 if (!slink || l <= 0) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
347 NDMP_LOG(LOG_DEBUG, "Invalid argument %x %d", slink, l);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
348 return (-TLM_INVALID);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
349 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
350
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
351 d = tlm_insert_new_drive(l);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
352 if (!(dp = tlm_drive(l, d))) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
353 NDMP_LOG(LOG_DEBUG, "Internal error: drive not found %d", d);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
354 return (-TLM_ERROR_INTERNAL);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
355 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
356
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
357 /* For stand-alone drives, the element number is the drive number. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
358 dp->td_element = d;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
359 dp->td_slink = slink;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
360 dp->td_scsi_id = slink->sl_sid;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
361 dp->td_lun = slink->sl_lun;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
362 dp->td_exists = TRUE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
363
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
364 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
365 * Note: There is no way to remove library elements. We cannot clean
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
366 * up if make_virtual_slot() fails.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
367 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
368 (void) make_virtual_slot(l, dp);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
369 return (d);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
370 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
371
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
372 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
373 * Find the LIBRARY structure that has control of this DRIVE.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
374 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
375 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
376 new_drive(scsi_link_t *slink, int *lib)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
377 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
378 int d;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
379 tlm_drive_t *dp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
380 tlm_library_t *lp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
381
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
382 /* Walk through all libraries. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
383 for (*lib = 1; *lib <= tlm_library_count(); (*lib)++) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
384 if (!(lp = tlm_library(*lib)))
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
385 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
386 /* Walk through drives that are already found. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
387 for (d = 1; d <= lp->tl_drive_count; d++) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
388 if (!(dp = tlm_drive(*lib, d)))
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
389 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
390 if (dp->td_scsi_id == slink->sl_sid &&
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
391 dp->td_lun == slink->sl_lun)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
392 return (d);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
393 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
394 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
395
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
396 /* Not part of any library, this is a newly found tape drive. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
397 return (0);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
398 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
399
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
400
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
401 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
402 * Add the tape library call back function (used while scanning the bus)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
403 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
404 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
405 add_drv(scsi_link_t *slink, struct scsi_inquiry *sd, void *arg)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
406 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
407 int l, d;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
408 int *vlp; /* pointer to virtual library number */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
409 sasd_drive_t *ssd;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
410 tlm_library_t *library;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
411 tlm_drive_t *drive;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
412
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
413 if (!slink || !sd) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
414 NDMP_LOG(LOG_DEBUG, "Invalid argument %x %x %x",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
415 slink, sd, arg);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
416 return (-TLM_INVALID);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
417 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
418
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
419 if (sd->inq_dtype == DTYPE_SEQUENTIAL) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
420 vlp = (int *)arg;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
421 d = new_drive(slink, &l);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
422 if (d == 0) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
423 /* This tape drive was not found inside any robot. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
424 if (*vlp == 0) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
425 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
426 * First, create a virtual library if it's not
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
427 * done yet.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
428 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
429 *vlp = tlm_insert_new_library(slink);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
430 if ((library = tlm_library(*vlp)) != NULL)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
431 library->tl_capability_robot = FALSE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
432 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
433 if ((d = make_stand_alone_drive(slink, *vlp)) < 0) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
434 /* sorry, we can not clean up the vlib now * */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
435 return (-TLM_INVALID);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
436 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
437 l = *vlp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
438 NDMP_LOG(LOG_DEBUG, "vlib(%d, %d) sid %d lun %d",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
439 l, d, slink->sl_sid, slink->sl_lun);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
440 } else
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
441 NDMP_LOG(LOG_DEBUG, "(%d, %d) sid %d lun %d",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
442 l, d, slink->sl_sid, slink->sl_lun);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
443
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
444 if ((drive = tlm_drive(l, d)) != NULL) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
445 drive->td_exists = TRUE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
446 drive->td_slink = slink;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
447 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
448 if ((ssd = sasd_slink_drive(slink)) != NULL) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
449 (void) strlcpy(ssd->sd_vendor,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
450 sd->inq_vid, sizeof (ssd->sd_vendor));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
451 (void) strlcpy(ssd->sd_id, sd->inq_pid,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
452 sizeof (ssd->sd_id));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
453 (void) strlcpy(ssd->sd_rev, sd->inq_revision,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
454 sizeof (ssd->sd_rev));
8193
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
455 (void) read_serial_num_page(slink, ssd->sd_serial,
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
456 sizeof (ssd->sd_serial));
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
457 (void) read_device_wwn(slink, ssd->sd_wwn,
9b3c96bc17e3 6758838 Amber Road NDMP: ndmpd passes invalid path for DAR restore of multiple files
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents: 7917
diff changeset
458 sizeof (ssd->sd_wwn));
7917
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
459 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
460 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
461
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
462 return (TLM_NO_ERRORS);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
463 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
464
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
465 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
466 * Scan the specified bus and call the handler function.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
467 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
468 static int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
469 scan_bus(scsi_adapter_t *sa, int(*hndlr)(), void *args)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
470 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
471 int nerr;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
472 scsi_link_t *slink;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
473 struct scsi_inquiry scsi_data;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
474
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
475 nerr = 0;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
476 slink = sa->sa_link_head.sl_next;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
477 for (; slink != &sa->sa_link_head; slink = slink->sl_next) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
478 (void) memset(&scsi_data, 0, sizeof (struct scsi_inquiry));
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
479 if (read_inquiry_page(slink, &scsi_data) == -1)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
480 nerr++;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
481 else
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
482 if ((*hndlr)(slink, &scsi_data, args) != TLM_NO_ERRORS)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
483 nerr++;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
484 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
485
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
486 return (nerr);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
487 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
488
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
489 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
490 * Marks the library/slots inaccessible if there are not enough drives
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
491 * available on the library
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
492 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
493 static void
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
494 inaccbl_drv_warn(int start, int max)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
495 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
496 char *dname;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
497 int l, d;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
498 tlm_library_t *lp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
499
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
500 for (l = start; l < max; l++) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
501 if (!(lp = tlm_library(l)))
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
502 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
503 if (lp->tl_drive_count <= 0)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
504 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
505
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
506 NDMP_LOG(LOG_DEBUG,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
507 "Warning: The following drives are not accessible:");
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
508 for (d = 1; d <= lp->tl_drive_count; d++)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
509 if (!(dname = tlm_get_tape_name(l, d))) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
510 NDMP_LOG(LOG_DEBUG,
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
511 "Error getting drive(%d, %d)", l, d);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
512 } else
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
513 NDMP_LOG(LOG_DEBUG, "%s", dname);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
514
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
515 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
516 * Note: Make the slots inaccessible to prevent running
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
517 * discovery on these libraries. The better idea is
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
518 * removing these libraries, but we don't have that
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
519 * feature available now.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
520 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
521 lp->tl_slot_count = 0;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
522 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
523 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
524
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
525 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
526 * Initialize the tape library data structure, asks the libraries what
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
527 * equipments they have.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
528 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
529 int
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
530 tlm_init(void)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
531 {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
532 static int nlibs; /* number of found libraries */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
533 int i, nsa;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
534 int l, vlibs, d;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
535 int rv;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
536 scsi_adapter_t *sa;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
537 tlm_library_t *lp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
538 tlm_drive_t *dp;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
539
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
540 /* Search through all SCSI adapters, look for tape robots. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
541 nlibs = 0;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
542
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
543 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
544 * We probe both changers and tape drives here
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
545 * but later on this needs to be removed as the
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
546 * probe will happen somewhere else.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
547 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
548 (void) probe_scsi();
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
549
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
550 nsa = scsi_get_adapter_count();
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
551 for (i = 0; i < nsa; i++)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
552 if ((sa = scsi_get_adapter(i)))
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
553 (void) scan_bus(sa, add_lib, (void *)&nlibs);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
554
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
555 NDMP_LOG(LOG_DEBUG, "nlibs %d", nlibs);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
556
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
557 /* Search through all SCSI adapters, look for tape drives. */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
558 vlibs = 0;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
559 for (i = 0; i < nsa; i++)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
560 if ((sa = scsi_get_adapter(i)))
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
561 (void) scan_bus(sa, add_drv, (void *)&vlibs);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
562
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
563 NDMP_LOG(LOG_DEBUG, "vlibs %d", vlibs);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
564
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
565 if (nlibs > 0 && vlibs > 0)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
566 inaccbl_drv_warn(nlibs + 1, vlibs + nlibs + 1);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
567
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
568 for (l = 1; l <= tlm_library_count(); l++) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
569 if (!(lp = tlm_library(l))) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
570 NDMP_LOG(LOG_DEBUG, "can't find lib %d", l);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
571 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
572 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
573
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
574 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
575 * Make sure all libraries have tape drives.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
576 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
577 if (lp->tl_drive_count == 0)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
578 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
579
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
580 /*
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
581 * Make sure all tape drives exist. A drive that is not
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
582 * linked into the SCSI chain will be seen by the library
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
583 * but we cannot talk to it.
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
584 */
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
585 for (d = 1; d <= lp->tl_drive_count; d++) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
586 dp = tlm_drive(l, d);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
587 if (dp && !dp->td_exists) {
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
588 NDMP_LOG(LOG_DEBUG, "Ghost drive found %d.%d",
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
589 l, d);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
590 lp->tl_ghost_drives = TRUE;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
591 continue;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
592 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
593 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
594 }
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
595
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
596 if (nlibs > 0)
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
597 rv = (vlibs > 0) ? 0 : nlibs;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
598 else
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
599 rv = vlibs;
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
600
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
601 return (rv);
5c4442486198 6760398 Moving NDMP to open source
Reza Sabdar <Reza.Sabdar@Sun.COM>
parents:
diff changeset
602 }