Uploaded image for project: 'Lustre'
  1. Lustre
  2. LU-11536

ofd_create_hdl returns 0 instead of ENOSPC causing ESTALE on MDS

XMLWordPrintable

    • 3
    • 9223372036854775807

       

      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.
       

            scherementsev Sergey Cheremencev
            scherementsev Sergey Cheremencev
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: