/* * sysfs.c * * Copyright(c) 2016 Hannes Reinecke, SUSE Linux GmbH */ #include #include "structs.h" #include "discovery.h" #include "prio.h" static const struct { unsigned char value; char *name; } sysfs_access_state_map[] = { { 50, "active/optimized" }, { 10, "active/non-optimized" }, { 5, "lba-dependent" }, { 1, "standby" }, }; int get_exclusive_pref_arg(char *args) { char *ptr; if (args == NULL) return 0; ptr = strstr(args, "exclusive_pref_bit"); if (!ptr) return 0; if (ptr[18] != '\0' && ptr[18] != ' ' && ptr[18] != '\t') return 0; if (ptr != args && ptr[-1] != ' ' && ptr[-1] != '\t') return 0; return 1; } int getprio (struct path * pp, char *args, __attribute__((unused)) unsigned int timeout) { int prio = 0, rc, i; char buff[512]; int exclusive_pref; exclusive_pref = get_exclusive_pref_arg(args); rc = sysfs_get_asymmetric_access_state(pp, buff, 512); if (rc < 0) return PRIO_UNDEF; prio = 0; for (i = 0; i < 4; i++) { if (!strncmp(buff, sysfs_access_state_map[i].name, strlen(sysfs_access_state_map[i].name))) { prio = sysfs_access_state_map[i].value; break; } } if (rc > 0 && (prio != 50 || exclusive_pref)) prio += 80; return prio; }