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

ofd_create_hdl returns 0 instead of ENOSPC causing ESTALE on MDS

    XMLWordPrintable

Details

    • 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

          Activity

            People

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

              Dates

                Created:
                Updated:
                Resolved: