X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_dir.c;h=2a8fd652831f351a4b6674d900a4079f4fb3f9ae;hp=46c11607e5327695b11d747c1caefc5351ec8afd;hb=040179b84330689b1b2cd128dcdd711bfc8f0b4e;hpb=64af83190180a8f3e90aea270e2baaecb1ecdb93 diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 46c1160..2a8fd65 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1193,6 +1193,7 @@ static int mdd_declare_link(const struct lu_env *env, struct mdd_object *c, const struct lu_name *name, struct thandle *handle, + struct lu_attr *la, struct linkea_data *data) { int rc; @@ -1205,11 +1206,13 @@ static int mdd_declare_link(const struct lu_env *env, if (rc) return rc; - rc = mdo_declare_attr_set(env, p, NULL, handle); - if (rc) - return rc; + la->la_valid = LA_CTIME | LA_MTIME; + rc = mdo_declare_attr_set(env, p, la, handle); + if (rc != 0) + return rc; - rc = mdo_declare_attr_set(env, c, NULL, handle); + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, c, la, handle); if (rc) return rc; @@ -1243,8 +1246,11 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, memset(ldata, 0, sizeof(*ldata)); + LASSERT(ma->ma_attr.la_valid & LA_CTIME); + la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; + rc = mdd_declare_link(env, mdd, mdd_tobj, mdd_sobj, lname, handle, - ldata); + la, ldata); if (rc) GOTO(stop, rc); @@ -1274,9 +1280,6 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, GOTO(out_unlock, rc); } - LASSERT(ma->ma_attr.la_valid & LA_CTIME); - la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; - la->la_valid = LA_CTIME | LA_MTIME; rc = mdd_attr_check_set_internal(env, mdd_tobj, la, handle, 0); if (rc) @@ -1412,7 +1415,8 @@ static int mdd_declare_unlink(const struct lu_env *env, struct mdd_device *mdd, if (rc) return rc; - rc = mdo_declare_attr_set(env, c, NULL, handle); + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, c, la, handle); if (rc) return rc; @@ -2376,17 +2380,22 @@ static int mdd_rename_sanity_check(const struct lu_env *env, } static int mdd_declare_rename(const struct lu_env *env, - struct mdd_device *mdd, - struct mdd_object *mdd_spobj, - struct mdd_object *mdd_tpobj, - struct mdd_object *mdd_sobj, - struct mdd_object *mdd_tobj, - const struct lu_name *tname, + struct mdd_device *mdd, + struct mdd_object *mdd_spobj, + struct mdd_object *mdd_tpobj, + struct mdd_object *mdd_sobj, + struct mdd_object *mdd_tobj, + const struct lu_name *tname, const struct lu_name *sname, - struct md_attr *ma, - struct thandle *handle) + struct md_attr *ma, + struct linkea_data *ldata, + struct thandle *handle) { - int rc; + struct lu_attr *la = &mdd_env_info(env)->mti_la_for_fix; + int rc; + + LASSERT(ma->ma_attr.la_valid & LA_CTIME); + la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; LASSERT(mdd_spobj); LASSERT(mdd_tpobj); @@ -2404,16 +2413,18 @@ static int mdd_declare_rename(const struct lu_env *env, rc = mdo_declare_ref_del(env, mdd_spobj, handle); if (rc) return rc; + if (mdd_spobj != mdd_tpobj) { + rc = mdo_declare_index_delete(env, mdd_sobj, dotdot, + handle); + if (rc) + return rc; - rc = mdo_declare_index_delete(env, mdd_sobj, dotdot, handle); - if (rc) - return rc; - - rc = mdo_declare_index_insert(env, mdd_sobj, mdo2fid(mdd_tpobj), - dotdot, handle); - if (rc) - return rc; - + rc = mdo_declare_index_insert(env, mdd_sobj, + mdo2fid(mdd_tpobj), + dotdot, handle); + if (rc) + return rc; + } /* new target child can be directory, * counted by target dir's nlink */ rc = mdo_declare_ref_add(env, mdd_tpobj, handle); @@ -2422,20 +2433,23 @@ static int mdd_declare_rename(const struct lu_env *env, } - rc = mdo_declare_attr_set(env, mdd_spobj, NULL, handle); - if (rc) - return rc; + la->la_valid = LA_CTIME | LA_MTIME; + rc = mdo_declare_attr_set(env, mdd_spobj, la, handle); + if (rc != 0) + return rc; - rc = mdo_declare_attr_set(env, mdd_sobj, NULL, handle); - if (rc) - return rc; - mdd_declare_links_add(env, mdd_sobj, handle, NULL); - if (rc) - return rc; + rc = mdo_declare_attr_set(env, mdd_tpobj, la, handle); + if (rc != 0) + return rc; - rc = mdo_declare_attr_set(env, mdd_tpobj, NULL, handle); - if (rc) - return rc; + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, mdd_sobj, la, handle); + if (rc) + return rc; + + rc = mdd_declare_links_add(env, mdd_sobj, handle, ldata); + if (rc) + return rc; /* new name */ rc = mdo_declare_index_insert(env, mdd_tpobj, mdo2fid(mdd_sobj), @@ -2469,7 +2483,8 @@ static int mdd_declare_rename(const struct lu_env *env, return rc; } - rc = mdo_declare_attr_set(env, mdd_tobj, NULL, handle); + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, mdd_tobj, la, handle); if (rc) return rc; @@ -2496,40 +2511,61 @@ static int mdd_rename(const struct lu_env *env, struct md_object *tobj, const struct lu_name *ltname, struct md_attr *ma) { - const char *sname = lsname->ln_name; - const char *tname = ltname->ln_name; - struct lu_attr *la = &mdd_env_info(env)->mti_la_for_fix; + const char *sname = lsname->ln_name; + const char *tname = ltname->ln_name; + struct lu_attr *la = &mdd_env_info(env)->mti_la_for_fix; struct lu_attr *so_attr = &mdd_env_info(env)->mti_cattr; struct lu_attr *tg_attr = &mdd_env_info(env)->mti_pattr; - struct mdd_object *mdd_spobj = md2mdd_obj(src_pobj); /* source parent */ - struct mdd_object *mdd_tpobj = md2mdd_obj(tgt_pobj); - struct mdd_device *mdd = mdo2mdd(src_pobj); - struct mdd_object *mdd_sobj = NULL; /* source object */ - struct mdd_object *mdd_tobj = NULL; - struct dynlock_handle *sdlh, *tdlh; - struct thandle *handle; - const struct lu_fid *tpobj_fid = mdo2fid(mdd_tpobj); - const struct lu_fid *spobj_fid = mdo2fid(mdd_spobj); - bool is_dir; + struct mdd_object *mdd_spobj = md2mdd_obj(src_pobj); /* source parent */ + struct mdd_object *mdd_tpobj = md2mdd_obj(tgt_pobj); + struct mdd_device *mdd = mdo2mdd(src_pobj); + struct mdd_object *mdd_sobj = NULL; /* source object */ + struct mdd_object *mdd_tobj = NULL; + struct dynlock_handle *sdlh = NULL, *tdlh = NULL; + struct thandle *handle; + struct linkea_data *ldata = &mdd_env_info(env)->mti_link_data; + const struct lu_fid *tpobj_fid = mdo2fid(mdd_tpobj); + const struct lu_fid *spobj_fid = mdo2fid(mdd_spobj); + bool is_dir; bool tobj_ref = 0; bool tobj_locked = 0; unsigned cl_flags = 0; - int rc, rc2; - ENTRY; + int rc, rc2; + ENTRY; if (tobj) mdd_tobj = md2mdd_obj(tobj); mdd_sobj = mdd_object_find(env, mdd, lf); + rc = mdd_la_get(env, mdd_sobj, so_attr, + mdd_object_capa(env, mdd_sobj)); + if (rc) + GOTO(out_pending, rc); + + if (mdd_tobj) { + rc = mdd_la_get(env, mdd_tobj, tg_attr, + mdd_object_capa(env, mdd_tobj)); + if (rc) + GOTO(out_pending, rc); + } + + rc = mdd_rename_sanity_check(env, mdd_spobj, mdd_tpobj, mdd_sobj, + mdd_tobj, so_attr, tg_attr); + if (rc) + GOTO(out_pending, rc); + handle = mdd_trans_create(env, mdd); if (IS_ERR(handle)) GOTO(out_pending, rc = PTR_ERR(handle)); - rc = mdd_declare_rename(env, mdd, mdd_spobj, mdd_tpobj, mdd_sobj, - mdd_tobj, lsname, ltname, ma, handle); - if (rc) - GOTO(stop, rc); + memset(ldata, 0, sizeof(*ldata)); + mdd_linkea_prepare(env, mdd_sobj, NULL, NULL, mdd_object_fid(mdd_tpobj), + ltname, 1, 0, ldata); + rc = mdd_declare_rename(env, mdd, mdd_spobj, mdd_tpobj, mdd_sobj, + mdd_tobj, lsname, ltname, ma, ldata, handle); + if (rc) + GOTO(stop, rc); rc = mdd_trans_start(env, mdd, handle); if (rc) @@ -2560,23 +2596,6 @@ static int mdd_rename(const struct lu_env *env, if (sdlh == NULL || tdlh == NULL) GOTO(cleanup, rc = -ENOMEM); - rc = mdd_la_get(env, mdd_sobj, so_attr, - mdd_object_capa(env, mdd_sobj)); - if (rc) - GOTO(cleanup, rc); - - if (mdd_tobj) { - rc = mdd_la_get(env, mdd_tobj, tg_attr, - mdd_object_capa(env, mdd_tobj)); - if (rc) - GOTO(cleanup, rc); - } - - rc = mdd_rename_sanity_check(env, mdd_spobj, mdd_tpobj, mdd_sobj, - mdd_tobj, so_attr, tg_attr); - if (rc) - GOTO(cleanup, rc); - is_dir = S_ISDIR(so_attr->la_mode); /* Remove source name from source directory */ @@ -2713,8 +2732,8 @@ static int mdd_rename(const struct lu_env *env, handle, 0); } - if (rc == 0 && mdd_sobj) { - mdd_write_lock(env, mdd_sobj, MOR_SRC_CHILD); + if (rc == 0 && mdd_sobj) { + mdd_write_lock(env, mdd_sobj, MOR_SRC_CHILD); rc = mdd_links_rename(env, mdd_sobj, mdo2fid(mdd_spobj), lsname, mdo2fid(mdd_tpobj), ltname, handle, NULL, 0, 0); @@ -2756,19 +2775,21 @@ fixup_tpobj: } fixup_spobj: - if (rc && is_dir && mdd_sobj) { - rc2 = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle, - BYPASS_CAPA); + if (rc && is_dir && mdd_sobj && mdd_spobj != mdd_tpobj) { + rc2 = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle, + BYPASS_CAPA); - if (rc2) - CWARN("sp obj dotdot delete error %d\n",rc2); + if (rc2) + CWARN("%s: sp obj dotdot delete error: rc = %d\n", + mdd2obd_dev(mdd)->obd_name, rc2); - rc2 = __mdd_index_insert_only(env, mdd_sobj, spobj_fid, - dotdot, handle, BYPASS_CAPA); - if (rc2) - CWARN("sp obj dotdot insert error %d\n",rc2); - } + rc2 = __mdd_index_insert_only(env, mdd_sobj, spobj_fid, + dotdot, handle, BYPASS_CAPA); + if (rc2) + CWARN("%s: sp obj dotdot insert error: rc = %d\n", + mdd2obd_dev(mdd)->obd_name, rc2); + } fixup_spobj2: if (rc) {