lockref
spin_lock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
spin_lock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
struct lockref lockref;
spin_lock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
spin_lock(&pcl->lockref.lock);
if (pcl->lockref.count <= 0) {
spin_unlock(&pcl->lockref.lock);
spin_lock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
if (lockref_get_not_zero(&pcl->lockref))
spin_lock(&pcl->lockref.lock);
if (__lockref_is_dead(&pcl->lockref)) {
spin_unlock(&pcl->lockref.lock);
if (!pcl->lockref.count++)
spin_unlock(&pcl->lockref.lock);
lockref_init(&pcl->lockref); /* one ref for this request */
if (pcl->lockref.count)
lockref_mark_dead(&pcl->lockref);
spin_lock(&pcl->lockref.lock);
spin_unlock(&pcl->lockref.lock);
if (lockref_put_or_lock(&pcl->lockref))
DBG_BUGON(__lockref_is_dead(&pcl->lockref));
if (!--pcl->lockref.count) {
spin_unlock(&pcl->lockref.lock);
struct lockref gl_lockref;
struct lockref qd_lockref;
struct lockref b_lockref; /* refcount + lock */
struct lockref q_lockref;
struct lockref d_lockref; /* per-dentry lock and refcount
static inline void lockref_init(struct lockref *lockref)
spin_lock_init(&lockref->lock);
lockref->count = 1;
void lockref_get(struct lockref *lockref);
int lockref_put_return(struct lockref *lockref);
bool lockref_get_not_zero(struct lockref *lockref);
bool lockref_put_or_lock(struct lockref *lockref) __cond_acquires(false, &lockref->lock);
void lockref_mark_dead(struct lockref *lockref);
bool lockref_get_not_dead(struct lockref *lockref);
static inline bool __lockref_is_dead(const struct lockref *l)
bool lockref_put_or_lock(struct lockref *lockref)
spin_lock(&lockref->lock);
if (lockref->count <= 1)
lockref->count--;
spin_unlock(&lockref->lock);
struct lockref old; \
void lockref_mark_dead(struct lockref *lockref)
assert_spin_locked(&lockref->lock);
lockref->count = -128;
bool lockref_get_not_dead(struct lockref *lockref)
old.lock_count = READ_ONCE(lockref->lock_count); \
spin_lock(&lockref->lock);
if (lockref->count >= 0) {
lockref->count++;
spin_unlock(&lockref->lock);
struct lockref new = old; \
if (likely(try_cmpxchg64_relaxed(&lockref->lock_count, \
void lockref_get(struct lockref *lockref)
spin_lock(&lockref->lock);
lockref->count++;
spin_unlock(&lockref->lock);
bool lockref_get_not_zero(struct lockref *lockref)
spin_lock(&lockref->lock);
if (lockref->count > 0) {
lockref->count++;
spin_unlock(&lockref->lock);
int lockref_put_return(struct lockref *lockref)