From: tappro Date: Sat, 21 Oct 2006 12:06:26 +0000 (+0000) Subject: - error handling for dynlocks X-Git-Tag: v1_8_0_110~486^2~401 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=f559db923a49dcbda5f2d3fad9ca0253e3671733;p=fs%2Flustre-release.git - error handling for dynlocks --- diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 5cf845f..964217f 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -58,6 +58,8 @@ __mdd_lookup_locked(const struct lu_env *env, struct md_object *pobj, int rc; dlh = mdd_pdo_read_lock(env, mdd_obj, name); + if (dlh == NULL) + return -ENOMEM; rc = __mdd_lookup(env, pobj, name, fid, mask); mdd_pdo_read_unlock(env, mdd_obj, dlh); @@ -391,6 +393,8 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, RETURN(PTR_ERR(handle)); dlh = mdd_pdo_write_lock(env, mdd_tobj, name); + if (dlh == NULL) + GOTO(out_trans, rc = -ENOMEM); mdd_write_lock(env, mdd_sobj); rc = mdd_link_sanity_check(env, mdd_tobj, mdd_sobj); @@ -415,6 +419,7 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, out: mdd_write_unlock(env, mdd_sobj); mdd_pdo_write_unlock(env, mdd_tobj, dlh); +out_trans: mdd_trans_stop(env, mdd, rc, handle); RETURN(rc); } @@ -530,6 +535,8 @@ static int mdd_unlink(const struct lu_env *env, RETURN(PTR_ERR(handle)); dlh = mdd_pdo_write_lock(env, mdd_pobj, name); + if (dlh == NULL) + GOTO(out_trans, rc = -ENOMEM); mdd_write_lock(env, mdd_cobj); rc = mdd_unlink_sanity_check(env, mdd_pobj, mdd_cobj, ma); @@ -568,6 +575,7 @@ static int mdd_unlink(const struct lu_env *env, cleanup: mdd_write_unlock(env, mdd_cobj); mdd_pdo_write_unlock(env, mdd_pobj, dlh); +out_trans: mdd_trans_stop(env, mdd, rc, handle); RETURN(rc); } @@ -621,6 +629,8 @@ static int mdd_name_insert(const struct lu_env *env, RETURN(PTR_ERR(handle)); dlh = mdd_pdo_write_lock(env, mdd_obj, name); + if (dlh == NULL) + GOTO(out_trans, rc = -ENOMEM); rc = mdd_ni_sanity_check(env, pobj, name, fid); if (rc) GOTO(out_unlock, rc); @@ -630,6 +640,7 @@ static int mdd_name_insert(const struct lu_env *env, out_unlock: mdd_pdo_write_unlock(env, mdd_obj, dlh); +out_trans: mdd_trans_stop(env, mdo2mdd(pobj), rc, handle); RETURN(rc); } @@ -680,6 +691,8 @@ static int mdd_name_remove(const struct lu_env *env, RETURN(PTR_ERR(handle)); dlh = mdd_pdo_write_lock(env, mdd_obj, name); + if (dlh == NULL) + GOTO(out_trans, rc = -ENOMEM); rc = mdd_nr_sanity_check(env, pobj, name); if (rc) GOTO(out_unlock, rc); @@ -689,6 +702,7 @@ static int mdd_name_remove(const struct lu_env *env, out_unlock: mdd_pdo_write_unlock(env, mdd_obj, dlh); +out_trans: mdd_trans_stop(env, mdd, rc, handle); RETURN(rc); } @@ -737,6 +751,8 @@ static int mdd_rename_tgt(const struct lu_env *env, RETURN(PTR_ERR(handle)); dlh = mdd_pdo_write_lock(env, mdd_tpobj, name); + if (dlh == NULL) + GOTO(out_trans, rc = -ENOMEM); if (mdd_tobj) mdd_write_lock(env, mdd_tobj); @@ -762,6 +778,7 @@ cleanup: if (tobj) mdd_write_unlock(env, mdd_tobj); mdd_pdo_write_unlock(env, mdd_tpobj, dlh); +out_trans: mdd_trans_stop(env, mdd, rc, handle); RETURN(rc); } @@ -1068,6 +1085,8 @@ static int mdd_create(const struct lu_env *env, RETURN(PTR_ERR(handle)); dlh = mdd_pdo_write_lock(env, mdd_pobj, name); + if (dlh == NULL) + GOTO(out_trans, rc = -ENOMEM); /* * XXX check that link can be added to the parent in mkdir case. @@ -1178,6 +1197,7 @@ cleanup: if (lmm) OBD_FREE(lmm, lmm_size); mdd_pdo_write_unlock(env, mdd_pobj, dlh); +out_trans: mdd_trans_stop(env, mdd, rc, handle); mdd_lproc_time_end(mdd, &start, LPROC_MDD_CREATE); RETURN(rc); @@ -1311,6 +1331,8 @@ static int mdd_rename(const struct lu_env *env, tdlh = mdd_pdo_write_lock(env, mdd_tpobj, tname); sdlh = mdd_pdo_write_lock(env, mdd_spobj, sname); } + if (sdlh == NULL || tdlh == NULL) + GOTO(cleanup, rc = -ENOMEM); rc = mdd_rename_sanity_check(env, mdd_spobj, mdd_tpobj, lf, is_dir, mdd_tobj); @@ -1376,7 +1398,8 @@ static int mdd_rename(const struct lu_env *env, } cleanup: - mdd_pdo_write_unlock(env, mdd_spobj, sdlh); + if (likely(sdlh)) + mdd_pdo_write_unlock(env, mdd_spobj, sdlh); if (tdlh) mdd_pdo_write_unlock(env, mdd_tpobj, tdlh); cleanup_unlocked: diff --git a/lustre/mdd/mdd_lock.c b/lustre/mdd/mdd_lock.c index 581cdc4..60f486b 100644 --- a/lustre/mdd/mdd_lock.c +++ b/lustre/mdd/mdd_lock.c @@ -76,6 +76,8 @@ unsigned long mdd_name2hash(const char *name) unsigned long value = 0; int namelen = strlen(name); int i = 0; + /*XXX the hash should be simple, fast but differ from split one + * Current one is just fast solution to see how dynlocks will help */ while (namelen > i) { value += name[i] * (i << 7); i++;