Whamcloud - gitweb
LU-15894 ofd: revert range locking in ofd
[fs/lustre-release.git] / lustre / ofd / ofd_dev.c
index 5440c05..0c43df0 100644 (file)
@@ -544,7 +544,6 @@ static struct lu_object *ofd_object_alloc(const struct lu_env *env,
                lu_object_init(o, h, d);
                lu_object_add_top(h, o);
                o->lo_ops = &ofd_obj_ops;
-               range_lock_tree_init(&of->ofo_write_tree);
                RETURN(o);
        } else {
                RETURN(NULL);
@@ -910,6 +909,19 @@ static int ofd_set_info_hdl(struct tgt_session_info *tsi)
        if (is_grant_shrink) {
                body = req_capsule_client_get(tsi->tsi_pill, &RMF_OST_BODY);
 
+               /*
+                * Because we already sync grant info with client when
+                * reconnect, grant info will be cleared for resent
+                * req, otherwise, outdated grant count in the rpc
+                * would de-sync grant counters
+                */
+               if (lustre_msg_get_flags(req->rq_reqmsg) &
+                   (MSG_RESENT | MSG_REPLAY)) {
+                       DEBUG_REQ(D_CACHE, req,
+                                 "clear resent/replay req grant info");
+                       body->oa.o_valid &= ~OBD_MD_FLGRANT;
+               }
+
                repbody = req_capsule_server_get(tsi->tsi_pill, &RMF_OST_BODY);
                *repbody = *body;
 
@@ -1157,6 +1169,9 @@ static int ofd_get_info_hdl(struct tgt_session_info *tsi)
                if (rc)
                        RETURN(err_serious(rc));
 
+               if (OBD_FAIL_CHECK(OBD_FAIL_OST_GET_LAST_FID))
+                       RETURN(-EAGAIN);
+
                fid = req_capsule_client_get(tsi->tsi_pill, &RMF_FID);
                if (fid == NULL)
                        RETURN(err_serious(-EPROTO));
@@ -1170,12 +1185,12 @@ static int ofd_get_info_hdl(struct tgt_session_info *tsi)
                oseq = ofd_seq_load(tsi->tsi_env, ofd,
                                    ostid_seq(&fti->fti_ostid));
                if (IS_ERR(oseq))
-                       RETURN(PTR_ERR(oseq));
+                       RETURN(-EFAULT);
 
                rc = ostid_to_fid(fid, &oseq->os_oi,
                                  ofd->ofd_lut.lut_lsd.lsd_osd_index);
                if (rc != 0)
-                       GOTO(out_put, rc);
+                       GOTO(out_put, rc = -EFAULT);
 
                CDEBUG(D_HA, "%s: LAST FID is "DFID"\n", ofd_name(ofd),
                       PFID(fid));
@@ -1623,7 +1638,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
                                GOTO(out, rc = -EINVAL);
                        }
 
-                       if (diff < 0) {
+                       if (diff <= -OST_MAX_PRECREATE) {
                                /* LU-5648 */
                                CERROR("%s: invalid precreate request for "
                                       DOSTID", last_id %llu. "
@@ -1631,6 +1646,15 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
                                       ofd_name(ofd), POSTID(&oa->o_oi),
                                       ofd_seq_last_oid(oseq));
                                GOTO(out, rc = -EINVAL);
+                       } else if (diff < 0) {
+                               LCONSOLE(D_INFO,
+                                        "%s: MDS LAST_ID "DFID" (%llu) is %lld behind OST LAST_ID "DFID" (%llu), trust the OST\n",
+                                        ofd_name(ofd), PFID(&oa->o_oi.oi_fid),
+                                        oid, -diff, PFID(&oseq->os_oi.oi_fid),
+                                        ofd_seq_last_oid(oseq));
+                               /* Let MDS know that we are so far ahead. */
+                               rc = ostid_set_id(&rep_oa->o_oi,
+                                                 ofd_seq_last_oid(oseq) + 1);
                        }
                }
        }
