req_timeout);
}
+static void mdt_dom_resource_prolong(struct ldlm_prolong_args *arg)
+{
+ struct ldlm_resource *res;
+ struct ldlm_lock *lock;
+
+ ENTRY;
+
+ res = ldlm_resource_get(arg->lpa_export->exp_obd->obd_namespace, NULL,
+ &arg->lpa_resid, LDLM_EXTENT, 0);
+ if (IS_ERR(res)) {
+ CDEBUG(D_DLMTRACE,
+ "Failed to get resource for resid %llu/%llu\n",
+ arg->lpa_resid.name[0], arg->lpa_resid.name[1]);
+ RETURN_EXIT;
+ }
+
+ lock_res(res);
+ list_for_each_entry(lock, &res->lr_granted, l_res_link) {
+ if (ldlm_has_dom(lock)) {
+ LDLM_DEBUG(lock, "DOM lock to prolong ");
+ ldlm_lock_prolong_one(lock, arg);
+ break;
+ }
+ }
+ unlock_res(res);
+ ldlm_resource_putref(res);
+
+ EXIT;
+}
+
static void mdt_prolong_dom_lock(struct tgt_session_info *tsi,
struct ldlm_prolong_args *data)
{
ldlm_lock_prolong_one(lock, data);
lock->l_last_used = ktime_get();
LDLM_LOCK_PUT(lock);
- RETURN_EXIT;
+ if (data->lpa_locks_cnt > 0)
+ RETURN_EXIT;
}
}
+ mdt_dom_resource_prolong(data);
EXIT;
}
oa->o_flags = OBD_FL_NO_GRPQUOTA;
}
+ if (lnb[0].lnb_flags & OBD_BRW_OVER_PRJQUOTA) {
+ if (oa->o_valid & OBD_MD_FLFLAGS)
+ oa->o_flags |= OBD_FL_NO_PRJQUOTA;
+ else
+ oa->o_flags = OBD_FL_NO_PRJQUOTA;
+ }
+
oa->o_valid |= OBD_MD_FLFLAGS | OBD_MD_FLUSRQUOTA |
- OBD_MD_FLGRPQUOTA;
+ OBD_MD_FLGRPQUOTA | OBD_MD_FLPRJQUOTA;
}
} else if (cmd == OBD_BRW_READ) {
/* If oa != NULL then mdt_preprw_read updated the inode
/* Update lvbo data if DoM lock returned or if LVB is not yet valid. */
if (dom_lock || !mdt_dom_lvb_is_valid(res))
- mdt_dom_lvbo_update(res, NULL, NULL, false);
+ mdt_dom_lvbo_update(env, res, NULL, NULL, false);
mdt_lvb2body(res, mb);
ldlm_resource_putref(res);
fill_mbo:
/* LVB can be without valid data in case of DOM */
if (!mdt_dom_lvb_is_valid(res))
- mdt_dom_lvbo_update(res, lock, NULL, false);
+ mdt_dom_lvbo_update(mti->mti_env, res, lock, NULL, false);
mdt_lvb2body(res, mbo);
RETURN(rc);
}
/* Tell the clients that the object is gone now and that they should
* throw away any cached pages. */
- rc = ldlm_cli_enqueue_local(mdt->mdt_namespace, res_id, LDLM_IBITS,
- policy, LCK_PW, &flags, ldlm_blocking_ast,
- ldlm_completion_ast, NULL, NULL, 0,
- LVB_T_NONE, NULL, &dom_lh);
+ rc = ldlm_cli_enqueue_local(info->mti_env, mdt->mdt_namespace, res_id,
+ LDLM_IBITS, policy, LCK_PW, &flags,
+ ldlm_blocking_ast, ldlm_completion_ast,
+ NULL, NULL, 0, LVB_T_NONE, NULL, &dom_lh);
/* We only care about the side-effects, just drop the lock. */
if (rc == ELDLM_OK)
- ldlm_lock_decref(&dom_lh, LCK_PW);
+ ldlm_lock_decref_and_cancel(&dom_lh, LCK_PW);
}
/* check if client has already DoM lock for given resource */