[dm-devel] [PATCH] libmultipath: fix multipath -q command logic
tang.junhui at zte.com.cn
tang.junhui at zte.com.cn
Tue Oct 11 09:17:36 UTC 2016
Hello Hannes, Ben,
Could you have a review for this patch, any comment will be highly
appreciated.
Thanks,
Tang
发件人: Christophe Varoqui <christophe.varoqui at opensvc.com>
收件人: tang.junhui at zte.com.cn,
抄送: Bart Van Assche <bart.vanassche at sandisk.com>, device-mapper
development <dm-devel at redhat.com>, zhang.kai16 at zte.com.cn
日期: 2016/10/11 14:59
主题: Re: [dm-devel] [PATCH] libmultipath: fix multipath -q command
logic
发件人: dm-devel-bounces at redhat.com
Hannes, Ben,
are you ok with the solution to these two issues.
Seems sane to me.
Thanks,
Christophe
On Tue, Oct 11, 2016 at 8:46 AM, <tang.junhui at zte.com.cn> wrote:
Please have a review for this patch, any comment will be highly
appreciated.
发件人: tang.junhui at zte.com.cn
收件人: christophe varoqui <christophe.varoqui at free.fr>,
抄送: dm-devel at redhat.com, zhang.kai16 at zte.com.cn, "tang.junhui" <
tang.junhui at zte.com.cn>
日期: 2016/08/16 19:33
主题: [PATCH] libmultipath: fix multipath -q command logic
From: "tang.junhui" <tang.junhui at zte.com.cn>
multipath judged whether multipathd service in running by check_daemon()
when executing
mutipath commands, check_daemon() try to connect to the multipathd service
and execute
"show dameon" command. The expected result is that the command will be
failed when the
service is not running, however, mpath_connect() will activate the
multipathd service when
the service is not running, so check_daemon() always return with true.
Another problem is that
multipath command with -q parameter is not processed in coalesce_paths().
This patch fix for
those two problems.
Signed-off-by: tang.junhui <tang.junhui at zte.com.cn>
---
libmultipath/configure.c | 85
+++++++++++++++++++++++++++---------------------
1 file changed, 48 insertions(+), 37 deletions(-)
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index 707e6be..d8a17a6 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -715,36 +715,36 @@ deadmap (struct multipath * mpp)
return 1; /* dead */
}
-int check_daemon(void)
+static int
+check_daemon(void)
{
int fd;
- char *reply;
- int ret = 0;
- unsigned int timeout;
- struct config *conf;
-
- fd = mpath_connect();
- if (fd == -1)
- return 0;
+ struct flock lock;
- if (send_packet(fd, "show daemon") != 0)
- goto out;
- conf = get_multipath_config();
- timeout = conf->uxsock_timeout;
- put_multipath_config(conf);
- if (recv_packet(fd, &reply, timeout) != 0)
- goto out;
-
- if (strstr(reply, "shutdown"))
- goto out_free;
-
- ret = 1;
+ fd = open(DEFAULT_PIDFILE, O_RDONLY);
+ if (fd < 0) {
+ if (errno == ENOENT)
+ return 0;
+ if (errno == EMFILE)
+ condlog(0, "failed to
open file, increase max_fds at %s", DEFAULT_CONFIGFILE);
+ else
+ condlog(0, "can not
open pidfile %s: %s", DEFAULT_PIDFILE, strerror(errno));
+ return -1;
+ }
-out_free:
- FREE(reply);
-out:
- mpath_disconnect(fd);
- return ret;
+ 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, "can not get file locker,
%s: %s", DEFAULT_PIDFILE, strerror(errno));
+ close(fd);
+ return -1;
+ }
+ close(fd);
+ if (lock.l_type == F_UNLCK)
+ return 0;
+ return 1;
}
extern int
@@ -873,17 +873,28 @@ coalesce_paths (struct vectors * vecs, vector newmp,
char * refwwid, int force_r
if (r == DOMAP_DRY)
continue;
- conf = get_multipath_config();
- allow_queueing = conf->allow_queueing;
- put_multipath_config(conf);
- if (!is_daemon && !allow_queueing &&
!check_daemon()) {
- if (mpp->no_path_retry
!= NO_PATH_RETRY_UNDEF &&
- mpp->no_path_retry
!= NO_PATH_RETRY_FAIL)
-
condlog(3, "%s: multipathd not running, unset "
-
"queue_if_no_path feature", mpp->alias);
- if
(!dm_queue_if_no_path(mpp->alias, 0))
-
remove_feature(&mpp->features,
-
"queue_if_no_path");
+ /* run as multipath command and the
service is not running */
+ if (!is_daemon && !check_daemon()) {
+ conf =
get_multipath_config();
+ allow_queueing =
conf->allow_queueing;
+
put_multipath_config(conf);
+ /* no -q choice */
+ if (!allow_queueing) {
+ if
(mpp->no_path_retry != NO_PATH_RETRY_UNDEF &&
+
mpp->no_path_retry != NO_PATH_RETRY_FAIL)
+
condlog(3, "%s: multipathd not running, unset "
+
"queue_if_no_path feature", mpp->alias);
+ if
(!dm_queue_if_no_path(mpp->alias, 0))
+
remove_feature(&mpp->features,
+
"queue_if_no_path");
+ } else { /* with -q
choice */
+ if
(mpp->no_path_retry == NO_PATH_RETRY_UNDEF ||
+
mpp->no_path_retry == NO_PATH_RETRY_FAIL)
+
condlog(3, "%s: multipathd not running, set "
+
"queue_if_no_path feature", mpp->alias);
+ if
(!dm_queue_if_no_path(mpp->alias, 1))
+
add_feature(&mpp->features, "queue_if_no_path");
+ }
}
else if (mpp->no_path_retry !=
NO_PATH_RETRY_UNDEF) {
if (mpp->no_path_retry
== NO_PATH_RETRY_FAIL) {
--
2.8.1.windows.1
--
dm-devel mailing list
dm-devel at redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/dm-devel/attachments/20161011/1e8ecc8c/attachment.htm>
More information about the dm-devel
mailing list