Re: [PATCH] mpathpersistent: segment faulty occured in mpath_persistent_reserve_in()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Hannes,

Since this issue is introduced by RCU, can you have a review for this patch?

Thanks,
Tang





发件人:         tang.wenji@xxxxxxxxxx
收件人:         christophe varoqui <christophe.varoqui@xxxxxxx>,
抄送:        zhang.kai16@xxxxxxxxxx, dm-devel@xxxxxxxxxx, tang.junhui@xxxxxxxxxx, tang.wenji@xxxxxxxxxx
日期:         2016/10/27 17:08
主题:        [dm-devel] [PATCH] mpathpersistent: segment faulty occured in        mpath_persistent_reserve_in()
发件人:        dm-devel-bounces@xxxxxxxxxx




From: 10111224 <tang.wenji@xxxxxxxxxx>

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@xxxxxxxxxx>
---
libmpathpersist/mpath_persist.c | 21 +++++++++++++++++++--
libmpathpersist/mpathpr.h       |  4 ----
2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
index 7501651..582d4ef 100644
--- a/libmpathpersist/mpath_persist.c
+++ b/libmpathpersist/mpath_persist.c
@@ -78,6 +78,7 @@ updatepaths (struct multipath * mpp)
                 int i, j;
                 struct pathgroup * pgp;
                 struct path * pp;
+                 struct config *conf;

                 if (!mpp->pg)
                                  return 0;
@@ -97,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;
@@ -159,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);
@@ -252,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);
@@ -320,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 cd58201..e6c2ded 100644
--- a/libmpathpersist/mpathpr.h
+++ b/libmpathpersist/mpathpr.h
@@ -25,10 +25,6 @@ struct threadinfo {
                 struct prout_param param;
};

-
-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@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/dm-devel

--
dm-devel mailing list
dm-devel@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/dm-devel

[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux