md/r5cache: call mddev_lock/unlock() in r5c_journal_mode_show
authorSong Liu <songliubraving@fb.com>
Wed, 9 Aug 2017 05:56:52 +0000 (22:56 -0700)
committerShaohua Li <shli@fb.com>
Fri, 25 Aug 2017 17:21:46 +0000 (10:21 -0700)
In r5c_journal_mode_show(), it is necessary to call mddev_lock()
before accessing conf and conf->log. Otherwise, the conf->log
may change (and become NULL).

Signed-off-by: Song Liu <songliubraving@fb.com>
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/raid5-cache.c

index 2dcbafa8e66ca7f5418fce8434fe9674977f0832..e357ed367140ef04da7e24fe2f55fa217f0fff4e 100644 (file)
@@ -2529,11 +2529,18 @@ static void r5l_write_super(struct r5l_log *log, sector_t cp)
 
 static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)
 {
-       struct r5conf *conf = mddev->private;
+       struct r5conf *conf;
        int ret;
 
-       if (!conf->log)
+       ret = mddev_lock(mddev);
+       if (ret)
+               return ret;
+
+       conf = mddev->private;
+       if (!conf || !conf->log) {
+               mddev_unlock(mddev);
                return 0;
+       }
 
        switch (conf->log->r5c_journal_mode) {
        case R5C_JOURNAL_MODE_WRITE_THROUGH:
@@ -2551,6 +2558,7 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)
        default:
                ret = 0;
        }
+       mddev_unlock(mddev);
        return ret;
 }