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 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _NSC_DEV_H
27 #define _NSC_DEV_H
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 #ifndef __NSC_GEN__
34 Error: Illegal #include - private file.
35 #endif
36
37
38 #include <sys/nsctl/nsc_gen.h>
39 #include <sys/nsc_ddi.h>
40
41 /*
42 * Interface to I/O module.
43 */
44
45 typedef struct nsc_io_s {
46 struct nsc_io_s *next; /* Link to next I/O module */
47 kcondvar_t cv; /* Blocking variable */
48 int id; /* Module id */
49 int flag; /* Flags */
50 char *name; /* Module name */
51 int refcnt; /* Reference count */
52 int abufcnt; /* # of allocated anonymous buffers */
53 int pend; /* Unregister pending */
54 int (*open)(); /* Open device */
55 int (*close)(); /* Close device */
56 int (*attach)(); /* Attach device */
57 int (*detach)(); /* Detach device */
58 int (*flush)(); /* Flush device */
59 int (*alloc_buf)(); /* Allocate buffer */
60 int (*free_buf)(); /* Free buffer */
61 int (*read)(); /* Read buffer */
62 int (*write)(); /* Write buffer */
63 int (*zero)(); /* Zero buffer */
64 int (*copy)(); /* Copy buffer between handles */
65 int (*copy_direct)(); /* Copy buffer between handle & disk */
66 int (*uncommit)(); /* Uncommit buffer */
67 struct nsc_buf_s *(*alloc_h)(); /* Allocate handle */
68 int (*free_h)(); /* Free handle */
69 int (*uread)(); /* User read */
70 int (*uwrite)(); /* User write */
71 int (*trksize)(); /* Set track size */
72 int (*discard)(); /* Discard pinned data */
73 int (*sizes)(); /* Return size of cache */
74 int (*getpin)(); /* Get pinned info */
75 int (*nodehints)(); /* Return current node hints */
76 int (*partsize)(); /* Partition size */
77 int (*maxfbas)(); /* Maximum I/O size */
78 int (*control)(); /* Module control function */
79 long provide; /* Interface provided */
80 } nsc_io_t;
81
82
83 typedef struct nsc_path_s {
84 struct nsc_path_s *sp_next; /* Link to next path */
85 char *sp_path; /* Pathname */
86 int sp_type; /* Open type */
87 nsc_io_t *sp_io; /* I/O module */
88 int sp_pend; /* Unregister pending */
89 } nsc_path_t;
90
91
92 /*
93 * Note: NSC_MAXPATH currently defined here and in nsctl.h
94 */
95 #if !defined(NSC_MAXPATH)
96 #define NSC_MAXPATH 64
97 #endif
98
99
100 #define NSC_SETVAL_MAX 32
101
102 typedef struct nsc_val_s {
103 struct nsc_val_s *sv_next; /* Link to next value */
104 char sv_name[NSC_SETVAL_MAX]; /* Name of value */
105 int sv_value; /* Value of name */
106 } nsc_val_t;
107
108
109 typedef struct nsc_devval_s {
110 struct nsc_devval_s *dv_next; /* Next dev/val header */
111 nsc_val_t *dv_values; /* The values */
112 char dv_path[NSC_MAXPATH]; /* Path name of device */
113 uint64_t dv_phash; /* Hash of pathname */
114 } nsc_devval_t;
115
116
117 /* used for ncall */
118 typedef struct nsc_rval_s {
119 char path[NSC_MAXPATH]; /* Path name of dev */
120 char name[NSC_SETVAL_MAX]; /* Name of value */
121 int value; /* Value of name */
122 } nsc_rval_t;
123
124
125 extern int _nsc_maxdev;
126
127 #define _NSC_OPEN 0x0004 /* Open in progress */
128 #define _NSC_CLOSE 0x0008 /* Close in progress */
129 #define _NSC_PINNED 0x0010 /* Pinned data reported */
130 #define _NSC_ATTACH 0x0020 /* Available for I/O */
131 #define _NSC_DETACH 0x0040 /* Detach in progress */
132 #define _NSC_OWNER 0x0080 /* Owner detach in progress */
133
134
135 typedef struct nsc_iodev_s {
136 struct nsc_iodev_s *si_next; /* Link to next I/O device */
137 struct nsc_fd_s *si_open; /* Open file descriptors */
138 kmutex_t si_lock; /* Lock to protect I/O chain */
139 kcondvar_t si_cv; /* Blocking variable */
140 int si_refcnt; /* Reference count */
141 int si_busy; /* Callback in progress */
142 int si_pend; /* Operation is pending */
143 int si_rpend; /* Reserve is pending */
144 int si_avail; /* Available for I/O */
145 nsc_io_t *si_io; /* Interface to I/O module */
146 void *si_active; /* Active I/O chain */
147 struct nsc_dev_s *si_dev; /* Device structure */
148 } nsc_iodev_t;
149
150
151 typedef struct nsc_dev_s {
152 struct nsc_dev_s *nsc_next; /* Link to next device */
153 struct nsc_fd_s *nsc_close; /* Closed file descriptors */
154 nsc_iodev_t *nsc_list; /* Active I/O modules */
155 char *nsc_path; /* Pathname */
156 uint64_t nsc_phash; /* Pathname hash */
157 kmutex_t nsc_lock; /* Lock to protect state */
158 int nsc_refcnt; /* Reference count */
159 kcondvar_t nsc_cv; /* Blocking variable */
160 int nsc_wait; /* Count of waiters */
161 int nsc_pend; /* Operation is pending */
162 int nsc_rpend; /* Reserve is pending */
163 int nsc_drop; /* Detach on release */
164 int nsc_reopen; /* Doing reopen */
165 nsc_devval_t *nsc_values; /* Values - see nsc_setval() */
166 } nsc_dev_t;
167
168
169 /*
170 * Storage file descriptor.
171 */
172
173 typedef struct nsc_fd_s {
174 struct nsc_fd_s *sf_next; /* Link to next descriptor */
175 nsc_iodev_t *sf_iodev; /* I/O device structure */
176 nsc_iodev_t *sf_owner; /* Parent I/O device */
177 nsc_dev_t *sf_dev; /* Device structure */
178 nsc_io_t *sf_aio; /* Active I/O module */
179 int sf_avail; /* Availability for I/O */
180 int sf_pend; /* Operation is pending */
181 int sf_type; /* Open type */
182 int sf_flag; /* Open flags */
183 clock_t sf_lbolt; /* Open timestamp */
184 int sf_reopen; /* Re-open required */
185 blind_t sf_cd; /* Underlying I/O descriptor */
186 blind_t sf_arg; /* Argument for callbacks */
187 int sf_reserve; /* Device is reserved */
188 int sf_mode; /* Type of reserve */
189 void (*sf_pinned)(); /* Callback - Data pinned */
190 void (*sf_unpinned)(); /* Callback - Data unpinned */
191 int (*sf_attach)(); /* Callback - Attach */
192 int (*sf_detach)(); /* Callback - Detach */
193 int (*sf_flush)(); /* Callback - Flush */
194 } nsc_fd_t;
195
196
197 /*
198 * External definitions.
199 */
200
201 extern nsc_io_t *_nsc_null_io;
202
203 #ifdef _KERNEL
204 extern int _nsc_open_fd(nsc_fd_t *, int);
205 extern int _nsc_close_fd(nsc_fd_t *, int);
206 extern int _nsc_detach_fd(nsc_fd_t *, int);
207 extern int _nsc_detach_iodev(nsc_iodev_t *, nsc_fd_t *, int);
208 extern int _nsc_detach_dev(nsc_dev_t *, nsc_iodev_t *, int);
209 extern int _nsc_call_io(long, blind_t, blind_t, blind_t);
210 extern int _nsc_wait_dev(nsc_dev_t *, int);
211 extern void _nsc_wake_dev(nsc_dev_t *, int *);
212 #endif /* _KERNEL */
213
214 #ifdef __cplusplus
215 }
216 #endif
217
218 #endif /* _NSC_DEV_H */