Print this page
NEX-7233 Attempting to destroy ZFS filesystem and create ZFS volume with the same name caused system panic
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>


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,