enum osc_lock_state ols_state;
/** lock value block */
struct ost_lvb ols_lvb;
+ /** back pointer to osc_io */
+ struct osc_io *ols_oio;
/** Lockless operations to be used by lockless lock */
const struct cl_lock_operations *ols_lockless_ops;
/**
osc_lru_unreserve(osc_cli(osc), oio->oi_lru_reserved);
oio->oi_lru_reserved = 0;
}
- oio->oi_write_osclock = NULL;
- oio->oi_read_osclock = NULL;
osc_io_iter_fini(env, ios);
}
void osc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice)
{
- struct osc_lock *ols = cl2osc_lock(slice);
+ struct osc_lock *ols = cl2osc_lock(slice);
LINVRNT(osc_lock_invariant(ols));
LASSERT(ols->ols_dlmlock == NULL);
+ if (ols->ols_oio) {
+ ols->ols_oio->oi_write_osclock = NULL;
+ ols->ols_oio->oi_read_osclock = NULL;
+ }
+
OBD_SLAB_FREE_PTR(ols, osc_lock_kmem);
}
EXPORT_SYMBOL(osc_lock_fini);
/* There must be only one lock to match the write region */
LASSERT(oio->oi_write_osclock == NULL);
oio->oi_write_osclock = oscl;
+ oscl->ols_oio = oio;
}
}
EXPORT_SYMBOL(osc_lock_set_writer);
if (oscl->ols_glimpse || osc_lock_is_lockless(oscl))
return;
- if (oio->oi_read_osclock == NULL)
+ if (oio->oi_read_osclock == NULL) {
oio->oi_read_osclock = oscl;
+ oscl->ols_oio = oio;
+ }
}
EXPORT_SYMBOL(osc_lock_set_reader);