From 9b2db9e502844990297f43dc69bfe810cf8fbdbd Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Wed, 15 Feb 2012 12:39:53 +0400 Subject: [PATCH] LU-966 mdd: revert commit and use original patch Use original patch which replaces LASSERT with CERROR in MDD, because checking object exists in MDT ruins VBR recovery. It happens too early but VBR should check that too before reply to the client. Signed-off-by: Mikhail Pershin Change-Id: If31586c9d1cc86c4c8059a7227c231acdc82a0f1 Reviewed-on: http://review.whamcloud.com/2148 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Niu Yawei Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin Reviewed-by: Yu Jian Tested-by: Yu Jian --- lustre/mdd/mdd_internal.h | 47 ++++++++++++++++++++++++++++------ lustre/mdd/mdd_object.c | 43 ++++++++++++++++++++++++------- lustre/mdt/mdt_handler.c | 64 ++++++++++++++++++++++------------------------- lustre/mdt/mdt_internal.h | 16 ++---------- lustre/mdt/mdt_open.c | 58 +++++++++++++++++++----------------------- lustre/mdt/mdt_recovery.c | 6 ++--- lustre/mdt/mdt_reint.c | 52 ++++++++++++++++---------------------- lustre/mdt/mdt_xattr.c | 3 +-- 8 files changed, 156 insertions(+), 133 deletions(-) diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 72e497c..76cc95c 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -613,6 +613,11 @@ static inline void mdd_set_capainfo(const struct lu_env *env, int offset, ci->mc_capa[offset] = capa; } +static inline const char *mdd_obj_dev_name(const struct mdd_object *obj) +{ + return lu_dev_name(obj->mod_obj.mo_lu.lo_dev); +} + #define MAX_ATIME_DIFF 60 enum { @@ -667,7 +672,11 @@ static inline int mdo_attr_set(const struct lu_env *env, struct lustre_capa *capa) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return next->do_ops->do_attr_set(env, next, la, handle, capa); } @@ -695,7 +704,11 @@ static inline int mdo_xattr_set(const struct lu_env *env,struct mdd_object *obj, struct lustre_capa *capa) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return next->do_ops->do_xattr_set(env, next, buf, name, fl, handle, capa); } @@ -714,7 +727,11 @@ static inline int mdo_xattr_del(const struct lu_env *env,struct mdd_object *obj, struct lustre_capa *capa) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return next->do_ops->do_xattr_del(env, next, name, handle, capa); } @@ -723,7 +740,11 @@ int mdo_xattr_list(const struct lu_env *env, struct mdd_object *obj, struct lu_buf *buf, struct lustre_capa *capa) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return next->do_ops->do_xattr_list(env, next, buf, capa); } @@ -784,7 +805,11 @@ static inline int mdo_ref_add(const struct lu_env *env, struct mdd_object *obj, struct thandle *handle) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return next->do_ops->do_ref_add(env, next, handle); } @@ -800,7 +825,11 @@ static inline int mdo_ref_del(const struct lu_env *env, struct mdd_object *obj, struct thandle *handle) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return next->do_ops->do_ref_del(env, next, handle); } @@ -849,7 +878,11 @@ static inline struct obd_capa *mdo_capa_get(const struct lu_env *env, __u64 opc) { struct dt_object *next = mdd_object_child(obj); - LASSERT(mdd_object_exists(obj)); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return ERR_PTR(-ENOENT); + } return next->do_ops->do_capa_get(env, next, old, opc); } diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 20c4385..583a29b 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -72,8 +72,11 @@ static int mdd_xattr_get(const struct lu_env *env, int mdd_data_get(const struct lu_env *env, struct mdd_object *obj, void **data) { - LASSERTF(mdd_object_exists(obj), "FID is "DFID"\n", - PFID(mdd_object_fid(obj))); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } mdo_data_get(env, obj, data); return 0; } @@ -81,8 +84,11 @@ int mdd_data_get(const struct lu_env *env, struct mdd_object *obj, int mdd_la_get(const struct lu_env *env, struct mdd_object *obj, struct lu_attr *la, struct lustre_capa *capa) { - LASSERTF(mdd_object_exists(obj), "FID is "DFID"\n", - PFID(mdd_object_fid(obj))); + if (mdd_object_exists(obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(obj), PFID(mdd_object_fid(obj))); + return -ENOENT; + } return mdo_attr_get(env, obj, la, capa); } @@ -819,7 +825,11 @@ static int mdd_xattr_get(const struct lu_env *env, ENTRY; - LASSERT(mdd_object_exists(mdd_obj)); + if (mdd_object_exists(mdd_obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(mdd_obj),PFID(mdd_object_fid(mdd_obj))); + return -ENOENT; + } mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdo_xattr_get(env, mdd_obj, buf, name, @@ -842,7 +852,11 @@ static int mdd_readlink(const struct lu_env *env, struct md_object *obj, int rc; ENTRY; - LASSERT(mdd_object_exists(mdd_obj)); + if (mdd_object_exists(mdd_obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(mdd_obj),PFID(mdd_object_fid(mdd_obj))); + return -ENOENT; + } next = mdd_object_child(mdd_obj); mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); @@ -1946,8 +1960,11 @@ static int mdd_ref_del(const struct lu_env *env, struct md_object *obj, * Check -ENOENT early here because we need to get object type * to calculate credits before transaction start */ - if (!mdd_object_exists(mdd_obj)) + if (mdd_object_exists(mdd_obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(mdd_obj),PFID(mdd_object_fid(mdd_obj))); RETURN(-ENOENT); + } LASSERT(mdd_object_exists(mdd_obj) > 0); @@ -2719,7 +2736,11 @@ int mdd_readpage(const struct lu_env *env, struct md_object *obj, int rc; ENTRY; - LASSERT(mdd_object_exists(mdd_obj)); + if (mdd_object_exists(mdd_obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(mdd_obj),PFID(mdd_object_fid(mdd_obj))); + return -ENOENT; + } mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_readpage_sanity_check(env, mdd_obj); @@ -2764,7 +2785,11 @@ static int mdd_object_sync(const struct lu_env *env, struct md_object *obj) struct mdd_object *mdd_obj = md2mdd_obj(obj); struct dt_object *next; - LASSERT(mdd_object_exists(mdd_obj)); + if (mdd_object_exists(mdd_obj) == 0) { + CERROR("%s: object "DFID" not found: rc = -2\n", + mdd_obj_dev_name(mdd_obj),PFID(mdd_object_fid(mdd_obj))); + return -ENOENT; + } next = mdd_object_child(mdd_obj); return next->do_ops->do_object_sync(env, next); } diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 6e4705e..9a71be0 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -325,8 +325,7 @@ static int mdt_getstatus(struct mdt_thread_info *info) struct mdt_object *root; struct lustre_capa *capa; - root = mdt_object_find(info->mti_env, mdt, &repbody->fid1, - MDT_OBJ_MUST_EXIST); + root = mdt_object_find(info->mti_env, mdt, &repbody->fid1); if (IS_ERR(root)) RETURN(PTR_ERR(root)); @@ -1000,8 +999,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, *step 3: find the child object by fid & lock it. * regardless if it is local or remote. */ - child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid, - MDT_OBJ_MUST_EXIST); + child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid); if (unlikely(IS_ERR(child))) GOTO(out_parent, rc = PTR_ERR(child)); @@ -1040,6 +1038,13 @@ relock: else mdt_lock_reg_init(lhc, LCK_PR); + if (mdt_object_exists(child) == 0) { + LU_OBJECT_DEBUG(D_WARNING, info->mti_env, + &child->mot_obj.mo_lu, + "Object doesn't exist!\n"); + GOTO(out_child, rc = -ENOENT); + } + if (!(child_bits & MDS_INODELOCK_UPDATE)) { struct md_attr *ma = &info->mti_attr; @@ -2074,8 +2079,7 @@ static struct mdt_object *mdt_obj(struct lu_object *o) struct mdt_object *mdt_object_find(const struct lu_env *env, struct mdt_device *d, - const struct lu_fid *f, - enum mdt_obj_exist check_exist) + const struct lu_fid *f) { struct lu_object *o; struct mdt_object *m; @@ -2084,16 +2088,9 @@ struct mdt_object *mdt_object_find(const struct lu_env *env, CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f)); o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL); if (unlikely(IS_ERR(o))) - RETURN((struct mdt_object *)o); + m = (struct mdt_object *)o; else m = mdt_obj(o); - - if (check_exist == MDT_OBJ_MUST_EXIST && mdt_object_exists(m) == 0) { - mdt_object_put(env, m); - CERROR("%s: object "DFID" not found: rc = -2\n", - mdt_obj_dev_name(m), PFID(f)); - RETURN(ERR_PTR(-ENOENT)); - } RETURN(m); } @@ -2370,12 +2367,11 @@ void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *o, struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *info, const struct lu_fid *f, struct mdt_lock_handle *lh, - __u64 ibits, - enum mdt_obj_exist check_exist) + __u64 ibits) { struct mdt_object *o; - o = mdt_object_find(info->mti_env, info->mti_mdt, f, check_exist); + o = mdt_object_find(info->mti_env, info->mti_mdt, f); if (!IS_ERR(o)) { int rc; @@ -2479,11 +2475,10 @@ static int mdt_body_unpack(struct mdt_thread_info *info, __u32 flags) mdt_set_capainfo(info, 0, &body->fid1, req_capsule_client_get(pill, &RMF_CAPA1)); - obj = mdt_object_find(env, info->mti_mdt, &body->fid1, - MDT_OBJ_MAY_NOT_EXIST); + obj = mdt_object_find(env, info->mti_mdt, &body->fid1); if (!IS_ERR(obj)) { if ((flags & HABEO_CORPUS) && - mdt_object_exists(obj) == 0) { + !mdt_object_exists(obj)) { mdt_object_put(env, obj); /* for capability renew ENOENT will be handled in * mdt_renew_capa */ @@ -5403,16 +5398,19 @@ static int mdt_fid2path(const struct lu_env *env, struct mdt_device *mdt, if (!fid_is_sane(&fp->gf_fid)) RETURN(-EINVAL); - obj = mdt_object_find(env, mdt, &fp->gf_fid, MDT_OBJ_MUST_EXIST); + obj = mdt_object_find(env, mdt, &fp->gf_fid); if (obj == NULL || IS_ERR(obj)) { - CDEBUG(D_IOCTL, "%s: no object "DFID": %ld\n", - mdt2obd_dev(mdt)->obd_name, PFID(&fp->gf_fid), + CDEBUG(D_IOCTL, "no object "DFID": %ld\n", PFID(&fp->gf_fid), PTR_ERR(obj)); - RETURN(obj == NULL ? -EINVAL : PTR_ERR(obj)); + RETURN(-EINVAL); } - if (lu_object_exists(&obj->mot_obj.mo_lu) < 0) { - rc = -EREMOTE; + rc = lu_object_exists(&obj->mot_obj.mo_lu); + if (rc <= 0) { + if (rc == -1) + rc = -EREMOTE; + else + rc = -ENOENT; mdt_object_put(env, obj); CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n", PFID(&fp->gf_fid), rc); @@ -5510,13 +5508,9 @@ static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg) lh = &mti->mti_lh[MDT_LH_PARENT]; mdt_lock_reg_init(lh, LCK_CR); - obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE, - MDT_OBJ_MUST_EXIST); - if (IS_ERR(obj)) { - if (PTR_ERR(obj) == -ENOENT) - *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION; + obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE); + if (IS_ERR(obj)) RETURN(PTR_ERR(obj)); - } rc = mdt_object_exists(obj); if (rc < 0) { @@ -5526,13 +5520,15 @@ static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg) * fid, this is error to find remote object here */ CERROR("nonlocal object "DFID"\n", PFID(fid)); - } else if (rc > 0) { + } else if (rc == 0) { + *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION; + rc = -ENOENT; + } else { version = dt_version_get(mti->mti_env, mdt_obj2dt(obj)); *(__u64 *)data->ioc_inlbuf2 = version; rc = 0; } mdt_object_unlock_put(mti, obj, lh, 1); - RETURN(rc); } diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index c96eebe..d33df7f 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -413,11 +413,6 @@ enum mdt_txn_op { MDT_TXN_LAST_RCVD_WRITE_OP, }; -enum mdt_obj_exist{ - MDT_OBJ_MUST_EXIST, - MDT_OBJ_MAY_NOT_EXIST, -}; - static inline const struct md_device_operations * mdt_child_ops(struct mdt_device * m) { @@ -490,11 +485,6 @@ static inline void mdt_export_evict(struct obd_export *exp) class_export_put(exp); } -static inline const char *mdt_obj_dev_name(const struct mdt_object *obj) -{ - return lu_dev_name(obj->mot_obj.mo_lu.lo_dev); -} - int mdt_get_disposition(struct ldlm_reply *rep, int flag); void mdt_set_disposition(struct mdt_thread_info *info, struct ldlm_reply *rep, int flag); @@ -524,13 +514,11 @@ void mdt_object_unlock(struct mdt_thread_info *, struct mdt_object *mdt_object_find(const struct lu_env *, struct mdt_device *, - const struct lu_fid *, - enum mdt_obj_exist check_exist); + const struct lu_fid *); struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *, const struct lu_fid *, struct mdt_lock_handle *, - __u64 ibits, - enum mdt_obj_exist check_exist); + __u64); void mdt_object_unlock_put(struct mdt_thread_info *, struct mdt_object *, struct mdt_lock_handle *, diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 3eab86c..2642660 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -936,8 +936,7 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, * We failed after creation, but we do not know in which step * we failed. So try to check the child object. */ - parent = mdt_object_find(env, mdt, rr->rr_fid1, - MDT_OBJ_MUST_EXIST); + parent = mdt_object_find(env, mdt, rr->rr_fid1); if (IS_ERR(parent)) { rc = PTR_ERR(parent); LCONSOLE_WARN("Parent "DFID" lookup error %d." @@ -948,8 +947,7 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, mdt_export_evict(exp); RETURN_EXIT; } - child = mdt_object_find(env, mdt, rr->rr_fid2, - MDT_OBJ_MAY_NOT_EXIST); + child = mdt_object_find(env, mdt, rr->rr_fid2); if (IS_ERR(child)) { rc = PTR_ERR(child); LCONSOLE_WARN("Child "DFID" lookup error %d." @@ -1009,10 +1007,9 @@ int mdt_open_by_fid(struct mdt_thread_info* info, int rc; ENTRY; - o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2, - MDT_OBJ_MUST_EXIST); + o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2); if (IS_ERR(o)) - RETURN(PTR_ERR(o)); + RETURN(rc = PTR_ERR(o)); rc = mdt_object_exists(o); if (rc > 0) { @@ -1023,7 +1020,9 @@ int mdt_open_by_fid(struct mdt_thread_info* info, rc = mo_attr_get(env, mdt_object_child(o), ma); if (rc == 0) rc = mdt_finish_open(info, NULL, o, flags, 0, rep); - } else if (rc < 0) { + } else if (rc == 0) { + rc = -ENOENT; + } else { /* the child object was created on remote server */ struct mdt_body *repbody; repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); @@ -1053,8 +1052,7 @@ int mdt_open_anon_by_fid(struct mdt_thread_info *info, if (md_should_create(flags)) { if (!lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) { - parent = mdt_object_find(env, mdt, rr->rr_fid1, - MDT_OBJ_MUST_EXIST); + parent = mdt_object_find(env, mdt, rr->rr_fid1); if (IS_ERR(parent)) { CDEBUG(D_INODE, "Fail to find parent "DFID " for anonymous created %ld, try to" @@ -1067,18 +1065,18 @@ int mdt_open_anon_by_fid(struct mdt_thread_info *info, ma->ma_need |= MA_PFID; } - o = mdt_object_find(env, mdt, rr->rr_fid2, MDT_OBJ_MUST_EXIST); - if (IS_ERR(o)) { - if (PTR_ERR(o) == -ENOENT) - mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD | - DISP_LOOKUP_NEG)); - GOTO(out_parent, rc = PTR_ERR(o)); - } + o = mdt_object_find(env, mdt, rr->rr_fid2); + if (IS_ERR(o)) + RETURN(rc = PTR_ERR(o)); rc = mdt_object_exists(o); - if (rc < 0) { + if (rc == 0) { + mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD | + DISP_LOOKUP_NEG)); + GOTO(out, rc = -ENOENT); + } else if (rc < 0) { CERROR("NFS remote open shouldn't happen.\n"); - GOTO(out_child, rc); + GOTO(out, rc); } mdt_set_disposition(info, rep, (DISP_IT_EXECD | DISP_LOOKUP_EXECD | @@ -1097,15 +1095,14 @@ int mdt_open_anon_by_fid(struct mdt_thread_info *info, MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN, MDT_CROSS_LOCK); if (rc) - GOTO(out_child, rc); + GOTO(out, rc); rc = mo_attr_get(env, mdt_object_child(o), ma); if (rc) - GOTO(out_child, rc); + GOTO(out, rc); if (ma->ma_valid & MA_PFID) { - parent = mdt_object_find(env, mdt, &ma->ma_pfid, - MDT_OBJ_MUST_EXIST); + parent = mdt_object_find(env, mdt, &ma->ma_pfid); if (IS_ERR(parent)) { CDEBUG(D_INODE, "Fail to find parent "DFID " for anonymous created %ld, try to" @@ -1122,10 +1119,9 @@ int mdt_open_anon_by_fid(struct mdt_thread_info *info, if (!(flags & MDS_OPEN_LOCK) || rc) mdt_object_unlock(info, o, lhc, 1); - GOTO(out_child, rc); -out_child: + GOTO(out, rc); +out: mdt_object_put(env, o); -out_parent: if (parent != NULL) mdt_object_put(env, parent); return rc; @@ -1147,8 +1143,7 @@ int mdt_cross_open(struct mdt_thread_info* info, int rc; ENTRY; - o = mdt_object_find(info->mti_env, info->mti_mdt, fid, - MDT_OBJ_MAY_NOT_EXIST); + o = mdt_object_find(info->mti_env, info->mti_mdt, fid); if (IS_ERR(o)) RETURN(rc = PTR_ERR(o)); @@ -1240,7 +1235,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) ma->ma_attr.la_mode, msg_flags); if (req_is_replay(req) || - (req->rq_export->exp_libclient && create_flags & MDS_OPEN_HAS_EA)) { + (req->rq_export->exp_libclient && create_flags&MDS_OPEN_HAS_EA)) { /* This is a replay request or from liblustre with ea. */ result = mdt_open_by_fid(info, ldlm_rep); @@ -1286,7 +1281,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) LCK_PW : LCK_PR, rr->rr_name, rr->rr_namelen); parent = mdt_object_find_lock(info, rr->rr_fid1, lh, - MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(parent)) GOTO(out, result = PTR_ERR(parent)); @@ -1330,8 +1325,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); } - child = mdt_object_find(info->mti_env, mdt, child_fid, - MDT_OBJ_MAY_NOT_EXIST); + child = mdt_object_find(info->mti_env, mdt, child_fid); if (IS_ERR(child)) GOTO(out_parent, result = PTR_ERR(child)); diff --git a/lustre/mdt/mdt_recovery.c b/lustre/mdt/mdt_recovery.c index bfd5042..1c268f8 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -1089,8 +1089,7 @@ static void mdt_reconstruct_create(struct mdt_thread_info *mti, return; /* if no error, so child was created with requested fid */ - child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2, - MDT_OBJ_MUST_EXIST); + child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2); if (IS_ERR(child)) { rc = PTR_ERR(child); LCONSOLE_WARN("Child "DFID" lookup error %d." @@ -1132,8 +1131,7 @@ static void mdt_reconstruct_setattr(struct mdt_thread_info *mti, return; body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY); - obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1, - MDT_OBJ_MUST_EXIST); + obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1); if (IS_ERR(obj)) { int rc = PTR_ERR(obj); LCONSOLE_WARN(""DFID" lookup error %d." diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 523003c..9922b82 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -250,8 +250,7 @@ int mdt_lookup_version_check(struct mdt_thread_info *info, info->mti_ver[idx] = ENOENT_VERSION; if (rc == 0) { struct mdt_object *child; - child = mdt_object_find(info->mti_env, info->mti_mdt, fid, - MDT_OBJ_MAY_NOT_EXIST); + child = mdt_object_find(info->mti_env, info->mti_mdt, fid); if (likely(!IS_ERR(child))) { mdt_obj_version_get(info, child, &info->mti_ver[idx]); mdt_object_put(info->mti_env, child); @@ -292,7 +291,7 @@ static int mdt_md_create(struct mdt_thread_info *info) mdt_lock_pdo_init(lh, LCK_PW, rr->rr_name, rr->rr_namelen); parent = mdt_object_find_lock(info, rr->rr_fid1, lh, - MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(parent)) RETURN(PTR_ERR(parent)); @@ -314,8 +313,7 @@ static int mdt_md_create(struct mdt_thread_info *info) /* save version of file name for replay, it must be ENOENT here */ mdt_enoent_version_save(info, 1); - child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2, - MDT_OBJ_MAY_NOT_EXIST); + child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2); if (likely(!IS_ERR(child))) { struct md_object *next = mdt_object_child(parent); @@ -381,8 +379,7 @@ static int mdt_md_mkobj(struct mdt_thread_info *info) repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); - o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2, - MDT_OBJ_MAY_NOT_EXIST); + o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2); if (!IS_ERR(o)) { struct md_object *next = mdt_object_child(o); @@ -491,8 +488,7 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, ldlm_request_cancel(req, info->mti_dlm_req, 0); repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); - mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1, - MDT_OBJ_MUST_EXIST); + mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1); if (IS_ERR(mo)) GOTO(out, rc = PTR_ERR(mo)); @@ -694,7 +690,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, rr->rr_namelen); } mp = mdt_object_find_lock(info, rr->rr_fid1, parent_lh, - MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(mp)) { rc = PTR_ERR(mp); /* errors are possible here in cross-ref cases, see below */ @@ -737,8 +733,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, GOTO(out_unlock_parent, rc); /* We will lock the child regardless it is local or remote. No harm. */ - mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid, - MDT_OBJ_MUST_EXIST); + mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid); if (IS_ERR(mc)) GOTO(out_unlock_parent, rc = PTR_ERR(mc)); child_lh = &info->mti_lh[MDT_LH_CHILD]; @@ -826,8 +821,7 @@ static int mdt_reint_link(struct mdt_thread_info *info, lhs = &info->mti_lh[MDT_LH_CHILD]; mdt_lock_reg_init(lhs, LCK_EX); ms = mdt_object_find_lock(info, rr->rr_fid1, lhs, - MDS_INODELOCK_UPDATE, - MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(ms)) RETURN(PTR_ERR(ms)); @@ -847,7 +841,7 @@ static int mdt_reint_link(struct mdt_thread_info *info, mdt_lock_pdo_init(lhp, LCK_PW, rr->rr_name, rr->rr_namelen); mp = mdt_object_find_lock(info, rr->rr_fid2, lhp, - MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(mp)) RETURN(PTR_ERR(mp)); @@ -859,8 +853,7 @@ static int mdt_reint_link(struct mdt_thread_info *info, lhs = &info->mti_lh[MDT_LH_CHILD]; mdt_lock_reg_init(lhs, LCK_EX); - ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1, - MDT_OBJ_MUST_EXIST); + ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1); if (IS_ERR(ms)) GOTO(out_unlock_parent, rc = PTR_ERR(ms)); @@ -959,8 +952,7 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) mdt_lock_pdo_init(lh_tgtdir, LCK_PW, rr->rr_tgt, rr->rr_tgtlen); mtgtdir = mdt_object_find_lock(info, rr->rr_fid1, lh_tgtdir, - MDS_INODELOCK_UPDATE, - MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(mtgtdir)) RETURN(PTR_ERR(mtgtdir)); @@ -983,8 +975,7 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) mdt_lock_reg_init(lh_tgt, LCK_EX); mtgt = mdt_object_find_lock(info, tgt_fid, lh_tgt, - MDS_INODELOCK_LOOKUP, - MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_LOOKUP); if (IS_ERR(mtgt)) GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt)); @@ -1080,8 +1071,7 @@ static int mdt_rename_sanity(struct mdt_thread_info *info, struct lu_fid *fid) do { LASSERT(fid_is_sane(&dst_fid)); - dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid, - MDT_OBJ_MUST_EXIST); + dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid); if (!IS_ERR(dst)) { rc = mdo_is_subdir(info->mti_env, mdt_object_child(dst), fid, @@ -1154,8 +1144,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, mdt_lock_pdo_init(lh_srcdirp, LCK_PW, rr->rr_name, rr->rr_namelen); msrcdir = mdt_object_find_lock(info, rr->rr_fid1, lh_srcdirp, - MDS_INODELOCK_UPDATE, - MDT_OBJ_MUST_EXIST); + MDS_INODELOCK_UPDATE); if (IS_ERR(msrcdir)) GOTO(out_rename_lock, rc = PTR_ERR(msrcdir)); @@ -1179,7 +1168,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, } } else { mtgtdir = mdt_object_find(info->mti_env, info->mti_mdt, - rr->rr_fid2, MDT_OBJ_MUST_EXIST); + rr->rr_fid2); if (IS_ERR(mtgtdir)) GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir)); @@ -1188,7 +1177,10 @@ static int mdt_reint_rename(struct mdt_thread_info *info, if (rc) GOTO(out_put_target, rc); - if (mdt_object_exists(mtgtdir) > 0) { + rc = mdt_object_exists(mtgtdir); + if (rc == 0) { + GOTO(out_put_target, rc = -ESTALE); + } else if (rc > 0) { /* we lock the target dir if it is local */ rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp, MDS_INODELOCK_UPDATE, @@ -1210,8 +1202,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, if (lu_fid_eq(old_fid, rr->rr_fid1) || lu_fid_eq(old_fid, rr->rr_fid2)) GOTO(out_unlock_target, rc = -EINVAL); - mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid, - MDT_OBJ_MUST_EXIST); + mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid); if (IS_ERR(mold)) GOTO(out_unlock_target, rc = PTR_ERR(mold)); @@ -1244,8 +1235,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, GOTO(out_unlock_old, rc = -EINVAL); mdt_lock_reg_init(lh_newp, LCK_EX); - mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid, - MDT_OBJ_MAY_NOT_EXIST); + mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid); if (IS_ERR(mnew)) GOTO(out_unlock_old, rc = PTR_ERR(mnew)); diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 0a34a9b..f3b5537 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -359,8 +359,7 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, /* ACLs were sent to clients under LCK_CR locks, so taking LCK_EX * to cancel them. */ mdt_lock_reg_init(lh, LCK_EX); - obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart, - MDT_OBJ_MUST_EXIST); + obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart); if (IS_ERR(obj)) GOTO(out, rc = PTR_ERR(obj)); -- 1.8.3.1