Whamcloud - gitweb
LU-11536 ofd: ofd_create_hdl may return 0 in case of ENOSPC 90/33390/3
authorSergey Cheremencev <c17829@cray.com>
Mon, 25 Jun 2018 15:52:11 +0000 (18:52 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 2 Nov 2018 07:17:19 +0000 (07:17 +0000)
ostid_set_id rewrites ofd_precreate_objects result after
"LU-6401 uapi: fix up lustre_ostid.h and lustre_fid.h".
This breakes the logic of osp_precreate_reserve() causing
osp_precreate_send() to return ESTALE instead of ENOSPC
when OST can't precreate objects.
osp_precreate_send() returns ESTALE because the result of
create is 0 while last created fid on OST is still the same
with local last_id:

fs1-OST0001-osc-MDT0000: precreate fid [0x100010000:0x571607f:0x0] <
local used fid [0x100010000:0x571607f:0x0]: rc = -116
fs1-OST0001-osc-MDT0000: precreate failed opd_pre_status -116
fs1-OST0001-osc-MDT0000: cannot precreate objects: rc = -116

Change-Id: I4dc057c201253cab14e63c1f06bd5b0d56b5ad2d
Signed-off-by: Sergey Cheremencev <c17829@cray.com>
Fixes: 34acfbc2bfe502d18c12ba35771bde7c4a0f7906
Reviewed-on: https://es-gerrit.dev.cray.com/153462
Reviewed-by: Andriy Skulysh <c17819@cray.com>
Reviewed-by: Artem Blagodarenko <c17828@cray.com>
Tested-by: Alexander Lezhoev <c17454@cray.com>
Reviewed-on: https://review.whamcloud.com/33390
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ofd/ofd_dev.c
lustre/osp/osp_precreate.c

index bdbbe76..86ffa1e 100644 (file)
@@ -1621,6 +1621,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
                u64 next_id;
                int created = 0;
                int count;
                u64 next_id;
                int created = 0;
                int count;
+               int rc2;
 
                if (!(oa->o_valid & OBD_MD_FLFLAGS) ||
                    !(oa->o_flags & OBD_FL_DELORPHAN)) {
 
                if (!(oa->o_valid & OBD_MD_FLFLAGS) ||
                    !(oa->o_flags & OBD_FL_DELORPHAN)) {
@@ -1708,7 +1709,8 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
                        granted = 0;
                }
 
                        granted = 0;
                }
 
-               rc = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
+               rc2 = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
+               rc = rc ? : rc2;
        }
        EXIT;
        ofd_counter_incr(exp, LPROC_OFD_STATS_CREATE,
        }
        EXIT;
        ofd_counter_incr(exp, LPROC_OFD_STATS_CREATE,
index aedec3d..937e9ac 100644 (file)
@@ -665,7 +665,7 @@ static int osp_precreate_send(const struct lu_env *env, struct osp_device *d)
 
 ready:
        if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) {
 
 ready:
        if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) {
-               CERROR("%s: precreate fid "DFID" < local used fid "DFID
+               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);
                       ": rc = %d\n", d->opd_obd->obd_name,
                       PFID(fid), PFID(&d->opd_pre_used_fid), -ESTALE);
                GOTO(out_req, rc = -ESTALE);