--- 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 */