@@ -1948,6 +1972,7 @@ static int ofd_fallocate_hdl(struct tgt_session_info *tsi)
        struct ldlm_resource *res;
        struct ofd_object *fo;
        __u64 flags = 0;
+       __u64 valid;
        struct lustre_handle lh = { 0, };
        int rc, mode;
        __u64 start, end;
@@ -1959,15 +1984,30 @@ static int ofd_fallocate_hdl(struct tgt_session_info *tsi)
                RETURN(err_serious(-ENOMEM));
 
        /*
-        * fallocate start and end are passed in o_size, o_blocks
-        * on the wire.
+        * fallocate() start and end are passed in o_size and o_blocks
+        * on the wire.  Clients 2.15.0 and newer should always set
+        * the OBD_MD_FLSIZE and OBD_MD_FLBLOCKS valid flags, but some
+        * older client versions did not.  We permit older clients to
+        * not set these flags, checking their version by proxy using
+        * the lack of OBD_CONNECT_TRUNCLOCK to imply 2.14.0 and older.
+        *
+        * Return -EOPNOTSUPP to also work with older clients not
+        * supporting newer server modes.
         */
        if ((oa->o_valid & (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) !=
-           (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS))
-               RETURN(err_serious(-EPROTO));
+           (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 21, 53, 0)
+           && (tgt_conn_flags(tsi) & OBD_CONNECT_OLD_FALLOC)
+#endif
+           )
+               RETURN(-EOPNOTSUPP);
 
        start = oa->o_size;
        end = oa->o_blocks;
+       /* client should already limit len >= 0 */
+       if (start >= end)
+               RETURN(-EINVAL);
+
        mode = oa->o_falloc_mode;
        /*
         * mode == 0 (which is standard prealloc) and PUNCH is supported
@@ -2004,8 +2044,9 @@ static int ofd_fallocate_hdl(struct tgt_session_info *tsi)
        if (IS_ERR(fo))
                GOTO(out, rc = PTR_ERR(fo));
 
-       la_from_obdo(&info->fti_attr, oa,
-                    OBD_MD_FLMTIME | OBD_MD_FLATIME | OBD_MD_FLCTIME);
+       valid = OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLPROJID |
+               OBD_MD_FLATIME | OBD_MD_FLMTIME | OBD_MD_FLCTIME;
+       la_from_obdo(&info->fti_attr, oa, valid);
 
        rc = ofd_object_fallocate(tsi->tsi_env, fo, start, end, mode,
                                 &info->fti_attr, oa);
@@ -2014,8 +2055,7 @@ static int ofd_fallocate_hdl(struct tgt_session_info *tsi)
 
        rc = ofd_attr_get(tsi->tsi_env, fo, &info->fti_attr);
        if (rc == 0)
-               obdo_from_la(&repbody->oa, &info->fti_attr,
-                            OFD_VALID_FLAGS);
+               obdo_from_la(&repbody->oa, &info->fti_attr, OFD_VALID_FLAGS);
        else
                rc = 0;
 
@@ -2080,9 +2120,6 @@ static int ofd_punch_hdl(struct tgt_session_info *tsi)
 
        OBD_FAIL_TIMEOUT(OBD_FAIL_OST_PAUSE_PUNCH, cfs_fail_val);
 
-       /* check that we do support OBD_CONNECT_TRUNCLOCK. */
-       BUILD_BUG_ON(!(OST_CONNECT_SUPPORTED & OBD_CONNECT_TRUNCLOCK));
-
        if ((oa->o_valid & (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) !=
            (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS))
                RETURN(err_serious(-EPROTO));
@@ -2391,6 +2428,10 @@ static int ofd_quotactl(struct tgt_session_info *tsi)
                id = nodemap_map_id(nodemap, NODEMAP_GID,
                                    NODEMAP_CLIENT_TO_FS,
                                    repoqc->qc_id);
+       else if (oqctl->qc_type == PRJQUOTA)
+               id = nodemap_map_id(nodemap, NODEMAP_PROJID,
+                                   NODEMAP_CLIENT_TO_FS,
+                                   repoqc->qc_id);
 
        nodemap_putref(nodemap);