From 3391572fec45a200345942eac138a8fdfcf80b89 Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Mon, 9 Jan 2012 18:23:41 +0800 Subject: [PATCH] LU-966 mdd: mdd object may not be exist If MDT device has been checked with fsck, some mdd objects could be removed, so that recovery replay could act on non-existing objects. Signed-off-by: Bobi Jam Change-Id: If3a3b72ee70ab2513978ed968c9598ddde11c085 Reviewed-on: http://review.whamcloud.com/1928 Reviewed-by: Fan Yong Reviewed-by: Mikhail Pershin Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/include/obd.h | 12 +++++++++ lustre/mdt/mdt_handler.c | 64 +++++++++++++++++++++++++---------------------- lustre/mdt/mdt_internal.h | 16 ++++++++++-- lustre/mdt/mdt_open.c | 60 ++++++++++++++++++++++++-------------------- lustre/mdt/mdt_recovery.c | 8 +++--- lustre/mdt/mdt_reint.c | 52 ++++++++++++++++++++++---------------- lustre/mdt/mdt_xattr.c | 3 ++- 7 files changed, 131 insertions(+), 84 deletions(-) diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 03e5921..965fd22 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -1737,4 +1737,16 @@ static inline int client_should_resend(int resend, struct client_obd *cli) cfs_atomic_read(&cli->cl_resends) > resend : 1; } +/** + * Return device name for this device + * + * XXX: lu_device is declared before obd_device, while a pointer pointing + * back to obd_device in lu_device, so this helper function defines here + * instead of in lu_object.h + */ +static inline const char *lu_dev_name(const struct lu_device *lu_dev) +{ + return lu_dev->ld_obd->obd_name; +} + #endif /* __OBD_H */ diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 37dd329..021b681 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -325,7 +325,8 @@ 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); + root = mdt_object_find(info->mti_env, mdt, &repbody->fid1, + MDT_OBJ_MUST_EXIST); if (IS_ERR(root)) RETURN(PTR_ERR(root)); @@ -995,7 +996,8 @@ 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); + child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid, + MDT_OBJ_MUST_EXIST); if (unlikely(IS_ERR(child))) GOTO(out_parent, rc = PTR_ERR(child)); @@ -1031,13 +1033,6 @@ relock: mdt_lock_handle_init(lhc); 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; @@ -2066,7 +2061,8 @@ 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) + const struct lu_fid *f, + enum mdt_obj_exist check_exist) { struct lu_object *o; struct mdt_object *m; @@ -2075,9 +2071,16 @@ 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))) - m = (struct mdt_object *)o; + RETURN((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); } @@ -2354,11 +2357,12 @@ 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) + __u64 ibits, + enum mdt_obj_exist check_exist) { struct mdt_object *o; - o = mdt_object_find(info->mti_env, info->mti_mdt, f); + o = mdt_object_find(info->mti_env, info->mti_mdt, f, check_exist); if (!IS_ERR(o)) { int rc; @@ -2462,10 +2466,11 @@ 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); + obj = mdt_object_find(env, info->mti_mdt, &body->fid1, + MDT_OBJ_MAY_NOT_EXIST); if (!IS_ERR(obj)) { if ((flags & HABEO_CORPUS) && - !mdt_object_exists(obj)) { + mdt_object_exists(obj) == 0) { mdt_object_put(env, obj); /* for capability renew ENOENT will be handled in * mdt_renew_capa */ @@ -5366,19 +5371,16 @@ 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); + obj = mdt_object_find(env, mdt, &fp->gf_fid, MDT_OBJ_MUST_EXIST); if (obj == NULL || IS_ERR(obj)) { - CDEBUG(D_IOCTL, "no object "DFID": %ld\n",PFID(&fp->gf_fid), + CDEBUG(D_IOCTL, "%s: no object "DFID": %ld\n", + mdt2obd_dev(mdt)->obd_name, PFID(&fp->gf_fid), PTR_ERR(obj)); - RETURN(-EINVAL); + RETURN(obj == NULL ? -EINVAL : PTR_ERR(obj)); } - rc = lu_object_exists(&obj->mot_obj.mo_lu); - if (rc <= 0) { - if (rc == -1) - rc = -EREMOTE; - else - rc = -ENOENT; + if (lu_object_exists(&obj->mot_obj.mo_lu) < 0) { + rc = -EREMOTE; mdt_object_put(env, obj); CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n", PFID(&fp->gf_fid), rc); @@ -5476,9 +5478,13 @@ 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); - if (IS_ERR(obj)) + 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; RETURN(PTR_ERR(obj)); + } rc = mdt_object_exists(obj); if (rc < 0) { @@ -5488,15 +5494,13 @@ 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) { - *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION; - rc = -ENOENT; - } else { + } else if (rc > 0) { 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 7782a11..b2889ed 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -413,6 +413,11 @@ 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) { @@ -485,6 +490,11 @@ 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); @@ -514,11 +524,13 @@ 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 *); + const struct lu_fid *, + enum mdt_obj_exist check_exist); struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *, const struct lu_fid *, struct mdt_lock_handle *, - __u64); + __u64 ibits, + enum mdt_obj_exist check_exist); 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 90b26b2..6e886ad 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -936,7 +936,8 @@ 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); + parent = mdt_object_find(env, mdt, rr->rr_fid1, + MDT_OBJ_MUST_EXIST); if (IS_ERR(parent)) { rc = PTR_ERR(parent); LCONSOLE_WARN("Parent "DFID" lookup error %d." @@ -947,7 +948,8 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, mdt_export_evict(exp); RETURN_EXIT; } - child = mdt_object_find(env, mdt, rr->rr_fid2); + child = mdt_object_find(env, mdt, rr->rr_fid2, + MDT_OBJ_MAY_NOT_EXIST); if (IS_ERR(child)) { rc = PTR_ERR(child); LCONSOLE_WARN("Child "DFID" lookup error %d." @@ -1007,9 +1009,10 @@ static 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); + o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2, + MDT_OBJ_MUST_EXIST); if (IS_ERR(o)) - RETURN(rc = PTR_ERR(o)); + RETURN(PTR_ERR(o)); rc = mdt_object_exists(o); if (rc > 0) { @@ -1020,9 +1023,7 @@ static 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) { - rc = -ENOENT; - } else { + } else if (rc < 0) { /* the child object was created on remote server */ struct mdt_body *repbody; repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); @@ -1036,7 +1037,7 @@ static int mdt_open_by_fid(struct mdt_thread_info* info, } static int mdt_open_anon_by_fid(struct mdt_thread_info *info, - struct ldlm_reply *rep, + struct ldlm_reply *rep, struct mdt_lock_handle *lhc) { const struct lu_env *env = info->mti_env; @@ -1052,7 +1053,8 @@ static 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); + parent = mdt_object_find(env, mdt, rr->rr_fid1, + MDT_OBJ_MUST_EXIST); if (IS_ERR(parent)) { CDEBUG(D_INODE, "Fail to find parent "DFID " for anonymous created %ld, try to" @@ -1065,18 +1067,18 @@ static 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); - if (IS_ERR(o)) - RETURN(rc = PTR_ERR(o)); + 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)); + } rc = mdt_object_exists(o); - if (rc == 0) { - mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD | - DISP_LOOKUP_NEG)); - GOTO(out, rc = -ENOENT); - } else if (rc < 0) { + if (rc < 0) { CERROR("NFS remote open shouldn't happen.\n"); - GOTO(out, rc); + GOTO(out_child, rc); } mdt_set_disposition(info, rep, (DISP_IT_EXECD | DISP_LOOKUP_EXECD | @@ -1095,14 +1097,15 @@ static int mdt_open_anon_by_fid(struct mdt_thread_info *info, MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN, MDT_CROSS_LOCK); if (rc) - GOTO(out, rc); + GOTO(out_child, rc); rc = mo_attr_get(env, mdt_object_child(o), ma); if (rc) - GOTO(out, rc); + GOTO(out_child, rc); if (ma->ma_valid & MA_PFID) { - parent = mdt_object_find(env, mdt, &ma->ma_pfid); + parent = mdt_object_find(env, mdt, &ma->ma_pfid, + MDT_OBJ_MUST_EXIST); if (IS_ERR(parent)) { CDEBUG(D_INODE, "Fail to find parent "DFID " for anonymous created %ld, try to" @@ -1119,9 +1122,10 @@ static 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, rc); -out: + GOTO(out_child, rc); +out_child: mdt_object_put(env, o); +out_parent: if (parent != NULL) mdt_object_put(env, parent); return rc; @@ -1143,7 +1147,8 @@ static int mdt_cross_open(struct mdt_thread_info* info, int rc; ENTRY; - o = mdt_object_find(info->mti_env, info->mti_mdt, fid); + o = mdt_object_find(info->mti_env, info->mti_mdt, fid, + MDT_OBJ_MAY_NOT_EXIST); if (IS_ERR(o)) RETURN(rc = PTR_ERR(o)); @@ -1235,7 +1240,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); @@ -1281,7 +1286,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); + MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); if (IS_ERR(parent)) GOTO(out, result = PTR_ERR(parent)); @@ -1325,7 +1330,8 @@ 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); + child = mdt_object_find(info->mti_env, mdt, child_fid, + MDT_OBJ_MAY_NOT_EXIST); 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 2ea6ed8..bfd5042 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -163,7 +163,7 @@ static int mdt_last_rcvd_header_write(const struct lu_env *env, } static int mdt_last_rcvd_read(const struct lu_env *env, struct mdt_device *mdt, - struct lsd_client_data *lcd, loff_t *off, + struct lsd_client_data *lcd, loff_t *off, int index) { struct mdt_thread_info *mti; @@ -1089,7 +1089,8 @@ 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); + child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2, + MDT_OBJ_MUST_EXIST); if (IS_ERR(child)) { rc = PTR_ERR(child); LCONSOLE_WARN("Child "DFID" lookup error %d." @@ -1131,7 +1132,8 @@ 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); + obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1, + MDT_OBJ_MUST_EXIST); 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 9922b82..523003c 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -250,7 +250,8 @@ 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); + child = mdt_object_find(info->mti_env, info->mti_mdt, fid, + MDT_OBJ_MAY_NOT_EXIST); if (likely(!IS_ERR(child))) { mdt_obj_version_get(info, child, &info->mti_ver[idx]); mdt_object_put(info->mti_env, child); @@ -291,7 +292,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); + MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); if (IS_ERR(parent)) RETURN(PTR_ERR(parent)); @@ -313,7 +314,8 @@ 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); + child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2, + MDT_OBJ_MAY_NOT_EXIST); if (likely(!IS_ERR(child))) { struct md_object *next = mdt_object_child(parent); @@ -379,7 +381,8 @@ 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); + o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2, + MDT_OBJ_MAY_NOT_EXIST); if (!IS_ERR(o)) { struct md_object *next = mdt_object_child(o); @@ -488,7 +491,8 @@ 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); + mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1, + MDT_OBJ_MUST_EXIST); if (IS_ERR(mo)) GOTO(out, rc = PTR_ERR(mo)); @@ -690,7 +694,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); + MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); if (IS_ERR(mp)) { rc = PTR_ERR(mp); /* errors are possible here in cross-ref cases, see below */ @@ -733,7 +737,8 @@ 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); + mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid, + MDT_OBJ_MUST_EXIST); if (IS_ERR(mc)) GOTO(out_unlock_parent, rc = PTR_ERR(mc)); child_lh = &info->mti_lh[MDT_LH_CHILD]; @@ -821,7 +826,8 @@ 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); + MDS_INODELOCK_UPDATE, + MDT_OBJ_MUST_EXIST); if (IS_ERR(ms)) RETURN(PTR_ERR(ms)); @@ -841,7 +847,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); + MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST); if (IS_ERR(mp)) RETURN(PTR_ERR(mp)); @@ -853,7 +859,8 @@ 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); + ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1, + MDT_OBJ_MUST_EXIST); if (IS_ERR(ms)) GOTO(out_unlock_parent, rc = PTR_ERR(ms)); @@ -952,7 +959,8 @@ 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); + MDS_INODELOCK_UPDATE, + MDT_OBJ_MUST_EXIST); if (IS_ERR(mtgtdir)) RETURN(PTR_ERR(mtgtdir)); @@ -975,7 +983,8 @@ 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); + MDS_INODELOCK_LOOKUP, + MDT_OBJ_MUST_EXIST); if (IS_ERR(mtgt)) GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt)); @@ -1071,7 +1080,8 @@ 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); + dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid, + MDT_OBJ_MUST_EXIST); if (!IS_ERR(dst)) { rc = mdo_is_subdir(info->mti_env, mdt_object_child(dst), fid, @@ -1144,7 +1154,8 @@ 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); + MDS_INODELOCK_UPDATE, + MDT_OBJ_MUST_EXIST); if (IS_ERR(msrcdir)) GOTO(out_rename_lock, rc = PTR_ERR(msrcdir)); @@ -1168,7 +1179,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); + rr->rr_fid2, MDT_OBJ_MUST_EXIST); if (IS_ERR(mtgtdir)) GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir)); @@ -1177,10 +1188,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, if (rc) GOTO(out_put_target, rc); - rc = mdt_object_exists(mtgtdir); - if (rc == 0) { - GOTO(out_put_target, rc = -ESTALE); - } else if (rc > 0) { + if (mdt_object_exists(mtgtdir) > 0) { /* we lock the target dir if it is local */ rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp, MDS_INODELOCK_UPDATE, @@ -1202,7 +1210,8 @@ 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); + mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid, + MDT_OBJ_MUST_EXIST); if (IS_ERR(mold)) GOTO(out_unlock_target, rc = PTR_ERR(mold)); @@ -1235,7 +1244,8 @@ 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); + mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid, + MDT_OBJ_MAY_NOT_EXIST); 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 f3b5537..0a34a9b 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -359,7 +359,8 @@ 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); + obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart, + MDT_OBJ_MUST_EXIST); if (IS_ERR(obj)) GOTO(out, rc = PTR_ERR(obj)); -- 1.8.3.1