Whamcloud - gitweb
LU-3316 obdclass: fix wrong device put in case of race 34/6334/3
authorMikhail Pershin <mike.pershin@intel.com>
Tue, 14 May 2013 12:17:30 +0000 (16:17 +0400)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 17 Aug 2013 07:13:19 +0000 (07:13 +0000)
The ls_device_put() might be called from local_oid_storage_fini()
wrongly if mutex-protected check failed due to race

Signed-off-by: Mikhail Pershin <mike.pershin@intel.com>
Change-Id: Ia2707d5db84b6bb6e9a5558c08b03028de8b9d50
Reviewed-on: http://review.whamcloud.com/6334
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/obdclass/local_storage.c

index 7f41304..2799aba 100644 (file)
@@ -894,12 +894,15 @@ void local_oid_storage_fini(const struct lu_env *env,
        ls = dt2ls_dev(los->los_dev);
 
        mutex_lock(&ls->ls_los_mutex);
        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);
 }
        mutex_unlock(&ls->ls_los_mutex);
        ls_device_put(env, ls);
 }