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

@@ -78,11 +78,11 @@
 static void printLuProps(stmfLogicalUnitProperties *luProps);
 static int printExtLuProps(stmfGuid *guid);
 static void printGuid(stmfGuid *guid, FILE *printWhere);
 static void printTargetProps(stmfTargetProperties *);
 static void printSessionProps(stmfSessionList *);
-static int setLuPropFromInput(luResource, char *);
+static int setLuPropFromInput(luResource, char *, uint32_t *);
 static int convertCharToPropId(char *, uint32_t *);
 
 
 
 /*

@@ -128,19 +128,21 @@
 #define COMPANY_ID                  "OUI"
 #define BLOCK_SIZE                  "BLK"
 #define SERIAL_NUMBER               "SERIAL"
 #define MGMT_URL                    "MGMT-URL"
 #define HOST_ID                     "HOST-ID"
+#define UNMAP                       "UNMAP"
 
 #define STMFADM_SUCCESS             0
 #define STMFADM_FAILURE             1
 
 #define MODIFY_HELP "\n"\
 "Description: Modify properties of a logical unit. \n" \
 "Valid properties for -p, --lu-prop are: \n" \
 "     alias    - alias for logical unit (up to 255 chars)\n" \
 "     mgmt-url - Management URL address\n" \
+"     unmap    - iSCSI UNMAP enabled (true, false)\n" \
 "     wcd      - write cache disabled (true, false)\n" \
 "     wp       - write protect (true, false)\n\n" \
 "-f alters the meaning of the operand to be a file name\n" \
 "rather than a LU name. This allows for modification\n" \
 "of a logical unit that is not yet imported into stmf\n"

@@ -157,10 +159,11 @@
 "     mgmt-url - Management URL address\n" \
 "     oui      - organizational unique identifier\n" \
 "                6 ascii hex characters of valid format\n" \
 "     pid      - product identifier (up to 16 chars)\n" \
 "     serial   - serial number (up to 252 chars)\n" \
+"     unmap    - iSCSI UNMAP enabled (true, false)\n" \
 "     vid      - vendor identifier (up to 8 chars)\n" \
 "     wcd      - write cache disabled (true, false)\n" \
 "     wp       - write protect (true, false)\n"
 #define ADD_VIEW_HELP "\n"\
 "Description: Add a view entry to a logical unit. \n" \

@@ -812,10 +815,12 @@
         luResource hdl = NULL;
         int ret = 0;
         int stmfRet = 0;
         char guidAsciiBuf[33];
         stmfGuid createdGuid;
+        uint32_t propid;
+        boolean_t unmap_not_set = B_TRUE;
 
         stmfRet = stmfCreateLuResource(STMF_DISK, &hdl);
 
         if (stmfRet != STMF_STATUS_SUCCESS) {
                 (void) fprintf(stderr, "%s: %s\n",

@@ -824,11 +829,14 @@
         }
 
         for (; options->optval; options++) {
                 switch (options->optval) {
                         case 'p':
-                                ret = setLuPropFromInput(hdl, options->optarg);
+                                ret = setLuPropFromInput(hdl, options->optarg,
+                                    &propid);
+                                if (propid == STMF_LU_PROP_UNMAP)
+                                        unmap_not_set = B_FALSE;
                                 if (ret != 0) {
                                         (void) stmfFreeLuResource(hdl);
                                         return (1);
                                 }
                                 break;

@@ -849,10 +857,23 @@
                                     gettext("unknown option"));
                                 return (1);
                 }
         }
 
+        if (unmap_not_set) {
+                /*
+                 * We "enable" unmap by default, but STMF is hostile toward
+                 * enable-by-default, so we enable it here if it hasn't
+                 * already been set.
+                 */
+                if (stmfSetLuProp(hdl, STMF_LU_PROP_UNMAP, "true") !=
+                    STMF_STATUS_SUCCESS) {
+                        fprintf(stderr, "%s: %s\n", cmdName,
+                            gettext("Problems setting UNMAP default"));
+                }
+        }
+
         stmfRet = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]);
 
         if (stmfRet != STMF_STATUS_SUCCESS) {
                 (void) fprintf(stderr, "%s: %s\n",
                     cmdName, gettext("could not set filename"));

@@ -1231,16 +1252,15 @@
 done:
         return (ret);
 }
 
 static int
-setLuPropFromInput(luResource hdl, char *optarg)
+setLuPropFromInput(luResource hdl, char *optarg, uint32_t *propId)
 {
         char *prop = NULL;
         char *propVal = NULL;
         char *lasts = NULL;
-        uint32_t propId;
         int ret = 0;
 
         prop = strtok_r(optarg, "=", &lasts);
         if ((propVal = strtok_r(NULL, "=", &lasts)) == NULL) {
                 (void) fprintf(stderr, "%s: %s: %s\n",

@@ -1247,18 +1267,18 @@
                     cmdName, optarg,
                     gettext("invalid property specifier - prop=val\n"));
                 return (1);
         }
 
-        ret = convertCharToPropId(prop, &propId);
+        ret = convertCharToPropId(prop, propId);
         if (ret != 0) {
                 (void) fprintf(stderr, "%s: %s: %s\n",
                     cmdName, gettext("invalid property specified"), prop);
                 return (1);
         }
 
-        ret = stmfSetLuProp(hdl, propId, propVal);
+        ret = stmfSetLuProp(hdl, *propId, propVal);
         if (ret != STMF_STATUS_SUCCESS) {
                 (void) fprintf(stderr, "%s: %s %s: ",
                     cmdName, gettext("unable to set"), prop);
                 switch (ret) {
                         case STMF_ERROR_INVALID_PROPSIZE:

@@ -1302,10 +1322,12 @@
                 *propId = STMF_LU_PROP_META_FILENAME;
         } else if (strcasecmp(prop, MGMT_URL) == 0) {
                 *propId = STMF_LU_PROP_MGMT_URL;
         } else if (strcasecmp(prop, HOST_ID) == 0) {
                 *propId = STMF_LU_PROP_HOST_ID;
+        } else if (strcasecmp(prop, UNMAP) == 0) {
+                *propId = STMF_LU_PROP_UNMAP;
         } else {
                 return (1);
         }
         return (0);
 }

@@ -2216,10 +2238,25 @@
         if (stmfRet == STMF_STATUS_SUCCESS) {
                 (void) printf("%s\n",
                     strcasecmp(propVal, "true") ? "Enabled" : "Disabled");
         } else if (stmfRet == STMF_ERROR_NO_PROP) {
                 (void) printf("not set\n");
+        } else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
+                (void) printf("prop unavailable in standby\n");
+        } else {
+                (void) printf("<error retrieving property>\n");
+                ret++;
+        }
+
+        stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_UNMAP, propVal,
+            &propValSize);
+        (void) printf(PROPS_FORMAT, "UNMAP support");
+        if (stmfRet == STMF_STATUS_SUCCESS) {
+                (void) printf("%s\n", (strcasecmp(propVal, "true") == 0) ?
+                    "Enabled" : "Disabled");
+        } else if (stmfRet == STMF_ERROR_NO_PROP) {
+                (void) printf("not set\n");
         } else if (stmfRet == STMF_ERROR_NO_PROP_STANDBY) {
                 (void) printf("prop unavailable in standby\n");
         } else {
                 (void) printf("<error retrieving property>\n");
                 ret++;