Whamcloud - gitweb
LU-5413 mdd: improve error handling around mdd_write_lock() 28/11228/4
authorJohn L. Hammond <john.hammond@intel.com>
Fri, 25 Jul 2014 15:00:15 +0000 (10:00 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 18 Aug 2014 17:07:00 +0000 (17:07 +0000)
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 <john.hammond@intel.com>
Change-Id: I12205f52d45138201a7e103d1b5effddbe865308
Reviewed-on: http://review.whamcloud.com/11228
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdd/mdd_dir.c
lustre/mdd/mdd_object.c

index 55aec66..8d9b52c 100644 (file)
@@ -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:
index b415f4b..76b5f0e 100644 (file)
@@ -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;
 }