diff options
| author | Christian Brauner <brauner@kernel.org> | 2025-01-15 11:50:29 +0100 | 
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2025-01-16 11:48:12 +0100 | 
| commit | c859df526b203497227b2b16c9bebcede67221e4 (patch) | |
| tree | b3263043b3e9b19a1d1c26d1b7de991c2fb80585 | |
| parent | 4f3b63e8a8a28e3dcdcf3ff260f57a732a20b92b (diff) | |
| parent | 3e652eba244c222b0ba95a3f6fd79315eb020f73 (diff) | |
Merge patch series "lockref cleanups"
Christoph Hellwig <hch@lst.de> says:
This series has a bunch of cosmetic cleanups for the lockref code I came up
with when reading the code in preparation of adding a new user of it.
* patches from https://lore.kernel.org/r/20250115094702.504610-1-hch@lst.de:
  gfs2: use lockref_init for qd_lockref
  erofs: use lockref_init for pcl->lockref
  dcache: use lockref_init for d_lockref
  lockref: add a lockref_init helper
  lockref: drop superfluous externs
  lockref: use bool for false/true returns
  lockref: improve the lockref_get_not_zero description
  lockref: remove lockref_put_not_zero
Link: https://lore.kernel.org/r/20250115094702.504610-1-hch@lst.de
Signed-off-by: Christian Brauner <brauner@kernel.org>
| -rw-r--r-- | fs/dcache.c | 3 | ||||
| -rw-r--r-- | fs/erofs/zdata.c | 3 | ||||
| -rw-r--r-- | fs/gfs2/quota.c | 3 | ||||
| -rw-r--r-- | include/linux/lockref.h | 26 | ||||
| -rw-r--r-- | lib/lockref.c | 60 | 
5 files changed, 36 insertions, 59 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index b4d5e9e1e43d..1a01d7a6a7a9 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1681,9 +1681,8 @@ static struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)  	/* Make sure we always see the terminating NUL character */  	smp_store_release(&dentry->d_name.name, dname); /* ^^^ */ -	dentry->d_lockref.count = 1;  	dentry->d_flags = 0; -	spin_lock_init(&dentry->d_lock); +	lockref_init(&dentry->d_lockref, 1);  	seqcount_spinlock_init(&dentry->d_seq, &dentry->d_lock);  	dentry->d_inode = NULL;  	dentry->d_parent = dentry; diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index 01f147505487..59f143d9744f 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -747,8 +747,7 @@ static int z_erofs_register_pcluster(struct z_erofs_decompress_frontend *fe)  	if (IS_ERR(pcl))  		return PTR_ERR(pcl); -	spin_lock_init(&pcl->lockref.lock); -	pcl->lockref.count = 1;		/* one ref for this request */ +	lockref_init(&pcl->lockref, 1); /* one ref for this request */  	pcl->algorithmformat = map->m_algorithmformat;  	pcl->length = 0;  	pcl->partial = true; diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 72b48f6f5561..58bc5013ca49 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -236,8 +236,7 @@ static struct gfs2_quota_data *qd_alloc(unsigned hash, struct gfs2_sbd *sdp, str  		return NULL;  	qd->qd_sbd = sdp; -	qd->qd_lockref.count = 0; -	spin_lock_init(&qd->qd_lockref.lock); +	lockref_init(&qd->qd_lockref, 0);  	qd->qd_id = qid;  	qd->qd_slot = -1;  	INIT_LIST_HEAD(&qd->qd_lru); diff --git a/include/linux/lockref.h b/include/linux/lockref.h index c3a1f78bc884..c39f119659ba 100644 --- a/include/linux/lockref.h +++ b/include/linux/lockref.h @@ -34,14 +34,24 @@ struct lockref {  	};  }; -extern void lockref_get(struct lockref *); -extern int lockref_put_return(struct lockref *); -extern int lockref_get_not_zero(struct lockref *); -extern int lockref_put_not_zero(struct lockref *); -extern int lockref_put_or_lock(struct lockref *); - -extern void lockref_mark_dead(struct lockref *); -extern int lockref_get_not_dead(struct lockref *); +/** + * lockref_init - Initialize a lockref + * @lockref: pointer to lockref structure + * @count: initial count + */ +static inline void lockref_init(struct lockref *lockref, unsigned int count) +{ +	spin_lock_init(&lockref->lock); +	lockref->count = count; +} + +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); + +void lockref_mark_dead(struct lockref *lockref); +bool lockref_get_not_dead(struct lockref *lockref);  /* Must be called under spinlock for reliable results */  static inline bool __lockref_is_dead(const struct lockref *l) diff --git a/lib/lockref.c b/lib/lockref.c index 2afe4c5d8919..5d8e3ef3860e 100644 --- a/lib/lockref.c +++ b/lib/lockref.c @@ -58,23 +58,22 @@ EXPORT_SYMBOL(lockref_get);   * @lockref: pointer to lockref structure   * Return: 1 if count updated successfully or 0 if count was zero   */ -int lockref_get_not_zero(struct lockref *lockref) +bool lockref_get_not_zero(struct lockref *lockref)  { -	int retval; +	bool retval = false;  	CMPXCHG_LOOP(  		new.count++;  		if (old.count <= 0) -			return 0; +			return false;  	, -		return 1; +		return true;  	);  	spin_lock(&lockref->lock); -	retval = 0;  	if (lockref->count > 0) {  		lockref->count++; -		retval = 1; +		retval = true;  	}  	spin_unlock(&lockref->lock);  	return retval; @@ -82,39 +81,11 @@ int lockref_get_not_zero(struct lockref *lockref)  EXPORT_SYMBOL(lockref_get_not_zero);  /** - * lockref_put_not_zero - Decrements count unless count <= 1 before decrement - * @lockref: pointer to lockref structure - * Return: 1 if count updated successfully or 0 if count would become zero - */ -int lockref_put_not_zero(struct lockref *lockref) -{ -	int retval; - -	CMPXCHG_LOOP( -		new.count--; -		if (old.count <= 1) -			return 0; -	, -		return 1; -	); - -	spin_lock(&lockref->lock); -	retval = 0; -	if (lockref->count > 1) { -		lockref->count--; -		retval = 1; -	} -	spin_unlock(&lockref->lock); -	return retval; -} -EXPORT_SYMBOL(lockref_put_not_zero); - -/**   * lockref_put_return - Decrement reference count if possible   * @lockref: pointer to lockref structure   *   * Decrement the reference count and return the new value. - * If the lockref was dead or locked, return an error. + * If the lockref was dead or locked, return -1.   */  int lockref_put_return(struct lockref *lockref)  { @@ -134,22 +105,22 @@ EXPORT_SYMBOL(lockref_put_return);   * @lockref: pointer to lockref structure   * Return: 1 if count updated successfully or 0 if count <= 1 and lock taken   */ -int lockref_put_or_lock(struct lockref *lockref) +bool lockref_put_or_lock(struct lockref *lockref)  {  	CMPXCHG_LOOP(  		new.count--;  		if (old.count <= 1)  			break;  	, -		return 1; +		return true;  	);  	spin_lock(&lockref->lock);  	if (lockref->count <= 1) -		return 0; +		return false;  	lockref->count--;  	spin_unlock(&lockref->lock); -	return 1; +	return true;  }  EXPORT_SYMBOL(lockref_put_or_lock); @@ -169,23 +140,22 @@ EXPORT_SYMBOL(lockref_mark_dead);   * @lockref: pointer to lockref structure   * Return: 1 if count updated successfully or 0 if lockref was dead   */ -int lockref_get_not_dead(struct lockref *lockref) +bool lockref_get_not_dead(struct lockref *lockref)  { -	int retval; +	bool retval = false;  	CMPXCHG_LOOP(  		new.count++;  		if (old.count < 0) -			return 0; +			return false;  	, -		return 1; +		return true;  	);  	spin_lock(&lockref->lock); -	retval = 0;  	if (lockref->count >= 0) {  		lockref->count++; -		retval = 1; +		retval = true;  	}  	spin_unlock(&lockref->lock);  	return retval;  | 
