From fdc754e444b02c6d6bd984fd919181fb9797c1a2 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 | 61 ++++++++++++++++++++++++++--------------------- 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(+), 81 deletions(-) diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 9d7a61f..16cdad5 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -1673,4 +1673,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 7d0be2b..983b4e3 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)); @@ -968,7 +969,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)); @@ -1004,13 +1006,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; @@ -2037,7 +2032,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; @@ -2046,9 +2042,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); } @@ -2325,11 +2328,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; @@ -2433,10 +2437,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 */ @@ -5360,19 +5365,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); @@ -5469,9 +5471,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) { @@ -5481,12 +5487,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 { + } else if (rc > 0) { version = mo_version_get(mti->mti_env, mdt_object_child(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 e5e2556..fffb8b3 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -438,6 +438,11 @@ static inline void mdt_trans_add_cb(const struct thandle *th, txi->txi_cb_count++; } +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) { @@ -510,6 +515,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); @@ -539,11 +549,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 e708584..6e5bd68 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -932,7 +932,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." @@ -943,7 +944,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." @@ -1003,9 +1005,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) { @@ -1016,9 +1019,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); @@ -1032,7 +1033,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; @@ -1048,7 +1049,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" @@ -1061,18 +1063,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 | @@ -1091,14 +1093,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" @@ -1115,9 +1118,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; @@ -1139,7 +1143,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)); @@ -1231,7 +1236,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); @@ -1277,7 +1282,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)); @@ -1321,7 +1326,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 50c69eb..7152450 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -183,7 +183,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; @@ -1101,7 +1101,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." @@ -1143,7 +1144,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 78a6874..ef422a9 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); @@ -495,7 +498,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)); @@ -696,7 +700,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 */ @@ -739,7 +743,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]; @@ -827,7 +832,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)); @@ -847,7 +853,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)); @@ -859,7 +865,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)); @@ -958,7 +965,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)); @@ -981,7 +989,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)); @@ -1077,7 +1086,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, @@ -1150,7 +1160,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)); @@ -1174,7 +1185,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)); @@ -1183,10 +1194,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, @@ -1208,7 +1216,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)); @@ -1241,7 +1250,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 6cfb1e2..404e178 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