2154
2155 found:
2156 ASSERT(dv->sdev_state == SDEV_READY);
2157 if (vtor) {
2158 /*
2159 * Check validity of returned node
2160 */
2161 switch (vtor(dv)) {
2162 case SDEV_VTOR_VALID:
2163 break;
2164 case SDEV_VTOR_STALE:
2165 /*
2166 * The name exists, but the cache entry is
2167 * stale and needs to be re-created.
2168 */
2169 ASSERT(RW_READ_HELD(&ddv->sdev_contents));
2170 if (rw_tryupgrade(&ddv->sdev_contents) == 0) {
2171 rw_exit(&ddv->sdev_contents);
2172 rw_enter(&ddv->sdev_contents, RW_WRITER);
2173 }
2174 sdev_cache_update(ddv, &dv, nm, SDEV_CACHE_DELETE);
2175 rw_downgrade(&ddv->sdev_contents);
2176 SDEV_RELE(dv);
2177 dv = NULL;
2178 goto lookup_create_node;
2179 /* FALLTHRU */
2180 case SDEV_VTOR_INVALID:
2181 SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
2182 sdcmn_err7(("lookup: destroy invalid "
2183 "node: %s(%p)\n", dv->sdev_name, (void *)dv));
2184 goto nolock_notfound;
2185 case SDEV_VTOR_SKIP:
2186 sdcmn_err7(("lookup: node not applicable - "
2187 "skipping: %s(%p)\n", dv->sdev_name, (void *)dv));
2188 rw_exit(&ddv->sdev_contents);
2189 SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
2190 SDEV_RELE(dv);
2191 goto lookup_failed;
2192 default:
2193 cmn_err(CE_PANIC,
|
2154
2155 found:
2156 ASSERT(dv->sdev_state == SDEV_READY);
2157 if (vtor) {
2158 /*
2159 * Check validity of returned node
2160 */
2161 switch (vtor(dv)) {
2162 case SDEV_VTOR_VALID:
2163 break;
2164 case SDEV_VTOR_STALE:
2165 /*
2166 * The name exists, but the cache entry is
2167 * stale and needs to be re-created.
2168 */
2169 ASSERT(RW_READ_HELD(&ddv->sdev_contents));
2170 if (rw_tryupgrade(&ddv->sdev_contents) == 0) {
2171 rw_exit(&ddv->sdev_contents);
2172 rw_enter(&ddv->sdev_contents, RW_WRITER);
2173 }
2174
2175 if (SDEVTOV(dv)->v_type == VDIR)
2176 (void) sdev_cleandir(dv, NULL, SDEV_ENFORCE);
2177
2178 sdev_cache_update(ddv, &dv, nm, SDEV_CACHE_DELETE);
2179 rw_downgrade(&ddv->sdev_contents);
2180 SDEV_RELE(dv);
2181 dv = NULL;
2182 goto lookup_create_node;
2183 /* FALLTHRU */
2184 case SDEV_VTOR_INVALID:
2185 SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
2186 sdcmn_err7(("lookup: destroy invalid "
2187 "node: %s(%p)\n", dv->sdev_name, (void *)dv));
2188 goto nolock_notfound;
2189 case SDEV_VTOR_SKIP:
2190 sdcmn_err7(("lookup: node not applicable - "
2191 "skipping: %s(%p)\n", dv->sdev_name, (void *)dv));
2192 rw_exit(&ddv->sdev_contents);
2193 SD_TRACE_FAILED_LOOKUP(ddv, nm, retried);
2194 SDEV_RELE(dv);
2195 goto lookup_failed;
2196 default:
2197 cmn_err(CE_PANIC,
|