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

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c
          +++ new/usr/src/uts/common/io/comstar/lu/stmf_sbd/sbd.c
↓ open down ↓ 1345 lines elided ↑ open up ↑
1346 1346                      (uintptr_t)p - (uintptr_t)sli->sli_buf;
1347 1347                  sli->sli_flags |= SLI_MGMT_URL_VALID;
1348 1348                  p += strlen(sl->sl_mgmt_url) + 1;
1349 1349          }
1350 1350          if (sl->sl_flags & SL_WRITE_PROTECTED) {
1351 1351                  sli->sli_flags |= SLI_WRITE_PROTECTED;
1352 1352          }
1353 1353          if (sl->sl_flags & SL_SAVED_WRITE_CACHE_DISABLE) {
1354 1354                  sli->sli_flags |= SLI_WRITEBACK_CACHE_DISABLE;
1355 1355          }
     1356 +        if (sl->sl_flags & SL_SAVED_UNMAP_ENABLED) {
     1357 +                sli->sli_flags |= SLI_UNMAP_ENABLED;
     1358 +        }
1356 1359          if (sl->sl_flags & SL_VID_VALID) {
1357 1360                  bcopy(sl->sl_vendor_id, sli->sli_vid, 8);
1358 1361                  sli->sli_flags |= SLI_VID_VALID;
1359 1362          }
1360 1363          if (sl->sl_flags & SL_PID_VALID) {
1361 1364                  bcopy(sl->sl_product_id, sli->sli_pid, 16);
1362 1365                  sli->sli_flags |= SLI_PID_VALID;
1363 1366          }
1364 1367          if (sl->sl_flags & SL_REV_VALID) {
1365 1368                  bcopy(sl->sl_revision, sli->sli_rev, 4);
↓ open down ↓ 16 lines elided ↑ open up ↑
1382 1385          sli->sli_sms_header.sms_id = SMS_ID_LU_INFO_1_1;
1383 1386          sli->sli_sms_header.sms_data_order = SMS_DATA_ORDER;
1384 1387  
1385 1388          mutex_exit(&sl->sl_lock);
1386 1389          ret = sbd_write_meta_section(sl, (sm_section_hdr_t *)sli);
1387 1390          kmem_free(sli, sizeof (*sli) + s);
1388 1391          return (ret);
1389 1392  }
1390 1393  
1391 1394  /*
1392      - * Will scribble SL_UNMAP_ENABLED into sl_flags if we succeed.
     1395 + * Will scribble SL_UNMAP_ENABLED on or off in sl_flags if we succeed.
     1396 + * Returns B_TRUE if the LU is UNMAP-capable.
1393 1397   */
1394      -static void
1395      -do_unmap_setup(sbd_lu_t *sl)
     1398 +static boolean_t
     1399 +do_unmap_setup(sbd_lu_t *sl, boolean_t enable)
