#define ALUA_PRIO_TPGS_FAILED 4
#define ALUA_PRIO_NO_INFORMATION 5
+static const char * aas_string[] = {
+ [AAS_OPTIMIZED] = "active/optimized",
+ [AAS_NON_OPTIMIZED] = "active/non-optimized",
+ [AAS_STANDBY] = "standby",
+ [AAS_UNAVAILABLE] = "unavailable",
+ [AAS_LBA_DEPENDENT] = "lba dependent",
+ [AAS_RESERVED] = "invalid/reserved",
+ [AAS_OFFLINE] = "offline",
+ [AAS_TRANSITIONING] = "transitioning between states",
+};
+
+static const char *aas_print_string(int rc)
+{
+ rc &= 0x7f;
+
+ if (rc & 0x70)
+ return aas_string[AAS_RESERVED];
+ rc &= 0x0f;
+ if (rc > AAS_RESERVED && rc < AAS_OFFLINE)
+ return aas_string[AAS_RESERVED];
+ else
+ return aas_string[rc];
+}
+
int
get_alua_info(int fd)
{
- char * aas_string[] = {
- [AAS_OPTIMIZED] = "active/optimized",
- [AAS_NON_OPTIMIZED] = "active/non-optimized",
- [AAS_STANDBY] = "standby",
- [AAS_UNAVAILABLE] = "unavailable",
- [AAS_TRANSITIONING] = "transitioning between states",
- };
int rc;
int tpg;
int aas;
return -ALUA_PRIO_GETAAS_FAILED;
aas = (rc & 0x0f);
- condlog(3, "aas = [%s]",
- (aas < 4) ? aas_string[aas] : "invalid/reserved");
+ condlog(3, "aas = %02x [%s]%s", rc, aas_print_string(rc),
+ (rc & 0x80) ? " [preferred]" : "");
return rc;
}
case AAS_NON_OPTIMIZED:
rc = 10;
break;
+ case AAS_LBA_DEPENDENT:
+ rc = 5;
+ break;
case AAS_STANDBY:
rc = 1;
break;
#define AAS_NON_OPTIMIZED 0x1
#define AAS_STANDBY 0x2
#define AAS_UNAVAILABLE 0x3
+#define AAS_LBA_DEPENDENT 0x4
+#define AAS_RESERVED 0x5
+#define AAS_OFFLINE 0xe
#define AAS_TRANSITIONING 0xf
#define TPG_STATUS_NONE 0x0
unsigned char b0; /* x....... = pref(ered) port */
/* .xxx.... = reserved */
/* ....xxxx = asymetric access state */
- unsigned char b1; /* xxxx.... = reserved */
+ unsigned char b1; /* xxx..... = reserved */
+ /* ...x.... = LBA dependent support */
/* ....x... = unavailable support */
/* .....x.. = standby support */
/* ......x. = non-optimized support */