From: Andreas Dilger Date: Thu, 1 Aug 2019 20:55:58 +0000 (-0600) Subject: LU-12566 mdc: hold lock while walking changelog dev list X-Git-Tag: 2.12.57~31 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=a260c530801db7f58efa93b774f06b0ce72649a3 LU-12566 mdc: hold lock while walking changelog dev list 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 Change-Id: Ib62fdff87cde6a4bcfb9bea24a2ea72a933ebbe5 Reviewed-on: https://review.whamcloud.com/35668 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Hongchao Zhang Reviewed-by: Quentin Bouget Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdc/mdc_changelog.c b/lustre/mdc/mdc_changelog.c index fe1ef6e..fe7e1b2 100644 --- a/lustre/mdc/mdc_changelog.c +++ b/lustre/mdc/mdc_changelog.c @@ -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);