From: "tang.wenji" <tang.we...@zte.com.cn> Segment faulty occured when executing "mpathpersist -i -k /dev/mapper/mpath1" command.The reason is that an uninitialized global variable conf is used in mpath_persistent_reserve_in(). The same problem also exists in mpath_persistent_reserve_out().
Signed-off-by: tang.wenji <tang.we...@zte.com.cn> --- libmpathpersist/mpath_persist.c | 22 +++++++++++++++++++--- libmpathpersist/mpathpr.h | 4 ---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c index faea2b7..982c795 100644 --- a/libmpathpersist/mpath_persist.c +++ b/libmpathpersist/mpath_persist.c @@ -35,7 +35,6 @@ #define __STDC_FORMAT_MACROS 1 struct udev *udev; -struct config *conf; struct config * mpath_lib_init (struct udev *udev) @@ -79,6 +78,7 @@ updatepaths (struct multipath * mpp) int i, j; struct pathgroup * pgp; struct path * pp; + struct config *conf; if (!mpp->pg) return 0; @@ -98,16 +98,24 @@ updatepaths (struct multipath * mpp) continue; } pp->mpp = mpp; + conf = get_multipath_config(); pathinfo(pp, conf, DI_ALL); + put_multipath_config(conf); continue; } pp->mpp = mpp; if (pp->state == PATH_UNCHECKED || - pp->state == PATH_WILD) + pp->state == PATH_WILD) { + conf = get_multipath_config(); pathinfo(pp, conf, DI_CHECKER); + put_multipath_config(conf); + } - if (pp->priority == PRIO_UNDEF) + if (pp->priority == PRIO_UNDEF) { + conf = get_multipath_config(); pathinfo(pp, conf, DI_PRIO); + put_multipath_config(conf); + } } } return 0; @@ -160,8 +168,11 @@ int mpath_persistent_reserve_in (int fd, int rq_servact, int map_present; int major, minor; int ret; + struct config *conf; + conf = get_multipath_config(); conf->verbosity = verbose; + put_multipath_config(conf); if (fstat( fd, &info) != 0){ condlog(0, "stat error %d", fd); @@ -253,8 +264,11 @@ int mpath_persistent_reserve_out ( int fd, int rq_servact, int rq_scope, int j; unsigned char *keyp; uint64_t prkey; + struct config *conf; + conf = get_multipath_config(); conf->verbosity = verbose; + put_multipath_config(conf); if (fstat( fd, &info) != 0){ condlog(0, "stat error fd=%d", fd); @@ -321,7 +335,9 @@ int mpath_persistent_reserve_out ( int fd, int rq_servact, int rq_scope, goto out1; } + conf = get_multipath_config(); select_reservation_key(conf, mpp); + put_multipath_config(conf); switch(rq_servact) { diff --git a/libmpathpersist/mpathpr.h b/libmpathpersist/mpathpr.h index 056c547..e6c2ded 100644 --- a/libmpathpersist/mpathpr.h +++ b/libmpathpersist/mpathpr.h @@ -25,10 +25,6 @@ struct threadinfo { struct prout_param param; }; - -extern struct config *conf; - - int prin_do_scsi_ioctl(char * dev, int rq_servact, struct prin_resp * resp, int noisy); int prout_do_scsi_ioctl( char * dev, int rq_servact, int rq_scope, unsigned int rq_type, struct prout_param_descriptor *paramp, int noisy); -- 2.8.1.windows.1 -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel