Mercurial > illumos > illumos-gate
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 |
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 } |