lov_io_init() and lov_lock_init() has taken lsm refcount, no need to
lock lo_type_guard otherwise it may lead to deadlock.
Signed-off-by: Lai Siyao <laisiyao@whamcloud.com>
Change-Id: I3e953d41e181c3ef19f7bf8d92d9791753d4c58a
Reviewed-on: http://review.whamcloud.com/3807
Reviewed-by: Jinshan Xiong <jinshan.xiong@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
* layer. Dispatches to the appropriate layout io initialization method.
*/
int lov_io_init(const struct lu_env *env, struct cl_object *obj,
* layer. Dispatches to the appropriate layout io initialization method.
*/
int lov_io_init(const struct lu_env *env, struct cl_object *obj,
{
struct lov_io *lio = lov_env_io(env);
{
struct lov_io *lio = lov_env_io(env);
- CL_IO_SLICE_CLEAN(lov_env_io(env), lis_cl);
+ CL_IO_SLICE_CLEAN(lov_env_io(env), lis_cl);
/* hold lsm before initializing because io relies on it */
lio->lis_lsm = lov_lsm_addref(cl2lov(obj));
/* hold lsm before initializing because io relies on it */
lio->lis_lsm = lov_lsm_addref(cl2lov(obj));
- /*
- * Do not take lock in case of CIT_MISC io, because
- *
- * - if this is an io for a glimpse, then we don't care;
- *
- * - if this not a glimpse (writepage or lock cancellation), then
- * layout change cannot happen because a page or a lock
- * already exist; and
- *
- * - lock ordering (lock mutex nests within layout rw-semaphore)
- * is obeyed in case of lock cancellation.
- */
- return LOV_2DISPATCH_MAYLOCK(cl2lov(obj), llo_io_init,
- io->ci_type != CIT_MISC, env, obj, io);
+ /* No need to lock because we've taken one refcount of layout. */
+ return LOV_2DISPATCH_NOLOCK(cl2lov(obj), llo_io_init, env, obj, io);
}
int lov_lock_init(const struct lu_env *env, struct cl_object *obj,
}
int lov_lock_init(const struct lu_env *env, struct cl_object *obj,
- struct cl_lock *lock, const struct cl_io *io)
+ struct cl_lock *lock, const struct cl_io *io)
- return LOV_2DISPATCH(cl2lov(obj), llo_lock_init, env, obj, lock, io);
+ /* No need to lock because we've taken one refcount of layout. */
+ return LOV_2DISPATCH_NOLOCK(cl2lov(obj), llo_lock_init, env, obj, lock,
+ io);
}
static const struct cl_object_operations lov_ops = {
}
static const struct cl_object_operations lov_ops = {