From 77d8a2a3c73d49b23c56c0a759dccfa446593995 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Fri, 25 Jul 2014 10:00:15 -0500 Subject: [PATCH] LU-5413 mdd: improve error handling around mdd_write_lock() In mdd_unlink() avoid passing an NULL object to mdd_write_unlock(). In mdd_migrate_update_name() and mdd_open() ensure that mdd_write_unlock() is called in the error paths. Signed-off-by: John L. Hammond Change-Id: I12205f52d45138201a7e103d1b5effddbe865308 Reviewed-on: http://review.whamcloud.com/11228 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Fan Yong Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_dir.c | 12 ++++++++---- lustre/mdd/mdd_object.c | 11 +++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 55aec66..8d9b52c 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1678,7 +1678,9 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, } EXIT; cleanup: - mdd_write_unlock(env, mdd_cobj); + if (likely(mdd_cobj != NULL)) + mdd_write_unlock(env, mdd_cobj); + if (rc == 0) { int cl_flags = 0; @@ -3866,17 +3868,19 @@ static int mdd_migrate_update_name(const struct lu_env *env, rc = mdd_la_get(env, mdd_sobj, so_attr, mdd_object_capa(env, mdd_sobj)); if (rc != 0) - GOTO(stop_trans, rc); + GOTO(out_unlock, rc); + ma->ma_attr = *so_attr; ma->ma_valid |= MA_INODE; rc = mdd_finish_unlink(env, mdd_sobj, ma, mdd_pobj, lname, handle); if (rc != 0) - GOTO(stop_trans, rc); + GOTO(out_unlock, rc); rc = mdd_attr_set_internal(env, mdd_pobj, p_la, handle, 0); if (rc != 0) - GOTO(stop_trans, rc); + GOTO(out_unlock, rc); +out_unlock: mdd_write_unlock(env, mdd_sobj); stop_trans: diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index b415f4b..76b5f0e 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -1677,13 +1677,16 @@ static int mdd_open(const struct lu_env *env, struct md_object *obj, mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_la_get(env, mdd_obj, attr, BYPASS_CAPA); - if (rc) - RETURN(rc); + if (rc != 0) + GOTO(out, rc); rc = mdd_open_sanity_check(env, mdd_obj, attr, flags); - if (rc == 0) - mdd_obj->mod_count++; + if (rc != 0) + GOTO(out, rc); + mdd_obj->mod_count++; + EXIT; +out: mdd_write_unlock(env, mdd_obj); return rc; } -- 1.8.3.1