Whamcloud - gitweb
LU-12566 mdc: hold lock while walking changelog dev list 68/35668/3
authorAndreas Dilger <adilger@whamcloud.com>
Thu, 1 Aug 2019 20:55:58 +0000 (14:55 -0600)
committerOleg Drokin <green@whamcloud.com>
Thu, 15 Aug 2019 07:52:00 +0000 (07:52 +0000)
In mdc_changelog_cdev_finish() we need chlg_registered_dev_lock
while walking and changing entries on the chlog_registered_devs
and ced_obds lists in chlg_registered_dev_find_by_obd().

Move the calling of chlg_registered_dev_find_by_obd() under the
mutex, and add assertions to the places where the lists are walked
and changed that the mutex is held.

Fixes: 1d40214d96dd ("LU-7659 mdc: expose changelog through char devices")
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: Ib62fdff87cde6a4bcfb9bea24a2ea72a933ebbe5
Reviewed-on: https://review.whamcloud.com/35668
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-by: Quentin Bouget <quentin.bouget@cea.fr>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdc/mdc_changelog.c

index fe1ef6e..fe7e1b2 100644 (file)
@@ -645,6 +645,7 @@ chlg_registered_dev_find_by_name(const char *name)
 {
        struct chlg_registered_dev *dit;
 
+       LASSERT(mutex_is_locked(&chlg_registered_dev_lock));
        list_for_each_entry(dit, &chlg_registered_devices, ced_link)
                if (strcmp(name, dit->ced_name) == 0)
                        return dit;
@@ -663,6 +664,7 @@ chlg_registered_dev_find_by_obd(const struct obd_device *obd)
        struct chlg_registered_dev *dit;
        struct obd_device *oit;
 
+       LASSERT(mutex_is_locked(&chlg_registered_dev_lock));
        list_for_each_entry(dit, &chlg_registered_devices, ced_link)
                list_for_each_entry(oit, &dit->ced_obds,
                                    u.cli.cl_chg_dev_linkage)
@@ -738,6 +740,7 @@ static void chlg_dev_clear(struct kref *kref)
                                                      ced_refs);
        ENTRY;
 
+       LASSERT(mutex_is_locked(&chlg_registered_dev_lock));
        list_del(&entry->ced_link);
        misc_deregister(&entry->ced_misc);
        OBD_FREE_PTR(entry);
@@ -749,10 +752,11 @@ static void chlg_dev_clear(struct kref *kref)
  */
 void mdc_changelog_cdev_finish(struct obd_device *obd)
 {
-       struct chlg_registered_dev *dev = chlg_registered_dev_find_by_obd(obd);
-       ENTRY;
+       struct chlg_registered_dev *dev;
 
+       ENTRY;
        mutex_lock(&chlg_registered_dev_lock);
+       dev = chlg_registered_dev_find_by_obd(obd);
        list_del_init(&obd->u.cli.cl_chg_dev_linkage);
        kref_put(&dev->ced_refs, chlg_dev_clear);
        mutex_unlock(&chlg_registered_dev_lock);