[dm-devel] [PATCH] move the 'update_multipath_strings()' function up so that mpp->mpe can be assigned in some situation

Xinghai Yu yuxinghai at cn.fujitsu.com
Mon Oct 21 07:20:25 UTC 2013


This patch is correcting a bug about multipath's no_path_retry attribute.
When the multipath was just created by user cmd 'multipath', the DM driver 
doesn't know the wwid of this dm device, so the 'set_multipath_wwid()'
function can't get the wwid for mpp at this time, then the mpp->mpe can't befind and assigned by wwid also. In that case, the following function 
'set_no_path_retry()' can't able to use the value provided by mpp->mpe 
which values were getted from file '/etc/multipath.conf'. But the fuction 
'update_multipath_strings()' can assign the wwid to mpp from its path, so
move this function up to solve this problem.

Bug reproduce steps:
1.First, by setting 'no_path_retry fail', we have features='0'.
[root at localhost multipath-tools]# cat /etc/multipath.conf
...
	multipath {
		wwid 36000b5d0006a0000006a14e7000b0000
		alias                   yellow
		path_grouping_policy    failover
		no_path_retry		fail
	}
...
[root at localhost multipath-tools]# multipath -ll
yellow (36000b5d0006a0000006a14e7000b0000) dm-0    
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=130 status=active
| `- 0:0:0:0 sda 8:0    active ready running
`-+- policy='service-time 0' prio=130 status=enabled
  `- 1:0:0:0 sdc 8:32   active ready running
[root at localhost multipath-tools]# 

2.Second, we flush all multipath device maps.
[root at localhost multipath-tools]# multipath -F
[root at localhost multipath-tools]# 

3.Third, create all multipath device maps.
[root at localhost multipath-tools]# multipath 
create: yellow (36000b5d0006a0000006a14e7000b0000) undef    
size=50G features='0' hwhandler='0' wp=undef
|-+- policy='service-time 0' prio=130 status=undef
| `- 0:0:0:0 sda 8:0    undef ready running
`-+- policy='service-time 0' prio=130 status=undef
  `- 1:0:0:0 sdc 8:32   undef ready running
[root at localhost multipath-tools]# 

4.The end, we found "features='1 queue_if_no_path'" and this is not what we 
expect, it's a bug. After applying this patch, it can be corrected.
[root at localhost multipath-tools]# multipath -ll
yellow (36000b5d0006a0000006a14e7000b0000) dm-0    
size=50G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=130 status=active
| `- 0:0:0:0 sda 8:0    active ready running
`-+- policy='service-time 0' prio=130 status=enabled
  `- 1:0:0:0 sdc 8:32   active ready running
[root at localhost multipath-tools]# 


Signed-off-by: Xinghai Yu <yuxinghai at cn.fujitsu.com>
---
 libmultipath/structs_vec.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index 7073915..bb2c71a 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -344,15 +344,15 @@ __setup_multipath (struct vectors * vecs, struct multipath * mpp, int reset)
 		goto out;
 	}
 
-	set_multipath_wwid(mpp);
-	mpp->mpe = find_mpe(mpp->wwid);
-	condlog(3, "%s: discover", mpp->alias);
-
 	if (update_multipath_strings(mpp, vecs->pathvec)) {
 		condlog(0, "%s: failed to setup multipath", mpp->alias);
 		goto out;
 	}
 
+	set_multipath_wwid(mpp);
+	mpp->mpe = find_mpe(mpp->wwid);
+	condlog(3, "%s: discover", mpp->alias);
+
 	if (!mpp->hwe)
 		mpp->hwe = extract_hwe_from_path(mpp);
 	if (!mpp->hwe) {
-- 
1.7.1




More information about the dm-devel mailing list