[dm-devel] [RFC PATCH 2/4] libmultipath: make prioritizer timeouts work like checker timeouts
Benjamin Marzinski
bmarzins at redhat.com
Fri Jul 28 19:05:53 UTC 2023
Multipath's prioritizers previously didn't use the sysfs timeout for
scsi devices, and used a prioritizer specific default timeout (although
in practice, all the prioritizers except hds used 60 seconds). Now
prioritizers deal with timeouts the same way as the checkers. They first
use checker_time if set, then use the sysfs tiemout for scsi devices, or
30 seconds for non-scsi devices.
Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
---
libmultipath/prio.c | 14 +++++++++-----
libmultipath/prio.h | 3 +--
libmultipath/prioritizers/alua.c | 2 +-
libmultipath/prioritizers/alua_rtpg.c | 5 ++---
libmultipath/prioritizers/emc.c | 5 +++--
libmultipath/prioritizers/hds.c | 4 ++--
libmultipath/prioritizers/hp_sw.c | 4 ++--
libmultipath/prioritizers/ontap.c | 7 +++----
libmultipath/prioritizers/rdac.c | 4 ++--
9 files changed, 25 insertions(+), 23 deletions(-)
diff --git a/libmultipath/prio.c b/libmultipath/prio.c
index cdd37529..69b71578 100644
--- a/libmultipath/prio.c
+++ b/libmultipath/prio.c
@@ -3,20 +3,24 @@
#include <stddef.h>
#include <dlfcn.h>
#include <sys/stat.h>
+#include <libudev.h>
#include "debug.h"
#include "util.h"
#include "prio.h"
+#include "structs.h"
+#include "discovery.h"
static const char * const prio_dir = MULTIPATH_DIR;
static LIST_HEAD(prioritizers);
-unsigned int get_prio_timeout(unsigned int timeout_ms,
- unsigned int default_timeout)
+unsigned int get_prio_timeout(struct path *pp, unsigned int timeout)
{
- if (timeout_ms)
- return timeout_ms;
- return default_timeout;
+ if (timeout)
+ return timeout;
+ timeout = DEF_TIMEOUT;
+ sysfs_get_timeout(pp, &timeout);
+ return timeout * 1000;
}
int init_prio(void)
diff --git a/libmultipath/prio.h b/libmultipath/prio.h
index 184bf65f..20808fd7 100644
--- a/libmultipath/prio.h
+++ b/libmultipath/prio.h
@@ -52,8 +52,7 @@ struct prio {
int (*getprio)(struct path *, char *, unsigned int);
};
-unsigned int get_prio_timeout(unsigned int checker_timeout,
- unsigned int default_timeout);
+unsigned int get_prio_timeout(struct path *pp, unsigned int checker_timeout);
int init_prio(void);
void cleanup_prio (void);
struct prio * add_prio (const char *);
diff --git a/libmultipath/prioritizers/alua.c b/libmultipath/prioritizers/alua.c
index a28bca05..d3ba367f 100644
--- a/libmultipath/prioritizers/alua.c
+++ b/libmultipath/prioritizers/alua.c
@@ -109,7 +109,7 @@ int getprio (struct path * pp, char * args, unsigned int timeout)
return -ALUA_PRIO_NO_INFORMATION;
exclusive_pref = get_exclusive_pref_arg(args);
- rc = get_alua_info(pp, timeout);
+ rc = get_alua_info(pp, get_prio_timeout(pp, timeout));
if (rc >= 0) {
aas = (rc & 0x0f);
priopath = (rc & 0x80);
diff --git a/libmultipath/prioritizers/alua_rtpg.c b/libmultipath/prioritizers/alua_rtpg.c
index 2db91536..49982545 100644
--- a/libmultipath/prioritizers/alua_rtpg.c
+++ b/libmultipath/prioritizers/alua_rtpg.c
@@ -31,7 +31,6 @@
#include "alua_rtpg.h"
#define SENSE_BUFF_LEN 32
-#define SGIO_TIMEOUT 60000
#define PRINT_DEBUG(f, a...) \
condlog(4, "alua: " f, ##a)
@@ -162,7 +161,7 @@ retry:
hdr.dxfer_len = resplen;
hdr.sbp = sense;
hdr.mx_sb_len = sizeof(sense);
- hdr.timeout = get_prio_timeout(timeout, SGIO_TIMEOUT);
+ hdr.timeout = timeout;
if (ioctl(fd, SG_IO, &hdr) < 0) {
PRINT_DEBUG("do_inquiry: IOCTL failed!");
@@ -316,7 +315,7 @@ retry:
hdr.dxfer_len = resplen;
hdr.mx_sb_len = sizeof(sense);
hdr.sbp = sense;
- hdr.timeout = get_prio_timeout(timeout, SGIO_TIMEOUT);
+ hdr.timeout = timeout;
if (ioctl(fd, SG_IO, &hdr) < 0) {
condlog(2, "%s: sg ioctl failed: %s",
diff --git a/libmultipath/prioritizers/emc.c b/libmultipath/prioritizers/emc.c
index 3b63cca0..97fde31b 100644
--- a/libmultipath/prioritizers/emc.c
+++ b/libmultipath/prioritizers/emc.c
@@ -31,7 +31,7 @@ int emc_clariion_prio(const char *dev, int fd, unsigned int timeout)
io_hdr.dxferp = sense_buffer;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sb;
- io_hdr.timeout = get_prio_timeout(timeout, 60000);
+ io_hdr.timeout = timeout;
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_emc_log(0, "sending query command failed");
@@ -84,5 +84,6 @@ out:
int getprio (struct path *pp, __attribute__((unused)) char *args,
unsigned int timeout)
{
- return emc_clariion_prio(pp->dev, pp->fd, timeout);
+ return emc_clariion_prio(pp->dev, pp->fd,
+ get_prio_timeout(pp, timeout));
}
diff --git a/libmultipath/prioritizers/hds.c b/libmultipath/prioritizers/hds.c
index d569f2d7..13f497cc 100644
--- a/libmultipath/prioritizers/hds.c
+++ b/libmultipath/prioritizers/hds.c
@@ -114,7 +114,7 @@ int hds_modular_prio (const char *dev, int fd, unsigned int timeout)
io_hdr.dxferp = inqBuff;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sense_buffer;
- io_hdr.timeout = get_prio_timeout(timeout, 2000); /* TimeOut = 2 seconds */
+ io_hdr.timeout = timeout;
if (ioctl (fd, SG_IO, &io_hdr) < 0) {
pp_hds_log(0, "SG_IO error");
@@ -171,5 +171,5 @@ int hds_modular_prio (const char *dev, int fd, unsigned int timeout)
int getprio (struct path * pp, __attribute__((unused)) char *args,
unsigned int timeout)
{
- return hds_modular_prio(pp->dev, pp->fd, timeout);
+ return hds_modular_prio(pp->dev, pp->fd, get_prio_timeout(pp, timeout));
}
diff --git a/libmultipath/prioritizers/hp_sw.c b/libmultipath/prioritizers/hp_sw.c
index 5b85ad2e..b4cbc58f 100644
--- a/libmultipath/prioritizers/hp_sw.c
+++ b/libmultipath/prioritizers/hp_sw.c
@@ -46,7 +46,7 @@ int hp_sw_prio(const char *dev, int fd, unsigned int timeout)
io_hdr.dxfer_direction = SG_DXFER_NONE;
io_hdr.cmdp = turCmdBlk;
io_hdr.sbp = sb;
- io_hdr.timeout = get_prio_timeout(timeout, 60000);
+ io_hdr.timeout = timeout;
io_hdr.pack_id = 0;
retry:
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
@@ -98,5 +98,5 @@ out:
int getprio (struct path *pp, __attribute__((unused)) char *args,
unsigned int timeout)
{
- return hp_sw_prio(pp->dev, pp->fd, timeout);
+ return hp_sw_prio(pp->dev, pp->fd, get_prio_timeout(pp, timeout));
}
diff --git a/libmultipath/prioritizers/ontap.c b/libmultipath/prioritizers/ontap.c
index 262e69d2..b9860974 100644
--- a/libmultipath/prioritizers/ontap.c
+++ b/libmultipath/prioritizers/ontap.c
@@ -28,7 +28,6 @@
#define INQUIRY_CMDLEN 6
#define DEFAULT_PRIOVAL 10
#define RESULTS_MAX 256
-#define SG_TIMEOUT 60000
#define pp_ontap_log(prio, fmt, args...) \
condlog(prio, "%s: ontap prio: " fmt, dev, ##args)
@@ -90,7 +89,7 @@ static int send_gva(const char *dev, int fd, unsigned char pg,
io_hdr.dxferp = results;
io_hdr.cmdp = cdb;
io_hdr.sbp = sb;
- io_hdr.timeout = get_prio_timeout(timeout, SG_TIMEOUT);
+ io_hdr.timeout = timeout;
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_ontap_log(0, "SG_IO ioctl failed, errno=%d", errno);
@@ -142,7 +141,7 @@ static int get_proxy(const char *dev, int fd, unsigned int timeout)
io_hdr.dxferp = results;
io_hdr.cmdp = cdb;
io_hdr.sbp = sb;
- io_hdr.timeout = get_prio_timeout(timeout, SG_TIMEOUT);
+ io_hdr.timeout = timeout;
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_ontap_log(0, "ioctl sending inquiry command failed, "
@@ -244,5 +243,5 @@ prio_select:
int getprio (struct path *pp, __attribute__((unused)) char *args,
unsigned int timeout)
{
- return ontap_prio(pp->dev, pp->fd, timeout);
+ return ontap_prio(pp->dev, pp->fd, get_prio_timeout(pp, timeout));
}
diff --git a/libmultipath/prioritizers/rdac.c b/libmultipath/prioritizers/rdac.c
index 92a2fb85..0faa8155 100644
--- a/libmultipath/prioritizers/rdac.c
+++ b/libmultipath/prioritizers/rdac.c
@@ -31,7 +31,7 @@ int rdac_prio(const char *dev, int fd, unsigned int timeout)
io_hdr.dxferp = sense_buffer;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sb;
- io_hdr.timeout = get_prio_timeout(timeout, 60000);
+ io_hdr.timeout = timeout;
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_rdac_log(0, "sending inquiry command failed");
@@ -94,5 +94,5 @@ out:
int getprio (struct path *pp, __attribute__((unused)) char *args,
unsigned int timeout)
{
- return rdac_prio(pp->dev, pp->fd, timeout);
+ return rdac_prio(pp->dev, pp->fd, get_prio_timeout(pp, timeout));
}
--
2.17.2
More information about the dm-devel
mailing list