LDLM_LOCK_GET(lock);
spin_unlock_bh(&waiting_locks_spinlock);
LDLM_DEBUG(lock, "prolong the busy lock");
- ldlm_refresh_waiting_lock(lock);
+ ldlm_refresh_waiting_lock(lock,
+ ldlm_get_enq_timeout(lock));
spin_lock_bh(&waiting_locks_spinlock);
if (!cont) {
*
* Called with the namespace lock held.
*/
-static int __ldlm_add_waiting_lock(struct ldlm_lock *lock)
+static int __ldlm_add_waiting_lock(struct ldlm_lock *lock, int seconds)
{
cfs_time_t timeout;
cfs_time_t timeout_rounded;
if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_HPREQ_NOTIMEOUT) ||
OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_HPREQ_TIMEOUT))
- timeout = 2;
- else
- timeout = ldlm_get_enq_timeout(lock);
+ seconds = 2;
- timeout = cfs_time_shift(timeout);
+ timeout = cfs_time_shift(seconds);
if (likely(cfs_time_after(timeout, lock->l_callback_timeout)))
lock->l_callback_timeout = timeout;
return 0;
}
- ret = __ldlm_add_waiting_lock(lock);
+ ret = __ldlm_add_waiting_lock(lock, ldlm_get_enq_timeout(lock));
if (ret)
/* grab ref on the lock if it has been added to the
* waiting list */
*
* Called with namespace lock held.
*/
-int ldlm_refresh_waiting_lock(struct ldlm_lock *lock)
+int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout)
{
if (lock->l_export == NULL) {
/* We don't have a "waiting locks list" on clients. */
/* we remove/add the lock to the waiting list, so no needs to
* release/take a lock reference */
__ldlm_del_waiting_lock(lock);
- __ldlm_add_waiting_lock(lock);
+ __ldlm_add_waiting_lock(lock, timeout);
spin_unlock_bh(&waiting_locks_spinlock);
LDLM_DEBUG(lock, "refreshed");
RETURN(0);
}
-int ldlm_refresh_waiting_lock(struct ldlm_lock *lock)
+int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout)
{
RETURN(0);
}
struct obdo *opd_oa;
ldlm_mode_t opd_mode;
int opd_lock_match;
+ int opd_timeout;
};
static int ost_prolong_locks_iter(struct ldlm_lock *lock, void *data)
/* OK. this is a possible lock the user holds doing I/O
* let's refresh eviction timer for it */
- ldlm_refresh_waiting_lock(lock);
+ ldlm_refresh_waiting_lock(lock, opd->opd_timeout);
opd->opd_lock_match = 1;
return LDLM_ITER_CONTINUE;
}
-static int ost_rw_prolong_locks(struct obd_export *exp, struct obd_ioobj *obj,
+static int ost_rw_prolong_locks(struct ptlrpc_request *req, struct obd_ioobj *obj,
struct niobuf_remote *nb, struct obdo *oa,
ldlm_mode_t mode)
{
osc_build_res_name(obj->ioo_id, obj->ioo_gr, &res_id);
opd.opd_mode = mode;
- opd.opd_exp = exp;
+ opd.opd_exp = req->rq_export;
opd.opd_policy.l_extent.start = nb[0].offset & CFS_PAGE_MASK;
opd.opd_policy.l_extent.end = (nb[nrbufs - 1].offset +
nb[nrbufs - 1].len - 1) | ~CFS_PAGE_MASK;
+ /* prolong locks for the current service time of the corresponding
+ * portal (= OST_IO_PORTAL) */
+ opd.opd_timeout = AT_OFF ? obd_timeout / 2:
+ max(at_est2timeout(at_get(&req->rq_rqbd->
+ rqbd_service->srv_at_estimate)), ldlm_timeout);
+
CDEBUG(D_DLMTRACE,"refresh locks: "LPU64"/"LPU64" ("LPU64"->"LPU64")\n",
res_id.name[0], res_id.name[1], opd.opd_policy.l_extent.start,
opd.opd_policy.l_extent.end);
}
opd.opd_oa = oa;
- ldlm_resource_iterate(exp->exp_obd->obd_namespace, &res_id,
+ ldlm_resource_iterate(req->rq_export->exp_obd->obd_namespace, &res_id,
ost_prolong_locks_iter, &opd);
RETURN(opd.opd_lock_match);
}
if (desc == NULL) /* XXX: check all cleanup stuff */
GOTO(out, rc = -ENOMEM);
- ost_rw_prolong_locks(exp, ioo, remote_nb, &body->oa, LCK_PW | LCK_PR);
+ ost_rw_prolong_locks(req, ioo, remote_nb, &body->oa, LCK_PW | LCK_PR);
nob = 0;
for (i = 0; i < npages; i++) {
GOTO(out_lock, rc = -ETIMEDOUT);
}
- ost_rw_prolong_locks(exp, ioo, remote_nb,&body->oa, LCK_PW);
+ ost_rw_prolong_locks(req, ioo, remote_nb,&body->oa, LCK_PW);
/* obd_preprw clobbers oa->valid, so save what we need */
if (body->oa.o_valid & OBD_MD_FLCKSUM) {
mode = LCK_PW;
if (opc == OST_READ)
mode |= LCK_PR;
- RETURN(ost_rw_prolong_locks(req->rq_export, ioo, nb, &body->oa, mode));
+ RETURN(ost_rw_prolong_locks(req, ioo, nb, &body->oa, mode));
}
-static int ost_punch_prolong_locks(struct obd_export *exp, struct obdo *oa)
+static int ost_punch_prolong_locks(struct ptlrpc_request *req, struct obdo *oa)
{
struct ldlm_res_id res_id = { .name = { oa->o_id } };
struct ost_prolong_data opd = { 0 };
end = start + oa->o_blocks;
opd.opd_mode = LCK_PW;
- opd.opd_exp = exp;
+ opd.opd_exp = req->rq_export;
opd.opd_policy.l_extent.start = start & CFS_PAGE_MASK;
if (oa->o_blocks == OBD_OBJECT_EOF || end < start)
opd.opd_policy.l_extent.end = OBD_OBJECT_EOF;
else
opd.opd_policy.l_extent.end = end | ~CFS_PAGE_MASK;
+ /* prolong locks for the current service time of the corresponding
+ * portal (= OST_IO_PORTAL) */
+ opd.opd_timeout = AT_OFF ? obd_timeout / 2:
+ max(at_est2timeout(at_get(&req->rq_rqbd->
+ rqbd_service->srv_at_estimate)), ldlm_timeout);
+
CDEBUG(D_DLMTRACE,"refresh locks: "LPU64"/"LPU64" ("LPU64"->"LPU64")\n",
res_id.name[0], res_id.name[1], opd.opd_policy.l_extent.start,
opd.opd_policy.l_extent.end);
opd.opd_oa = oa;
- ldlm_resource_iterate(exp->exp_obd->obd_namespace, &res_id,
+ ldlm_resource_iterate(req->rq_export->exp_obd->obd_namespace, &res_id,
ost_prolong_locks_iter, &opd);
RETURN(opd.opd_lock_match);
}
LASSERT(!(body->oa.o_valid & OBD_MD_FLFLAGS) ||
!(body->oa.o_flags & OBD_FL_TRUNCLOCK));
- RETURN(ost_punch_prolong_locks(req->rq_export, &body->oa));
+ RETURN(ost_punch_prolong_locks(req, &body->oa));
}
struct ptlrpc_hpreq_ops ost_hpreq_rw = {