Skip to content

Commit

Permalink
lockref: add 'lockref_get_or_lock() helper
Browse files Browse the repository at this point in the history
This behaves like "lockref_get_not_zero()", but instead of doing nothing
if the count was zero, it returns with the lock held.

This allows callers to revalidate the lockref-protected data structure
if required even if the count was zero to begin with, and possibly
increment the count if it passes muster.

In particular, the dentry code wants this when it wants to turn an
RCU-protected dentry into a stable refcounted one: if the dentry count
it zero, but the sequence number still validates the dentry, we can take
a reference to it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Linus Torvalds committed Sep 2, 2013
1 parent 9847423 commit b3abd80
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions include/linux/lockref.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,22 @@ static inline int lockref_get_not_zero(struct lockref *lockref)
return retval;
}

/**
* lockref_get_or_lock - Increments count unless the count is 0
* @lockcnt: pointer to lockref structure
* Return: 1 if count updated successfully or 0 if count was zero
* and we got the lock instead.
*/
static inline int lockref_get_or_lock(struct lockref *lockref)
{
spin_lock(&lockref->lock);
if (!lockref->count)
return 0;
lockref->count++;
spin_unlock(&lockref->lock);
return 1;
}

/**
* lockref_put_or_lock - decrements count unless count <= 1 before decrement
* @lockcnt: pointer to lockref structure
Expand Down

0 comments on commit b3abd80

Please sign in to comment.