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>
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);
}