From ae70c9e898b8230f26f659bfd85665230ea49720 Mon Sep 17 00:00:00 2001 From: Emoly Liu Date: Tue, 29 Mar 2016 15:04:44 +0800 Subject: [PATCH] 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 --- lustre/osd-ldiskfs/osd_compat.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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) -- 1.8.3.1