Print this page
1845 allow disable of UNMAP via stmfadm(1M).

*** 1351,1360 **** --- 1351,1363 ---- sli->sli_flags |= SLI_WRITE_PROTECTED; } if (sl->sl_flags & SL_SAVED_WRITE_CACHE_DISABLE) { sli->sli_flags |= SLI_WRITEBACK_CACHE_DISABLE; } + if (sl->sl_flags & SL_SAVED_UNMAP_ENABLED) { + sli->sli_flags |= SLI_UNMAP_ENABLED; + } if (sl->sl_flags & SL_VID_VALID) { bcopy(sl->sl_vendor_id, sli->sli_vid, 8); sli->sli_flags |= SLI_VID_VALID; } if (sl->sl_flags & SL_PID_VALID) {
*** 1387,1416 **** kmem_free(sli, sizeof (*sli) + s); return (ret); } /* ! * Will scribble SL_UNMAP_ENABLED into sl_flags if we succeed. */ ! static void ! do_unmap_setup(sbd_lu_t *sl) { ASSERT((sl->sl_flags & SL_UNMAP_ENABLED) == 0); ! if ((sl->sl_flags & SL_ZFS_META) == 0) ! return; /* No UNMAP for you. */ ! sl->sl_flags |= SL_UNMAP_ENABLED; } int sbd_populate_and_register_lu(sbd_lu_t *sl, uint32_t *err_ret) { stmf_lu_t *lu = sl->sl_lu; stmf_status_t ret; ! do_unmap_setup(sl); lu->lu_id = (scsi_devid_desc_t *)sl->sl_device_id; if (sl->sl_alias) { lu->lu_alias = sl->sl_alias; } else { --- 1390,1429 ---- kmem_free(sli, sizeof (*sli) + s); return (ret); } /* ! * Will scribble SL_UNMAP_ENABLED on or off in sl_flags if we succeed. ! * Returns B_TRUE if the LU is UNMAP-capable. */ ! static boolean_t ! do_unmap_setup(sbd_lu_t *sl, boolean_t enable) { + if ((sl->sl_flags & SL_ZFS_META) == 0) { + sl->sl_flags &= ~SL_SAVED_UNMAP_ENABLED; ASSERT((sl->sl_flags & SL_UNMAP_ENABLED) == 0); + return (B_FALSE); /* No UNMAP for you. */ + } ! if (enable) ! sl->sl_flags |= (SL_UNMAP_ENABLED | SL_SAVED_UNMAP_ENABLED); ! else ! sl->sl_flags &= ~(SL_UNMAP_ENABLED | SL_SAVED_UNMAP_ENABLED); ! return (B_TRUE); } int sbd_populate_and_register_lu(sbd_lu_t *sl, uint32_t *err_ret) { stmf_lu_t *lu = sl->sl_lu; stmf_status_t ret; ! #if 0 ! /* Always try and enable UNMAP upon bringup. */ ! (void) do_unmap_setup(sl, B_TRUE); ! #endif lu->lu_id = (scsi_devid_desc_t *)sl->sl_device_id; if (sl->sl_alias) { lu->lu_alias = sl->sl_alias; } else {
*** 1833,1842 **** --- 1846,1860 ---- sl->sl_flags |= SL_REV_VALID; } if (slu->slu_write_protected) { sl->sl_flags |= SL_WRITE_PROTECTED; } + + if (slu->slu_unmap) { + (void) do_unmap_setup(sl, B_TRUE); + } + if (slu->slu_writeback_cache_disable) { sl->sl_flags |= SL_WRITEBACK_CACHE_DISABLE | SL_SAVED_WRITE_CACHE_DISABLE; }
*** 2475,2484 **** --- 2493,2505 ---- sli->sli_mgmt_url_offset); } if (sli->sli_flags & SLI_WRITE_PROTECTED) { sl->sl_flags |= SL_WRITE_PROTECTED; } + if (sli->sli_flags & SLI_UNMAP_ENABLED) { + sl->sl_flags |= SL_UNMAP_ENABLED; + } if (sli->sli_flags & SLI_VID_VALID) { sl->sl_flags |= SL_VID_VALID; bcopy(sli->sli_vid, sl->sl_vendor_id, 8); } if (sli->sli_flags & SLI_PID_VALID) {
*** 2695,2704 **** --- 2716,2736 ---- *err_ret = SBD_RET_ACCESS_STATE_FAILED; ret = EINVAL; goto smm_err_out; } + /* Change UNMAP status... */ + if (mlu->mlu_unmap_valid) { + mutex_enter(&sl->sl_lock); + ASSERT(ret == 0); + if (!do_unmap_setup(sl, mlu->mlu_unmap)) + ret = EINVAL; + mutex_exit(&sl->sl_lock); + if (ret != 0) + goto smm_err_out; + } + /* check for write cache change */ if (mlu->mlu_writeback_cache_disable_valid) { /* set wce on device */ sret = sbd_wcd_set(mlu->mlu_writeback_cache_disable, sl); if (!mlu->mlu_writeback_cache_disable && sret != SBD_SUCCESS) {
*** 3329,3338 **** --- 3361,3374 ---- } else { bcopy(sbd_revision, oslp->slp_rev, 4); } bcopy(sl->sl_device_id + 4, oslp->slp_guid, 16); + if (sl->sl_flags & SL_UNMAP_ENABLED) + oslp->slp_unmap_cur = 1; + if (sl->sl_flags & SL_SAVED_UNMAP_ENABLED) + oslp->slp_unmap_saved = 1; if (sl->sl_flags & SL_WRITEBACK_CACHE_DISABLE) oslp->slp_writeback_cache_disable_cur = 1; if (sl->sl_flags & SL_SAVED_WRITE_CACHE_DISABLE) oslp->slp_writeback_cache_disable_saved = 1; if (sl->sl_flags & SL_WRITE_PROTECTED)