Print this page
1845 allow disable of UNMAP via stmfadm(1M).
@@ -1351,10 +1351,13 @@
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,30 +1390,40 @@
kmem_free(sli, sizeof (*sli) + s);
return (ret);
}
/*
- * Will scribble SL_UNMAP_ENABLED into sl_flags if we succeed.
+ * Will scribble SL_UNMAP_ENABLED on or off in sl_flags if we succeed.
+ * Returns B_TRUE if the LU is UNMAP-capable.
*/
-static void
-do_unmap_setup(sbd_lu_t *sl)
+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 ((sl->sl_flags & SL_ZFS_META) == 0)
- return; /* 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);
- sl->sl_flags |= SL_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;
- do_unmap_setup(sl);
+#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,10 +1846,15 @@
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,10 +2493,13 @@
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,10 +2716,21 @@
*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,10 +3361,14 @@
} 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)