Otherwise it will cause wrong lock to be enqueued.
lls_ever_canceled is introduced to solve potential performance
problem by this patch.
Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: I1ea62902c9d1a468f5952f30a8dc5dec22b8bb1c
Reviewed-on: http://review.whamcloud.com/7841
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
* Set when sub-lock was canceled, while top-lock was being
* used, or unused.
*/
* Set when sub-lock was canceled, while top-lock was being
* used, or unused.
*/
- unsigned int lls_cancel_race:1;
+ unsigned int lls_cancel_race:1,
+ lls_ever_canceled:1;
/**
* An array of sub-locks
*
/**
* An array of sub-locks
*
if (need->cld_enq_flags != lov->lls_orig.cld_enq_flags)
return 0;
if (need->cld_enq_flags != lov->lls_orig.cld_enq_flags)
return 0;
+ if (lov->lls_ever_canceled)
+ return 0;
+
if (need->cld_mode == CLM_GROUP)
/*
* always allow to match group lock.
if (need->cld_mode == CLM_GROUP)
/*
* always allow to match group lock.
pd->cld_gid = parent_descr->cld_gid;
lovsub_lock_descr_map(d, subobj->lso_super, subobj->lso_index, pd);
pd->cld_gid = parent_descr->cld_gid;
lovsub_lock_descr_map(d, subobj->lso_super, subobj->lso_index, pd);
- /* LU-3027: only update extent of lock */
+ /* LU-3027: only update extent of lock, plus the change in
+ * lovsub_lock_delete() that lock extent is modified after a sublock
+ * is canceled, we can make sure that the lock extent won't be updated
+ * any more. Therefore, lov_lock_fits_into() will always find feasible
+ * locks */
lov->lls_sub[idx].sub_got.cld_start = d->cld_start;
lov->lls_sub[idx].sub_got.cld_end = d->cld_end;
/*
lov->lls_sub[idx].sub_got.cld_start = d->cld_start;
lov->lls_sub[idx].sub_got.cld_end = d->cld_end;
/*
+ lov->lls_ever_canceled = 1;
switch (parent->cll_state) {
case CLS_ENQUEUED:
/* See LU-1355 for the case that a glimpse lock is
switch (parent->cll_state) {
case CLS_ENQUEUED:
/* See LU-1355 for the case that a glimpse lock is
struct lov_lock *lov;
struct lov_lock_link *scan;
struct lov_lock_link *temp;
struct lov_lock *lov;
struct lov_lock_link *scan;
struct lov_lock_link *temp;
- struct lov_lock_sub *subdata;
restart = 0;
cfs_list_for_each_entry_safe(scan, temp,
&sub->lss_parents, lll_list) {
lov = scan->lll_super;
restart = 0;
cfs_list_for_each_entry_safe(scan, temp,
&sub->lss_parents, lll_list) {
lov = scan->lll_super;
- subdata = &lov->lls_sub[scan->lll_idx];
lovsub_parent_lock(env, lov);
lovsub_parent_lock(env, lov);
- subdata->sub_got = subdata->sub_descr;
lov_lock_unlink(env, scan, sub);
restart = lovsub_lock_delete_one(env, child, lov);
lovsub_parent_unlock(env, lov);
lov_lock_unlink(env, scan, sub);
restart = lovsub_lock_delete_one(env, child, lov);
lovsub_parent_unlock(env, lov);