Details
-
Bug
-
Resolution: Fixed
-
Major
-
None
-
None
-
3
-
9223372036854775807
Description
During code analysis I found that LU-6401 brakes ENOSPC handling logic in OSP.
osp_precreate_send() returns -ESTALE when OST can't precreate objects i.e. -ENOSPACE:
if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) { CERROR("%s: precreate fid "DFID" < local used fid "DFID": rc = %d\n", d->opd_obd->obd_name, PFID(fid), PFID(&d->opd_pre_used_fid), -ESTALE); GOTO(out_req, rc = -ESTALE); }
However it is not correct. In case of -ENOSPC on OST, MDS should get -ENOSPC.
For example osp_precreat_reserve() forces local commit to release space and waits for OBD_TIMEOUT.
I think "LU-6401 uapi: fix up lustre_ostid.h and lustre_fid.h" broke this logic:
@@ -1781,7 +1781,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi) granted = 0; } - ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq)); + rc = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq)); } EXIT;
After the patch OST returns 0 in case when osp_precreate_objects() returns -ENOSPC.
Attachments
Issue Links
- is duplicated by
-
LU-11588 ofd_create_hdl() shouldn't overwrite error code
- Resolved