+ struct tgt_session_info *tsi;
+ struct obd_ioobj *ioo;
+ struct niobuf_remote *rnb;
+ int opc;
+ struct ldlm_prolong_args pa = { 0 };
+
+ ENTRY;
+
+ /* Don't use tgt_ses_info() to get session info, because lock_match()
+ * can be called while request has no processing thread yet. */
+ tsi = lu_context_key_get(&req->rq_session, &tgt_session_key);
+
+ /*
+ * Use LASSERT below because malformed RPCs should have
+ * been filtered out in tgt_hpreq_handler().
+ */
+ opc = lustre_msg_get_opc(req->rq_reqmsg);
+ LASSERT(opc == OST_READ || opc == OST_WRITE);
+
+ ioo = req_capsule_client_get(&req->rq_pill, &RMF_OBD_IOOBJ);
+ LASSERT(ioo != NULL);
+
+ rnb = req_capsule_client_get(&req->rq_pill, &RMF_NIOBUF_REMOTE);
+ LASSERT(rnb != NULL);
+ LASSERT(!(rnb->rnb_flags & OBD_BRW_SRVLOCK));
+
+ pa.lpa_mode = LCK_PW;
+ if (opc == OST_READ)
+ pa.lpa_mode |= LCK_PR;
+
+ DEBUG_REQ(D_RPCTRACE, req, "%s %s: refresh rw locks: "DFID"\n",
+ tgt_name(tsi->tsi_tgt), current->comm, PFID(&tsi->tsi_fid));
+
+ mdt_prolong_dom_lock(tsi, &pa);
+
+ if (pa.lpa_blocks_cnt > 0) {
+ CDEBUG(D_DLMTRACE,
+ "%s: refreshed %u locks timeout for req %p.\n",
+ tgt_name(tsi->tsi_tgt), pa.lpa_blocks_cnt, req);
+ RETURN(1);
+ }
+
+ RETURN(pa.lpa_locks_cnt > 0 ? 0 : -ESTALE);