* 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."
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."
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) {
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);
}
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;
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"
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 |
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"
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;
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));
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);
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));
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));