[dm-devel] [PATCH] mpathpersistent: segment faulty occured in mpath_persistent_reserve_in()

Christophe Varoqui christophe.varoqui at opensvc.com
Sun Nov 20 09:13:09 UTC 2016


Applied,
thanks.

On Mon, Nov 7, 2016 at 7:35 AM, <tang.wenji at zte.com.cn> wrote:

> From: "tang.wenji" <tang.wenji at 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.wenji at 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
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/dm-devel/attachments/20161120/815d8b79/attachment.htm>


More information about the dm-devel mailing list