From 7d08b6062418e0ab8ddb97873dd3f30884bb7350 Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Tue, 3 Dec 2013 10:39:41 +0800 Subject: [PATCH] LU-3316 obdclass: fix wrong device put in case of race The ls_device_put() might be called from local_oid_storage_fini() wrongly if mutex-protected check failed due to race This patch is back-ported from the following one: Lustre-commit: 458804418f3c24706db7ad9a46f791e59f008a7d Lustre-change: http://review.whamcloud.com/6334 Signed-off-by: Mikhail Pershin Change-Id: I386597e431ded0dd2b63b078200571a00bc5fe96 Signed-off-by: Jian Yu Reviewed-on: http://review.whamcloud.com/8461 Reviewed-by: Niu Yawei Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/obdclass/local_storage.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lustre/obdclass/local_storage.c b/lustre/obdclass/local_storage.c index 26a3137..962da44 100644 --- a/lustre/obdclass/local_storage.c +++ b/lustre/obdclass/local_storage.c @@ -891,12 +891,15 @@ void local_oid_storage_fini(const struct lu_env *env, ls = dt2ls_dev(los->los_dev); mutex_lock(&ls->ls_los_mutex); - if (cfs_atomic_read(&los->los_refcount) == 0) { - if (los->los_obj) - lu_object_put_nocache(env, &los->los_obj->do_lu); - cfs_list_del(&los->los_list); - OBD_FREE_PTR(los); + if (cfs_atomic_read(&los->los_refcount) > 0) { + mutex_unlock(&ls->ls_los_mutex); + return; } + + if (los->los_obj) + lu_object_put_nocache(env, &los->los_obj->do_lu); + cfs_list_del(&los->los_list); + OBD_FREE_PTR(los); mutex_unlock(&ls->ls_los_mutex); ls_device_put(env, ls); } -- 1.8.3.1