1396 1400  {
1397      -        ASSERT((sl->sl_flags & SL_UNMAP_ENABLED) == 0);
     1401 +        if ((sl->sl_flags & SL_ZFS_META) == 0) {
     1402 +                sl->sl_flags &= ~SL_SAVED_UNMAP_ENABLED;
     1403 +                ASSERT((sl->sl_flags & SL_UNMAP_ENABLED) == 0);
     1404 +                return (B_FALSE);       /* No UNMAP for you. */
     1405 +        }
1398 1406  
1399      -        if ((sl->sl_flags & SL_ZFS_META) == 0)
1400      -                return; /* No UNMAP for you. */
     1407 +        if (enable)
     1408 +                sl->sl_flags |= (SL_UNMAP_ENABLED | SL_SAVED_UNMAP_ENABLED);
     1409 +        else
     1410 +                sl->sl_flags &= ~(SL_UNMAP_ENABLED | SL_SAVED_UNMAP_ENABLED);
1401 1411  
1402      -        sl->sl_flags |= SL_UNMAP_ENABLED;
     1412 +        return (B_TRUE);
1403 1413  }
1404 1414  
1405 1415  int
1406 1416  sbd_populate_and_register_lu(sbd_lu_t *sl, uint32_t *err_ret)
1407 1417  {
1408 1418          stmf_lu_t *lu = sl->sl_lu;
1409 1419          stmf_status_t ret;
1410 1420  
1411      -        do_unmap_setup(sl);
     1421 +#if 0
     1422 +        /* Always try and enable UNMAP upon bringup. */
     1423 +        (void) do_unmap_setup(sl, B_TRUE);
     1424 +#endif
1412 1425  
1413 1426          lu->lu_id = (scsi_devid_desc_t *)sl->sl_device_id;
1414 1427          if (sl->sl_alias) {
1415 1428                  lu->lu_alias = sl->sl_alias;
1416 1429          } else {
1417 1430                  lu->lu_alias = sl->sl_name;
1418 1431          }
1419 1432          if (sl->sl_access_state == SBD_LU_STANDBY) {
1420 1433                  /* call set access state */
1421 1434                  ret = stmf_set_lu_access(lu, STMF_LU_STANDBY);
↓ open down ↓ 406 lines elided ↑ open up ↑
1828 1841                  bcopy(slu->slu_pid, sl->sl_product_id, 16);
1829 1842                  sl->sl_flags |= SL_PID_VALID;
1830 1843          }
1831 1844          if (slu->slu_rev_valid) {
1832 1845                  bcopy(slu->slu_rev, sl->sl_revision, 4);
1833 1846                  sl->sl_flags |= SL_REV_VALID;
1834 1847          }
1835 1848          if (slu->slu_write_protected) {
1836 1849                  sl->sl_flags |= SL_WRITE_PROTECTED;
1837 1850          }
     1851 +
     1852 +        if (slu->slu_unmap) {
     1853 +                (void) do_unmap_setup(sl, B_TRUE);
     1854 +        }
     1855 +
1838 1856          if (slu->slu_writeback_cache_disable) {
1839 1857                  sl->sl_flags |= SL_WRITEBACK_CACHE_DISABLE |
1840 1858                      SL_SAVED_WRITE_CACHE_DISABLE;
1841 1859          }
1842 1860  
1843 1861          if (slu->slu_blksize_valid) {
1844 1862                  if ((slu->slu_blksize & (slu->slu_blksize - 1)) ||
1845 1863                      (slu->slu_blksize > (32 * 1024)) ||
1846 1864                      (slu->slu_blksize == 0)) {
1847 1865                          *err_ret = SBD_RET_INVALID_BLKSIZE;
↓ open down ↓ 622 lines elided ↑ open up ↑
2470 2488                  sl->sl_mgmt_url_alloc_size = strlen((char *)sli_buf_copy +
2471 2489                      sli->sli_mgmt_url_offset) + 1;
2472 2490                  sl->sl_mgmt_url = kmem_alloc(sl->sl_mgmt_url_alloc_size,
2473 2491                      KM_SLEEP);
2474 2492                  (void) strcpy(sl->sl_mgmt_url, (char *)sli_buf_copy +
2475 2493                      sli->sli_mgmt_url_offset);
2476 2494          }
2477 2495          if (sli->sli_flags & SLI_WRITE_PROTECTED) {
2478 2496                  sl->sl_flags |= SL_WRITE_PROTECTED;
2479 2497          }
     2498 +        if (sli->sli_flags & SLI_UNMAP_ENABLED) {
     2499 +                sl->sl_flags |= SL_UNMAP_ENABLED;
     2500 +        }
2480 2501          if (sli->sli_flags & SLI_VID_VALID) {
2481 2502                  sl->sl_flags |= SL_VID_VALID;
2482 2503                  bcopy(sli->sli_vid, sl->sl_vendor_id, 8);
2483 2504          }
2484 2505          if (sli->sli_flags & SLI_PID_VALID) {
2485 2506                  sl->sl_flags |= SL_PID_VALID;
2486 2507                  bcopy(sli->sli_pid, sl->sl_product_id, 16);
2487 2508          }
2488 2509          if (sli->sli_flags & SLI_REV_VALID) {
2489 2510                  sl->sl_flags |= SL_REV_VALID;
↓ open down ↓ 200 lines elided ↑ open up ↑
2690 2711                  }
2691 2712                  modify_unregistered = 1;
2692 2713          }
2693 2714  
2694 2715          if (sl->sl_access_state != SBD_LU_ACTIVE) {
2695 2716                  *err_ret = SBD_RET_ACCESS_STATE_FAILED;
2696 2717                  ret = EINVAL;
2697 2718                  goto smm_err_out;
2698 2719          }
2699 2720  
     2721 +        /* Change UNMAP status... */
     2722 +        if (mlu->mlu_unmap_valid) {
     2723 +                mutex_enter(&sl->sl_lock);
     2724 +                ASSERT(ret == 0);
     2725 +                if (!do_unmap_setup(sl, mlu->mlu_unmap))
     2726 +                        ret = EINVAL;
     2727 +                mutex_exit(&sl->sl_lock);
     2728 +                if (ret != 0)
     2729 +                        goto smm_err_out;
     2730 +        }
     2731 +
2700 2732          /* check for write cache change */
2701 2733          if (mlu->mlu_writeback_cache_disable_valid) {
2702 2734                  /* set wce on device */
2703 2735                  sret = sbd_wcd_set(mlu->mlu_writeback_cache_disable, sl);
2704 2736                  if (!mlu->mlu_writeback_cache_disable && sret != SBD_SUCCESS) {
2705 2737                          *err_ret = SBD_RET_WRITE_CACHE_SET_FAILED;
2706 2738                          ret = EFAULT;
2707 2739                          goto smm_err_out;
2708 2740                  }
2709 2741                  mutex_enter(&sl->sl_lock);
↓ open down ↓ 614 lines elided ↑ open up ↑
3324 3356                  bcopy(sbd_product_id, oslp->slp_pid, 16);
3325 3357          }
3326 3358          if (sl->sl_flags & SL_REV_VALID) {
3327 3359                  oslp->slp_lu_rev = 1;
3328 3360                  bcopy(sl->sl_revision, oslp->slp_rev, 4);
3329 3361          } else {
3330 3362                  bcopy(sbd_revision, oslp->slp_rev, 4);
3331 3363          }
3332 3364          bcopy(sl->sl_device_id + 4, oslp->slp_guid, 16);
3333 3365  
     3366 +        if (sl->sl_flags & SL_UNMAP_ENABLED)
     3367 +                oslp->slp_unmap_cur = 1;
     3368 +        if (sl->sl_flags & SL_SAVED_UNMAP_ENABLED)
     3369 +                oslp->slp_unmap_saved = 1;
3334 3370          if (sl->sl_flags & SL_WRITEBACK_CACHE_DISABLE)
3335 3371                  oslp->slp_writeback_cache_disable_cur = 1;
3336 3372          if (sl->sl_flags & SL_SAVED_WRITE_CACHE_DISABLE)
3337 3373                  oslp->slp_writeback_cache_disable_saved = 1;
3338 3374          if (sl->sl_flags & SL_WRITE_PROTECTED)
3339 3375                  oslp->slp_write_protected = 1;
3340 3376  
3341 3377          sl->sl_trans_op = SL_OP_NONE;
3342 3378  
3343 3379          rw_exit(&sbd_global_prop_lock);
↓ open down ↓ 387 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX