#define DEBUG_SUBSYSTEM S_OSC
-#include <libcfs/libcfs.h>
/* fid_build_reg_res_name() */
#include <lustre_fid.h>
#include <lustre_osc.h>
if (! ergo(ols->ols_state == OLS_GRANTED,
olock != NULL &&
- olock->l_req_mode == olock->l_granted_mode &&
+ ldlm_is_granted(olock) &&
ols->ols_hold))
return 0;
return 1;
/* Lock must have been granted. */
lock_res_and_lock(dlmlock);
- if (dlmlock->l_granted_mode == dlmlock->l_req_mode) {
+ if (ldlm_is_granted(dlmlock)) {
struct ldlm_extent *ext = &dlmlock->l_policy_data.l_extent;
struct cl_lock_descr *descr = &oscl->ols_cl.cls_lock->cll_descr;
LASSERT(dlmlock != NULL);
lock_res_and_lock(dlmlock);
- LASSERT(dlmlock->l_granted_mode == dlmlock->l_req_mode);
+ LASSERT(ldlm_is_granted(dlmlock));
/* there is no osc_lock associated with speculative locks */
osc_lock_lvb_update(env, osc, dlmlock, NULL);
rc = 0;
}
- rc2 = osc_lock_discard_pages(env, obj, start, end, discard);
+ /*
+ * Do not try to match other locks with CLM_WRITE since we already
+ * know there're none
+ */
+ rc2 = osc_lock_discard_pages(env, obj, start, end,
+ mode == CLM_WRITE || discard);
if (rc == 0 && rc2 < 0)
rc = rc2;
LASSERT(flag == LDLM_CB_CANCELING);
lock_res_and_lock(dlmlock);
- if (dlmlock->l_granted_mode != dlmlock->l_req_mode) {
+ if (!ldlm_is_granted(dlmlock)) {
dlmlock->l_ast_data = NULL;
unlock_res_and_lock(dlmlock);
RETURN(0);
{
struct cl_page *page = ops->ops_cl.cpl_page;
- if (cl_page_is_vmlocked(env, page)
- || PageDirty(page->cp_vmpage) || PageWriteback(page->cp_vmpage)
- )
+ if (cl_page_is_vmlocked(env, page) || PageDirty(page->cp_vmpage) ||
+ PageWriteback(page->cp_vmpage))
return CLP_GANG_ABORT;
*(pgoff_t *)cbdata = osc_index(ops) + 1;
static unsigned long osc_lock_weight(const struct lu_env *env,
struct osc_object *oscobj,
- struct ldlm_extent *extent)
+ loff_t start, loff_t end)
{
- struct cl_io *io = osc_env_thread_io(env);
+ struct cl_io *io = osc_env_thread_io(env);
struct cl_object *obj = cl_object_top(&oscobj->oo_cl);
- pgoff_t page_index;
- int result;
+ pgoff_t page_index;
+ int result;
+
ENTRY;
io->ci_obj = obj;
if (result != 0)
RETURN(result);
- page_index = cl_index(obj, extent->start);
+ page_index = cl_index(obj, start);
do {
result = osc_page_gang_lookup(env, io, oscobj,
- page_index,
- cl_index(obj, extent->end),
+ page_index, cl_index(obj, end),
weigh_cb, (void *)&page_index);
if (result == CLP_GANG_ABORT)
break;
*/
unsigned long osc_ldlm_weigh_ast(struct ldlm_lock *dlmlock)
{
- struct lu_env *env;
- struct osc_object *obj;
- struct osc_lock *oscl;
- unsigned long weight;
- bool found = false;
- __u16 refcheck;
+ struct lu_env *env;
+ struct osc_object *obj;
+ struct osc_lock *oscl;
+ unsigned long weight;
+ bool found = false;
+ __u16 refcheck;
+
ENTRY;
might_sleep();
/* Mostly because lack of memory, do not eliminate this lock */
RETURN(1);
- LASSERT(dlmlock->l_resource->lr_type == LDLM_EXTENT);
+ LASSERT(dlmlock->l_resource->lr_type == LDLM_EXTENT ||
+ dlmlock->l_resource->lr_type == LDLM_IBITS);
+
lock_res_and_lock(dlmlock);
obj = dlmlock->l_ast_data;
if (obj)
spin_lock(&obj->oo_ol_spin);
list_for_each_entry(oscl, &obj->oo_ol_list, ols_nextlock_oscobj) {
- if (oscl->ols_dlmlock != NULL && oscl->ols_dlmlock != dlmlock)
- continue;
- found = true;
+ if (oscl->ols_dlmlock == dlmlock) {
+ found = true;
+ break;
+ }
}
spin_unlock(&obj->oo_ol_spin);
if (found) {
GOTO(out, weight = 1);
}
- weight = osc_lock_weight(env, obj, &dlmlock->l_policy_data.l_extent);
+ if (dlmlock->l_resource->lr_type == LDLM_EXTENT)
+ weight = osc_lock_weight(env, obj,
+ dlmlock->l_policy_data.l_extent.start,
+ dlmlock->l_policy_data.l_extent.end);
+ else if (ldlm_has_dom(dlmlock))
+ weight = osc_lock_weight(env, obj, 0, OBD_OBJECT_EOF);
+ /* The DOM bit can be cancelled at any time; in that case, we know
+ * there are no pages, so just return weight of 0
+ */
+ else
+ weight = 0;
+
EXIT;
out:
cl_env_put(env, &refcheck);
return weight;
}
+EXPORT_SYMBOL(osc_ldlm_weigh_ast);
static void osc_lock_build_einfo(const struct lu_env *env,
const struct cl_lock *lock,
continue;
/* wait for conflicting lock to be canceled */
- cl_sync_io_init(waiter, 1, cl_sync_io_end);
+ cl_sync_io_init(waiter, 1);
oscl->ols_owner = waiter;
spin_lock(&tmp_oscl->ols_lock);
return;
if (likely(io->ci_type == CIT_WRITE)) {
- io_start = cl_index(obj, io->u.ci_rw.rw_range.cir_pos);
- io_end = cl_index(obj, io->u.ci_rw.rw_range.cir_pos +
- io->u.ci_rw.rw_range.cir_count - 1);
+ io_start = cl_index(obj, io->u.ci_rw.crw_pos);
+ io_end = cl_index(obj, io->u.ci_rw.crw_pos +
+ io->u.ci_rw.crw_count - 1);
} else {
LASSERT(cl_io_is_mkwrite(io));
io_start = io_end = io->u.ci_fault.ft_index;