1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _DISKS_PRIVATE_H
27 #define	_DISKS_PRIVATE_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #include <libdevinfo.h>
34 #include <sys/dkio.h>
35 #include <devid.h>
36 
37 #define	DM_DEBUG	"DM_LIBDISKMGT_DEBUG"
38 extern int dm_debug;
39 
40 #define	NVATTRS	NV_UNIQUE_NAME | NV_UNIQUE_NAME_TYPE
41 #define	NVATTRS_STAT	0x0
42 
43 typedef struct slice_info {
44 	char		*devpath;
45 	int		slice_num;
46 	struct slice_info *next;
47 } slice_t;
48 
49 typedef struct alias_info {
50 	char		*kstat_name;
51 	char		*alias;
52 	slice_t		*devpaths;
53 	slice_t		*orig_paths;
54 	char		*wwn;
55 	int		cluster;
56 	int		lun;
57 	int		target;
58 	struct alias_info *next;
59 } alias_t;
60 
61 typedef struct path {
62 	char			*name;
63 	char			*ctype;
64 	int			*states;
65 	char			**wwns;
66 	struct disk		**disks;
67 	struct controller_info	*controller;
68 	struct path		*next;
69 } path_t;
70 
71 typedef struct bus_info {
72 	char			*name;
73 	char			*kstat_name;
74 	char			*btype;
75 	char			*pname;
76 	int			freq;
77 	struct controller_info	**controllers;
78 	struct bus_info		*next;
79 } bus_t;
80 
81 typedef struct controller_info {
82 	char		*name;
83 	char		*kstat_name;
84 	char		*ctype;
85 	int		freq;
86 	struct disk	**disks;
87 	struct path	**paths;
88 	struct bus_info	*bus;
89 	struct controller_info *next;
90 	int		multiplex;
91 	int		scsi_options;
92 } controller_t;
93 
94 typedef struct disk {
95 	char		*device_id;	/* string encoded device id */
96 	ddi_devid_t	devid;		/* decoded device id */
97 	char		*kernel_name;	/* handles drives w/ no devlinks */
98 	char		*product_id;
99 	char		*vendor_id;
100 	controller_t	**controllers;
101 	path_t		**paths;
102 	alias_t		*aliases;
103 	struct disk	*next;
104 	int		drv_type;
105 	int		removable;
106 	int		sync_speed;
107 	int		rpm;
108 	int		wide;
109 	int		cd_rom;
110 	int		solid_state;
111 } disk_t;
112 
113 typedef struct descriptor {
114 	union {
115 	    void		*generic;
116 	    disk_t		*disk;
117 	    controller_t	*controller;
118 	    bus_t		*bus;
119 	    path_t		*path;
120 	} p;
121 	char			*name;
122 	char			*secondary_name;
123 	struct descriptor	*next;
124 	struct descriptor	*prev;
125 	dm_desc_type_t		type;
126 	int			refcnt;
127 } descriptor_t;
128 
129 struct search_args {
130 	disk_t			*disk_listp;
131 	controller_t		*controller_listp;
132 	bus_t			*bus_listp;
133 	di_devlink_handle_t	handle;
134 	di_prom_handle_t	ph;
135 	di_node_t		node;
136 	di_minor_t		minor;
137 	int			dev_walk_status;
138 };
139 
140 typedef enum {
141     DM_EV_DISK_ADD = 0,
142     DM_EV_DISK_DELETE
143 } dm_event_type_t;
144 
145 
146 /* private internal functions */
147 descriptor_t	**alias_get_descriptors(int filter[], int *errp);
148 descriptor_t	**alias_get_assoc_descriptors(descriptor_t *desc,
149 		    dm_desc_type_t type, int *errp);
150 descriptor_t	*alias_get_descriptor_by_name(char *name, int *errp);
151 char		*alias_get_name(descriptor_t *desc);
152 nvlist_t	*alias_get_attributes(descriptor_t *desc, int *errp);
153 nvlist_t	*alias_get_stats(descriptor_t *desc, int stat_type, int *errp);
154 int		alias_make_descriptors();
155 
156 descriptor_t	**bus_get_descriptors(int filter[], int *errp);
157 descriptor_t	**bus_get_assoc_descriptors(descriptor_t *desc,
158 		    dm_desc_type_t type, int *errp);
159 descriptor_t	*bus_get_descriptor_by_name(char *name, int *errp);
160 char		*bus_get_name(descriptor_t *desc);
161 nvlist_t	*bus_get_attributes(descriptor_t *desc, int *errp);
162 nvlist_t	*bus_get_stats(descriptor_t *desc, int stat_type,
163 		    int *errp);
164 int		bus_make_descriptors();
165 
166 descriptor_t	**controller_get_descriptors(int filter[], int *errp);
167 descriptor_t	**controller_get_assoc_descriptors(descriptor_t *desc,
168 		    dm_desc_type_t type, int *errp);
169 descriptor_t	*controller_get_descriptor_by_name(char *name, int *errp);
170 char		*controller_get_name(descriptor_t *desc);
171 nvlist_t	*controller_get_attributes(descriptor_t *desc, int *errp);
172 nvlist_t	*controller_get_stats(descriptor_t *desc, int stat_type,
173 		    int *errp);
174 int		controller_make_descriptors();
175 
176 descriptor_t	**drive_get_descriptors(int filter[], int *errp);
177 descriptor_t	**drive_get_assoc_descriptors(descriptor_t *desc,
178 		    dm_desc_type_t type, int *errp);
179 descriptor_t	**drive_get_assocs(descriptor_t *desc, int *errp);
180 descriptor_t	*drive_get_descriptor_by_name(char *name, int *errp);
181 char		*drive_get_name(descriptor_t *desc);
182 nvlist_t	*drive_get_attributes(descriptor_t *desc, int *errp);
183 nvlist_t	*drive_get_stats(descriptor_t *desc, int stat_type, int *errp);
184 int		drive_make_descriptors();
185 int		drive_open_disk(disk_t *diskp, char *opath, int len);
186 
187 descriptor_t	**media_get_descriptors(int filter[], int *errp);
188 descriptor_t	**media_get_assoc_descriptors(descriptor_t *desc,
189 		    dm_desc_type_t type, int *errp);
190 descriptor_t	**media_get_assocs(descriptor_t *desc, int *errp);
191 descriptor_t	*media_get_descriptor_by_name(char *name, int *errp);
192 char		*media_get_name(descriptor_t *desc);
193 nvlist_t	*media_get_attributes(descriptor_t *desc, int *errp);
194 nvlist_t	*media_get_stats(descriptor_t *desc, int stat_type, int *errp);
195 int		media_make_descriptors();
196 int		media_read_info(int fd, struct dk_minfo *minfo);
197 int		media_read_name(disk_t *dp, char *mname, int size);
198 
199 descriptor_t	**path_get_descriptors(int filter[], int *errp);
200 descriptor_t	**path_get_assoc_descriptors(descriptor_t *desc,
201 		    dm_desc_type_t type, int *errp);
202 descriptor_t	*path_get_descriptor_by_name(char *name, int *errp);
203 char		*path_get_name(descriptor_t *desc);
204 nvlist_t	*path_get_attributes(descriptor_t *desc, int *errp);
205 nvlist_t	*path_get_stats(descriptor_t *desc, int stat_type, int *errp);
206 int		path_make_descriptors();
207 
208 descriptor_t	**slice_get_descriptors(int filter[], int *errp);
209 descriptor_t	**slice_get_assoc_descriptors(descriptor_t *desc,
210 		    dm_desc_type_t type, int *errp);
211 descriptor_t	**slice_get_assocs(descriptor_t *desc, int *errp);
212 descriptor_t	*slice_get_descriptor_by_name(char *name, int *errp);
213 char		*slice_get_name(descriptor_t *desc);
214 nvlist_t	*slice_get_attributes(descriptor_t *desc, int *errp);
215 nvlist_t	*slice_get_stats(descriptor_t *desc, int stat_type, int *errp);
216 int		slice_make_descriptors();
217 void		slice_rdsk2dsk(char *rdsk, char *dsk, int size);
218 
219 /* cache.c */
220 void		cache_free_alias(alias_t *aliasp);
221 void		cache_free_bus(bus_t *bp);
222 void		cache_free_controller(controller_t *cp);
223 void		cache_free_descriptor(descriptor_t *desc);
224 void		cache_free_descriptors(descriptor_t **desc_list);
225 void		cache_free_disk(disk_t *dp);
226 void		cache_free_path(path_t *pp);
227 bus_t		*cache_get_buslist();
228 controller_t	*cache_get_controllerlist();
229 descriptor_t	*cache_get_desc(int type, void *gp, char *name,
230 		    char *secondary_name, int *errp);
231 descriptor_t	**cache_get_descriptors(int type, int *errp);
232 disk_t		*cache_get_disklist();
233 int		cache_is_valid_desc(descriptor_t *d);
234 void		cache_load_desc(int type, void *gp, char *name,
235 		    char *secondary_name, int *errp);
236 void		cache_rlock();
237 void		cache_unlock();
238 void		cache_update(dm_event_type_t ev_type, char *devname);
239 void		cache_wlock();
240 
241 /* findevs.c */
242 void		findevs(struct search_args *args);
243 
244 /* events.c */
245 int		events_start_event_watcher();
246 void		events_new_event(char *name, int dtype, char *etype);
247 void		events_new_slice_event(char *dev, char *type);
248 
249 /* entry.c */
250 void		libdiskmgt_add_str(nvlist_t *attrs, char *name, char *val,
251 		    int *errp);
252 descriptor_t	**libdiskmgt_empty_desc_array(int *errp);
253 void		libdiskmgt_init_debug();
254 int		libdiskmgt_str_eq(char *nm1, char *nm2);
255 
256 /* in-use detectors */
257 int		inuse_mnt(char *slice, nvlist_t *attrs, int *errp);
258 int		inuse_svm(char *slice, nvlist_t *attrs, int *errp);
259 int		inuse_lu(char *slice, nvlist_t *attrs, int *errp);
260 int		inuse_active_zpool(char *slice, nvlist_t *attrs, int *errp);
261 int		inuse_exported_zpool(char *slice, nvlist_t *attrs, int *errp);
262 int		inuse_dump(char *slice, nvlist_t *attrs, int *errp);
263 int		inuse_vxvm(char *slice, nvlist_t *attrs, int *errp);
264 int		inuse_fs(char *slice, nvlist_t *attrs, int *errp);
265 
266 #ifdef __cplusplus
267 }
268 #endif
269 
270 #endif /* _DISKS_PRIVATE_H */
271