Whamcloud - gitweb
LU-10212 ldlm: fix prolong for destroyed lock
[fs/lustre-release.git] / lustre / ofd / ofd_dev.c
index 6c0abd0..8ac0469 100644 (file)
@@ -1332,6 +1332,16 @@ static int ofd_getattr_hdl(struct tgt_session_info *tsi)
                        repbody->oa.o_valid |= OBD_MD_FLDATAVERSION;
                        repbody->oa.o_data_version = curr_version;
                }
+
+               if (fo->ofo_ff.ff_layout_version > 0) {
+                       repbody->oa.o_valid |= OBD_MD_LAYOUT_VERSION;
+                       repbody->oa.o_layout_version =
+                            fo->ofo_ff.ff_layout_version + fo->ofo_ff.ff_range;
+
+                       CDEBUG(D_INODE, DFID": get layout version: %u\n",
+                              PFID(&tsi->tsi_fid),
+                              repbody->oa.o_layout_version);
+               }
        }
 
        ofd_object_put(tsi->tsi_env, fo);
@@ -1367,7 +1377,6 @@ static int ofd_setattr_hdl(struct tgt_session_info *tsi)
        struct ost_body         *repbody;
        struct ldlm_resource    *res;
        struct ofd_object       *fo;
-       struct filter_fid       *ff = NULL;
        int                      rc = 0;
 
        ENTRY;
@@ -1407,13 +1416,8 @@ static int ofd_setattr_hdl(struct tgt_session_info *tsi)
        la_from_obdo(&fti->fti_attr, &body->oa, body->oa.o_valid);
        fti->fti_attr.la_valid &= ~LA_TYPE;
 
-       if (body->oa.o_valid & OBD_MD_FLFID) {
-               ff = &fti->fti_mds_fid;
-               ofd_prepare_fidea(ff, &body->oa);
-       }
-
        /* setting objects attributes (including owner/group) */
-       rc = ofd_attr_set(tsi->tsi_env, fo, &fti->fti_attr, ff);
+       rc = ofd_attr_set(tsi->tsi_env, fo, &fti->fti_attr, &body->oa);
        if (rc != 0)
                GOTO(out_put, rc);
 
@@ -1922,6 +1926,8 @@ static int ofd_statfs_hdl(struct tgt_session_info *tsi)
 
        ENTRY;
 
+       OBD_FAIL_TIMEOUT(OBD_FAIL_OST_STATFS_DELAY, 10);
+
        osfs = req_capsule_server_get(tsi->tsi_pill, &RMF_OBD_STATFS);
 
        rc = ofd_statfs(tsi->tsi_env, tsi->tsi_exp, osfs,
@@ -2017,7 +2023,6 @@ static int ofd_punch_hdl(struct tgt_session_info *tsi)
        struct ldlm_namespace   *ns = tsi->tsi_tgt->lut_obd->obd_namespace;
        struct ldlm_resource    *res;
        struct ofd_object       *fo;
-       struct filter_fid       *ff = NULL;
        __u64                    flags = 0;
        struct lustre_handle     lh = { 0, };
        int                      rc;
@@ -2078,13 +2083,8 @@ static int ofd_punch_hdl(struct tgt_session_info *tsi)
        info->fti_attr.la_size = start;
        info->fti_attr.la_valid |= LA_SIZE;
 
-       if (oa->o_valid & OBD_MD_FLFID) {
-               ff = &info->fti_mds_fid;
-               ofd_prepare_fidea(ff, oa);
-       }
-
        rc = ofd_object_punch(tsi->tsi_env, fo, start, end, &info->fti_attr,
-                             ff, (struct obdo *)oa);
+                             (struct obdo *)oa);
        if (rc)
                GOTO(out_put, rc);
 
@@ -2430,10 +2430,14 @@ static void ofd_prolong_extent_locks(struct tgt_session_info *tsi,
                                LASSERT(lock->l_export == data->lpa_export);
                                ldlm_lock_prolong_one(lock, data);
                                LDLM_LOCK_PUT(lock);
-                               RETURN_EXIT;
+                               if (data->lpa_locks_cnt > 0)
+                                       RETURN_EXIT;
+                               /* The lock was destroyed probably lets try
+                                * resource tree. */
+                       } else {
+                               lock->l_last_used = ktime_get();
+                               LDLM_LOCK_PUT(lock);
                        }
-                       lock->l_last_used = ktime_get();
-                       LDLM_LOCK_PUT(lock);
                }
        }