Whamcloud - gitweb
LU-12566 mdc: hold lock while walking changelog dev list 35/35835/2
authorAndreas Dilger <adilger@whamcloud.com>
Thu, 1 Aug 2019 20:55:58 +0000 (14:55 -0600)
committerOleg Drokin <green@whamcloud.com>
Thu, 12 Sep 2019 03:52:18 +0000 (03: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.

Lustre-change: https://review.whamcloud.com/35668
Lustre-commit: a260c530801db7f58efa93b774f06b0ce72649a3

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

index e29e705..833588b 100644 (file)
@@ -630,6 +630,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;
@@ -648,6 +649,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)
@@ -720,6 +722,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);
@@ -731,10 +734,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);