X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_dir.c;h=a524f271b4b2c32965864ef2ceae0cca945e467a;hp=1bc386a9783d5b81b97182054fa7524f99d6ceb9;hb=2d6315fbeab3c815efa3ea7b953ff34e6f3fa3fc;hpb=a8065335e2588059b6c7e18357ea9ee4def50a68 diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 1bc386a..a524f27 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1322,16 +1322,22 @@ static int mdd_declare_finish_unlink(const struct lu_env *env, int rc; rc = orph_declare_index_insert(env, obj, mdd_object_type(obj), handle); - if (rc) + if (rc != 0) + return rc; + + rc = mdo_declare_destroy(env, obj, handle); + if (rc != 0) return rc; - return mdo_declare_destroy(env, obj, handle); + return mdd_declare_links_del(env, obj, handle); } /* caller should take a lock before calling */ int mdd_finish_unlink(const struct lu_env *env, - struct mdd_object *obj, struct md_attr *ma, - struct thandle *th) + struct mdd_object *obj, struct md_attr *ma, + const struct mdd_object *pobj, + const struct lu_name *lname, + struct thandle *th) { int rc = 0; int is_dir = S_ISDIR(ma->ma_attr.la_mode); @@ -1360,9 +1366,12 @@ int mdd_finish_unlink(const struct lu_env *env, } else { rc = mdo_destroy(env, obj, th); } - } + } else if (!is_dir) { + /* old files may not have link ea; ignore errors */ + mdd_links_del(env, obj, mdo2fid(pobj), lname, th); + } - RETURN(rc); + RETURN(rc); } /* @@ -1425,10 +1434,6 @@ static int mdd_declare_unlink(const struct lu_env *env, struct mdd_device *mdd, if (rc) return rc; - rc = mdd_declare_links_del(env, c, handle); - if (rc != 0) - return rc; - /* FIXME: need changelog for remove entry */ rc = mdd_declare_changelog_store(env, mdd, name, handle); } @@ -1584,16 +1589,12 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, /* XXX: this transfer to ma will be removed with LOD/OSP */ ma->ma_attr = *cattr; ma->ma_valid |= MA_INODE; - rc = mdd_finish_unlink(env, mdd_cobj, ma, handle); + rc = mdd_finish_unlink(env, mdd_cobj, ma, mdd_pobj, lname, handle); /* fetch updated nlink */ if (rc == 0) rc = mdd_la_get(env, mdd_cobj, cattr, BYPASS_CAPA); - if (!is_dir) - /* old files may not have link ea; ignore errors */ - mdd_links_del(env, mdd_cobj, mdo2fid(mdd_pobj), lname, handle); - /* if object is removed then we can't get its attrs, use last get */ if (cattr->la_nlink == 0) { ma->ma_attr = *cattr; @@ -2517,10 +2518,6 @@ static int mdd_declare_rename(const struct lu_env *env, if (rc) return rc; - rc = mdd_declare_links_del(env, mdd_tobj, handle); - if (rc) - return rc; - rc = mdd_declare_finish_unlink(env, mdd_tobj, handle); if (rc) return rc; @@ -2709,7 +2706,8 @@ static int mdd_rename(const struct lu_env *env, /* XXX: this transfer to ma will be removed with LOD/OSP */ ma->ma_attr = *tattr; ma->ma_valid |= MA_INODE; - rc = mdd_finish_unlink(env, mdd_tobj, ma, handle); + rc = mdd_finish_unlink(env, mdd_tobj, ma, mdd_tpobj, ltname, + handle); if (rc != 0) { CERROR("%s: Failed to unlink tobj " DFID": rc = %d\n", @@ -3740,7 +3738,7 @@ static int mdd_migrate_update_name(const struct lu_env *env, GOTO(stop_trans, rc); ma->ma_attr = *so_attr; ma->ma_valid |= MA_INODE; - rc = mdd_finish_unlink(env, mdd_sobj, ma, handle); + rc = mdd_finish_unlink(env, mdd_sobj, ma, mdd_pobj, lname, handle); if (rc != 0) GOTO(stop_trans, rc);