mdt_finish_open and mdt_open_by_fid_lock set DISP_LOOKUP_POS
and DISP_OPEN_OPEN a bit too eagerly only to have later code add
negative disposition and a lookup error, confusing a client
with such self-contradicting replies in the end.
This patch only sets positive dispositions when we are sure
not to get them overruled.
Change-Id: I3389f1d59b21f4a9e4c16ca75b398785ea6e130c
Signed-off-by: Oleg Drokin <green@whamcloud.com
Reviewed-on: http://review.whamcloud.com/4459
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: wangdi <di.wang@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
- mdt_set_disposition(info, rep, DISP_OPEN_OPEN);
-
/*
* We need to return the existing object's fid back, so it is done here,
* after preparing the reply.
/*
* We need to return the existing object's fid back, so it is done here,
* after preparing the reply.
else
repbody->valid |= OBD_MD_FLEASIZE;
}
else
repbody->valid |= OBD_MD_FLEASIZE;
}
+ mdt_set_disposition(info, rep, DISP_OPEN_OPEN);
RETURN(0);
}
}
rc = mdt_mfd_open(info, p, o, flags, created);
RETURN(0);
}
}
rc = mdt_mfd_open(info, p, o, flags, created);
+ if (!rc)
+ mdt_set_disposition(info, rep, DISP_OPEN_OPEN);
+
GOTO(out, rc);
}
mdt_set_disposition(info, rep, (DISP_IT_EXECD |
GOTO(out, rc);
}
mdt_set_disposition(info, rep, (DISP_IT_EXECD |
- DISP_LOOKUP_EXECD |
- DISP_LOOKUP_POS));
if (flags & FMODE_WRITE)
lm = LCK_CW;
if (flags & FMODE_WRITE)
lm = LCK_CW;
- if (flags & MDS_OPEN_LOCK)
- mdt_set_disposition(info, rep, DISP_OPEN_LOCK);
rc = mdt_finish_open(info, parent, o, flags, 0, rep);
if (!(flags & MDS_OPEN_LOCK) || rc)
mdt_object_unlock(info, o, lhc, 1);
rc = mdt_finish_open(info, parent, o, flags, 0, rep);
if (!(flags & MDS_OPEN_LOCK) || rc)
mdt_object_unlock(info, o, lhc, 1);
+ if (!rc) {
+ mdt_set_disposition(info, rep, DISP_LOOKUP_POS);
+ if (flags & MDS_OPEN_LOCK)
+ mdt_set_disposition(info, rep, DISP_OPEN_LOCK);
+ }
+
GOTO(out, rc);
out:
mdt_object_put(env, o);
GOTO(out, rc);
out:
mdt_object_put(env, o);
created, ldlm_rep);
if (rc) {
result = rc;
created, ldlm_rep);
if (rc) {
result = rc;
- if (lustre_handle_is_used(&lhc->mlh_reg_lh))
+ if (lustre_handle_is_used(&lhc->mlh_reg_lh)) {
/* openlock was acquired and mdt_finish_open failed -
drop the openlock */
mdt_object_unlock(info, child, lhc, 1);
/* openlock was acquired and mdt_finish_open failed -
drop the openlock */
mdt_object_unlock(info, child, lhc, 1);
+ mdt_clear_disposition(info, ldlm_rep, DISP_OPEN_LOCK);
+ }
if (created) {
ma->ma_need = 0;
ma->ma_valid = 0;
if (created) {
ma->ma_need = 0;
ma->ma_valid = 0;
&info->mti_attr);
if (rc != 0)
CERROR("Error in cleanup of open\n");
&info->mti_attr);
if (rc != 0)
CERROR("Error in cleanup of open\n");
+ mdt_clear_disposition(info, ldlm_rep, DISP_OPEN_CREATE);