93 {
94 mutex_init(&devfsadm_lock, NULL, MUTEX_DEFAULT, NULL);
95 cv_init(&devfsadm_cv, NULL, CV_DEFAULT, NULL);
96 }
97
98 void
99 sdev_devfsadm_lockdestroy(void)
100 {
101 mutex_destroy(&devfsadm_lock);
102 cv_destroy(&devfsadm_cv);
103 }
104
105 /*
106 * Wait for node to be created
107 */
108 int
109 sdev_wait4lookup(struct sdev_node *dv, int cmd)
110 {
111 clock_t expire;
112 clock_t rv;
113 clock_t wakeup = drv_usectohz(2 * 1000000);
114 int rval = ENOENT;
115 int is_lookup = (cmd == SDEV_LOOKUP);
116
117 ASSERT(cmd == SDEV_LOOKUP || cmd == SDEV_READDIR);
118 ASSERT(MUTEX_HELD(&dv->sdev_lookup_lock));
119
120 /* tick value at which wait expires */
121 expire = ddi_get_lbolt() +
122 drv_usectohz(dev_node_wait_timeout * 1000000);
123
124 sdcmn_err6(("wait4lookup %s %s, %ld %d\n",
125 is_lookup ? "lookup" : "readdir",
126 dv->sdev_name, expire - ddi_get_lbolt(), dv->sdev_state));
127
128 if (SDEV_IS_LGWAITING(dv)) {
129 /* devfsadm nodes */
130 while (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
131 !sdev_devfsadm_revoked()) {
132 /* wait 2 sec and check devfsadm completion */
133 rv = cv_reltimedwait_sig(&dv->sdev_lookup_cv,
134 &dv->sdev_lookup_lock, wakeup, TR_CLOCK_TICK);
135
136 if (is_lookup && (rv > 0)) {
137 /* was this node constructed ? */
138 if (dv->sdev_state == SDEV_READY) {
139 rval = 0;
140 }
141 sdcmn_err6(("%s: wait done, %screated %d\n",
142 dv->sdev_name, rval ? "not " : "",
217 cmn_err(CE_WARN, "unable to start devfsadm - "
218 "sysevent error %d\n", se_err);
219 break;
220 }
221 }
222
223 sysevent_free(ev);
224 return (se_err);
225 }
226
227 static int
228 sdev_open_upcall_door()
229 {
230 int error;
231 clock_t rv;
232 clock_t expire;
233
234 ASSERT(sdev_upcall_door == NULL);
235
236 /* timeout expires this many ticks in the future */
237 expire = ddi_get_lbolt() + drv_usectohz(dev_devfsadm_startup * 1000000);
238
239 if (sdev_door_upcall_filename == NULL) {
240 if ((error = sdev_start_devfsadmd()) != 0) {
241 return (error);
242 }
243
244 /* wait for devfsadmd start */
245 mutex_enter(&devfsadm_lock);
246 while (sdev_door_upcall_filename == NULL) {
247 sdcmn_err6(("waiting for dev_door creation, %ld\n",
248 expire - ddi_get_lbolt()));
249 rv = cv_timedwait_sig(&devfsadm_cv, &devfsadm_lock,
250 expire);
251 sdcmn_err6(("dev_door wait rv %ld\n", rv));
252 if (rv <= 0) {
253 sdcmn_err6(("devfsadmd startup error\n"));
254 mutex_exit(&devfsadm_lock);
255 return (EBADF);
256 }
257 }
|
93 {
94 mutex_init(&devfsadm_lock, NULL, MUTEX_DEFAULT, NULL);
95 cv_init(&devfsadm_cv, NULL, CV_DEFAULT, NULL);
96 }
97
98 void
99 sdev_devfsadm_lockdestroy(void)
100 {
101 mutex_destroy(&devfsadm_lock);
102 cv_destroy(&devfsadm_cv);
103 }
104
105 /*
106 * Wait for node to be created
107 */
108 int
109 sdev_wait4lookup(struct sdev_node *dv, int cmd)
110 {
111 clock_t expire;
112 clock_t rv;
113 clock_t wakeup = drv_sectohz(2);
114 int rval = ENOENT;
115 int is_lookup = (cmd == SDEV_LOOKUP);
116
117 ASSERT(cmd == SDEV_LOOKUP || cmd == SDEV_READDIR);
118 ASSERT(MUTEX_HELD(&dv->sdev_lookup_lock));
119
120 /* tick value at which wait expires */
121 expire = ddi_get_lbolt() +
122 drv_sectohz(dev_node_wait_timeout);
123
124 sdcmn_err6(("wait4lookup %s %s, %ld %d\n",
125 is_lookup ? "lookup" : "readdir",
126 dv->sdev_name, expire - ddi_get_lbolt(), dv->sdev_state));
127
128 if (SDEV_IS_LGWAITING(dv)) {
129 /* devfsadm nodes */
130 while (DEVNAME_DEVFSADM_IS_RUNNING(devfsadm_state) &&
131 !sdev_devfsadm_revoked()) {
132 /* wait 2 sec and check devfsadm completion */
133 rv = cv_reltimedwait_sig(&dv->sdev_lookup_cv,
134 &dv->sdev_lookup_lock, wakeup, TR_CLOCK_TICK);
135
136 if (is_lookup && (rv > 0)) {
137 /* was this node constructed ? */
138 if (dv->sdev_state == SDEV_READY) {
139 rval = 0;
140 }
141 sdcmn_err6(("%s: wait done, %screated %d\n",
142 dv->sdev_name, rval ? "not " : "",
217 cmn_err(CE_WARN, "unable to start devfsadm - "
218 "sysevent error %d\n", se_err);
219 break;
220 }
221 }
222
223 sysevent_free(ev);
224 return (se_err);
225 }
226
227 static int
228 sdev_open_upcall_door()
229 {
230 int error;
231 clock_t rv;
232 clock_t expire;
233
234 ASSERT(sdev_upcall_door == NULL);
235
236 /* timeout expires this many ticks in the future */
237 expire = ddi_get_lbolt() + drv_sectohz(dev_devfsadm_startup);
238
239 if (sdev_door_upcall_filename == NULL) {
240 if ((error = sdev_start_devfsadmd()) != 0) {
241 return (error);
242 }
243
244 /* wait for devfsadmd start */
245 mutex_enter(&devfsadm_lock);
246 while (sdev_door_upcall_filename == NULL) {
247 sdcmn_err6(("waiting for dev_door creation, %ld\n",
248 expire - ddi_get_lbolt()));
249 rv = cv_timedwait_sig(&devfsadm_cv, &devfsadm_lock,
250 expire);
251 sdcmn_err6(("dev_door wait rv %ld\n", rv));
252 if (rv <= 0) {
253 sdcmn_err6(("devfsadmd startup error\n"));
254 mutex_exit(&devfsadm_lock);
255 return (EBADF);
256 }
257 }
|