136 lines
4.2 KiB
Diff
136 lines
4.2 KiB
Diff
|
---
|
||
|
libmultipath/config.h | 1 +
|
||
|
libmultipath/configure.c | 6 +++++-
|
||
|
libmultipath/file.c | 32 ++++++++++++++++++++++++++++++++
|
||
|
libmultipath/file.h | 1 +
|
||
|
multipath/main.c | 8 ++++++--
|
||
|
5 files changed, 45 insertions(+), 3 deletions(-)
|
||
|
|
||
|
Index: multipath-tools/libmultipath/config.h
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/libmultipath/config.h
|
||
|
+++ multipath-tools/libmultipath/config.h
|
||
|
@@ -87,6 +87,7 @@ struct config {
|
||
|
int fast_io_fail;
|
||
|
unsigned int dev_loss;
|
||
|
int find_multipaths;
|
||
|
+ int allow_queueing;
|
||
|
uid_t uid;
|
||
|
gid_t gid;
|
||
|
mode_t mode;
|
||
|
Index: multipath-tools/libmultipath/configure.c
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/libmultipath/configure.c
|
||
|
+++ multipath-tools/libmultipath/configure.c
|
||
|
@@ -36,6 +36,7 @@
|
||
|
#include "prio.h"
|
||
|
#include "util.h"
|
||
|
#include "finder.h"
|
||
|
+#include "file.h"
|
||
|
|
||
|
extern int
|
||
|
setup_map (struct multipath * mpp)
|
||
|
@@ -567,7 +568,10 @@ coalesce_paths (struct vectors * vecs, v
|
||
|
if (r == DOMAP_DRY)
|
||
|
continue;
|
||
|
|
||
|
- if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
|
||
|
+ if (!conf->daemon && !conf->allow_queueing &&
|
||
|
+ !pidfile_check(DEFAULT_PIDFILE))
|
||
|
+ dm_queue_if_no_path(mpp->alias, 0);
|
||
|
+ else if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF) {
|
||
|
if (mpp->no_path_retry == NO_PATH_RETRY_FAIL)
|
||
|
dm_queue_if_no_path(mpp->alias, 0);
|
||
|
else
|
||
|
Index: multipath-tools/multipath/main.c
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/multipath/main.c
|
||
|
+++ multipath-tools/multipath/main.c
|
||
|
@@ -80,7 +80,7 @@ usage (char * progname)
|
||
|
{
|
||
|
fprintf (stderr, VERSION_STRING);
|
||
|
fprintf (stderr, "Usage:\n");
|
||
|
- fprintf (stderr, " %s [-c] [-d] [-r] [-v lvl] [-p pol] [-b fil] [dev]\n", progname);
|
||
|
+ fprintf (stderr, " %s [-c] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
|
||
|
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
|
||
|
fprintf (stderr, " %s -F [-v lvl]\n", progname);
|
||
|
fprintf (stderr, " %s -h\n", progname);
|
||
|
@@ -93,6 +93,7 @@ usage (char * progname)
|
||
|
" -f flush a multipath device map\n" \
|
||
|
" -F flush all multipath device maps\n" \
|
||
|
" -c check if a device should be a path in a multipath device\n" \
|
||
|
+ " -q allow queue_if_no_path when multipathd is not running\n"\
|
||
|
" -d dry run, do not create or update devmaps\n" \
|
||
|
" -r force devmap reload\n" \
|
||
|
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
|
||
|
@@ -362,7 +363,7 @@ main (int argc, char *argv[])
|
||
|
condlog(0, "multipath tools need sysfs mounted");
|
||
|
exit(1);
|
||
|
}
|
||
|
- while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:r")) != EOF ) {
|
||
|
+ while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:rq")) != EOF ) {
|
||
|
switch(arg) {
|
||
|
case 1: printf("optarg : %s\n",optarg);
|
||
|
break;
|
||
|
@@ -379,6 +380,9 @@ main (int argc, char *argv[])
|
||
|
case 'c':
|
||
|
conf->dry_run = 2;
|
||
|
break;
|
||
|
+ case 'q':
|
||
|
+ conf->allow_queueing = 1;
|
||
|
+ break;
|
||
|
case 'd':
|
||
|
if (!conf->dry_run)
|
||
|
conf->dry_run = 1;
|
||
|
Index: multipath-tools/libmultipath/file.c
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/libmultipath/file.c
|
||
|
+++ multipath-tools/libmultipath/file.c
|
||
|
@@ -176,3 +176,35 @@ fail:
|
||
|
close(fd);
|
||
|
return -1;
|
||
|
}
|
||
|
+
|
||
|
+int pidfile_check(const char *file)
|
||
|
+{
|
||
|
+ int fd;
|
||
|
+ struct flock lock;
|
||
|
+
|
||
|
+ fd = open(file, O_RDONLY);
|
||
|
+ if (fd < 0) {
|
||
|
+ if (errno == ENOENT)
|
||
|
+ return 0;
|
||
|
+ condlog(0, "Cannot open pidfile, %s : %s", file,
|
||
|
+ strerror(errno));
|
||
|
+ return -1;
|
||
|
+ }
|
||
|
+ lock.l_type = F_WRLCK;
|
||
|
+ lock.l_start = 0;
|
||
|
+ lock.l_whence = SEEK_SET;
|
||
|
+ lock.l_len = 0;
|
||
|
+
|
||
|
+ if (fcntl(fd, F_GETLK, &lock) < 0) {
|
||
|
+ condlog(0, "Cannot check lock on pidfile, %s : %s", file,
|
||
|
+ strerror(errno));
|
||
|
+ return -1;
|
||
|
+ }
|
||
|
+ close(fd);
|
||
|
+ if (lock.l_type == F_UNLCK)
|
||
|
+ return 0;
|
||
|
+ return 1;
|
||
|
+}
|
||
|
+
|
||
|
+
|
||
|
+
|
||
|
Index: multipath-tools/libmultipath/file.h
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/libmultipath/file.h
|
||
|
+++ multipath-tools/libmultipath/file.h
|
||
|
@@ -7,5 +7,6 @@
|
||
|
|
||
|
#define FILE_TIMEOUT 30
|
||
|
int open_file(char *file, int *can_write, char *header);
|
||
|
+int pidfile_check(const char *file);
|
||
|
|
||
|
#endif /* _FILE_H */
|