From: Emoly Liu Date: Tue, 29 Mar 2016 07:04:44 +0000 (+0800) Subject: LU-7055 osd: move dput() out of osd_ost_fini()'s rwlock X-Git-Tag: 2.8.52~16 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=ae70c9e898b8230f26f659bfd85665230ea49720;hp=8caff5d019674aea7d98e225d0136bf4694d5157 LU-7055 osd: move dput() out of osd_ost_fini()'s rwlock osd_ost_fini() calls into osd_seq_free() under write lock, which in turn calls into dput() that might sleep and cause "BUG: rwlock wrong CPU on CPU#x, umount/xxx" sort of messages. To fix this issue, this patch only keeps list_del_init() under write lock, and moves sleeping function out of there. Signed-off-by: Emoly Liu Change-Id: Ie1eef345d1735bb88aeb016a2409ea649cd20fe5 Reviewed-on: http://review.whamcloud.com/19189 Tested-by: Jenkins Reviewed-by: Fan Yong Tested-by: Maloo Reviewed-by: Andreas Dilger --- diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c index d58b6c8..cec04db 100644 --- a/lustre/osd-ldiskfs/osd_compat.c +++ b/lustre/osd-ldiskfs/osd_compat.c @@ -421,13 +421,10 @@ cleanup_alloc: return rc; } -static void osd_seq_free(struct osd_obj_map *map, - struct osd_obj_seq *osd_seq) +static void osd_seq_free(struct osd_obj_seq *osd_seq) { int j; - list_del_init(&osd_seq->oos_seq_list); - if (osd_seq->oos_dirs) { for (j = 0; j < osd_seq->oos_subdir_count; j++) { if (osd_seq->oos_dirs[j]) @@ -456,7 +453,10 @@ static void osd_ost_fini(struct osd_device *osd) write_lock(&map->om_seq_list_lock); list_for_each_entry_safe(osd_seq, tmp, &map->om_seq_list, oos_seq_list) { - osd_seq_free(map, osd_seq); + list_del_init(&osd_seq->oos_seq_list); + write_unlock(&map->om_seq_list_lock); + osd_seq_free(osd_seq); + write_lock(&map->om_seq_list_lock); } write_unlock(&map->om_seq_list_lock); if (map->om_root)