static void lovsub_parent_lock(const struct lu_env *env, struct lov_lock *lov)
{
- struct cl_lock *parent;
-
- ENTRY;
- parent = lov->lls_cl.cls_lock;
- cl_lock_get(parent);
- lu_ref_add(&parent->cll_reference, "lovsub-parent", cfs_current());
- cl_lock_mutex_get(env, parent);
- EXIT;
+ struct cl_lock *parent;
+
+ ENTRY;
+ parent = lov->lls_cl.cls_lock;
+ cl_lock_get(parent);
+ lu_ref_add(&parent->cll_reference, "lovsub-parent", current);
+ cl_lock_mutex_get(env, parent);
+ EXIT;
}
static void lovsub_parent_unlock(const struct lu_env *env, struct lov_lock *lov)
{
- struct cl_lock *parent;
-
- ENTRY;
- parent = lov->lls_cl.cls_lock;
- cl_lock_mutex_put(env, lov->lls_cl.cls_lock);
- lu_ref_del(&parent->cll_reference, "lovsub-parent", cfs_current());
- cl_lock_put(env, parent);
- EXIT;
+ struct cl_lock *parent;
+
+ ENTRY;
+ parent = lov->lls_cl.cls_lock;
+ cl_lock_mutex_put(env, lov->lls_cl.cls_lock);
+ lu_ref_del(&parent->cll_reference, "lovsub-parent", current);
+ cl_lock_put(env, parent);
+ EXIT;
}
/**
pd->cld_mode = parent_descr->cld_mode;
pd->cld_gid = parent_descr->cld_gid;
lovsub_lock_descr_map(d, subobj->lso_super, subobj->lso_index, pd);
- lov->lls_sub[idx].sub_got = *d;
+
+ /* 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;
/*
* Notify top-lock about modification, if lock description changes
* materially.
RETURN(0);
result = 0;
+ lov->lls_ever_canceled = 1;
switch (parent->cll_state) {
case CLS_ENQUEUED:
/* See LU-1355 for the case that a glimpse lock is
};
int lovsub_lock_init(const struct lu_env *env, struct cl_object *obj,
- struct cl_lock *lock, const struct cl_io *io)
+ struct cl_lock *lock, const struct cl_io *io)
{
- struct lovsub_lock *lsk;
- int result;
-
- ENTRY;
- OBD_SLAB_ALLOC_PTR_GFP(lsk, lovsub_lock_kmem, __GFP_IO);
- if (lsk != NULL) {
- CFS_INIT_LIST_HEAD(&lsk->lss_parents);
- cl_lock_slice_add(lock, &lsk->lss_cl, obj, &lovsub_lock_ops);
- result = 0;
- } else
- result = -ENOMEM;
- RETURN(result);
+ struct lovsub_lock *lsk;
+ int result;
+
+ ENTRY;
+ OBD_SLAB_ALLOC_PTR_GFP(lsk, lovsub_lock_kmem, GFP_NOFS);
+ if (lsk != NULL) {
+ CFS_INIT_LIST_HEAD(&lsk->lss_parents);
+ cl_lock_slice_add(lock, &lsk->lss_cl, obj, &lovsub_lock_ops);
+ result = 0;
+ } else
+ result = -ENOMEM;
+ RETURN(result);
}
/** @} lov */