From nobody Fri Jul 24 20:51:10 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F3EFF417D80 for ; Fri, 24 Jul 2026 17:14:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784913280; cv=none; b=iI5nfeUCeYnlma2pyJcYSyhXxDs5sUgwRzXm72f/86SXKO55Ot/eEO6i5uh7Xmlp+oZ7OgNGBa8kZrAJEKdLddTigL+mM9EoS5kiO53En0XBhLA8tggtXaxxR1YzEE4Jaut1yhocFrViNrz1jRK1oBigwYlyzNcgrTlL4Q+Hp8U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784913280; c=relaxed/simple; bh=5mx/01neYXBTDDS+aRelvHZ9v+7teX4gKivVdoDzzGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O3+sORxsl23nPVJsEyRmgzam1e5KFCqZeXymZM+bV7o6/R8LNAeC5GOKkvpZ2y0Q0/VfLyZPJQynnr2Jnxwf0YZIdSRHlVN2OcOVCven5Vrik5k1Jt/labvixVodlzzQNyKC8eX9eMsm1F1SsqZkyxy5T62Q77flXogTShqJ9mk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=exFNef4f; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="exFNef4f" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-495757ccbc1so6370715e9.2 for ; Fri, 24 Jul 2026 10:14:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784913274; x=1785518074; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=PYL/Z6JmdCpxR8zGHw2pPpkq0PjReJC2CXcOqJWl4I4=; b=exFNef4f+GuEAjka1t8B0gBwJR0enx4Eeyc/iF0yTZ/Sye3VJbpZFU9+/OT4upbY/C ysgb+172fnhgFb83ekYQFn+SXW8aWNkeM6tr6KRLbmQaW2lNa1EWaz4wJKoSajmauiL3 +q4tyVU+ahMUpcSsBCIQV/LunzqL0rYpo6EiaslLVr+6/uvzaB/B+jnm4iX9DOGAbuRR yPOy8/nd9Y1FU727sUeSi1MLrITNl5C6xGc2iDGafmFcy+HkmxIsAFX8ZOI5e1IT0Fg5 M5YNcH8y3paAbNHI8XRViasssOZdwplVIqhCTHQ+udQ0wrVQc/wDg+sro9WuR+NGLTbo VJNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784913274; x=1785518074; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=PYL/Z6JmdCpxR8zGHw2pPpkq0PjReJC2CXcOqJWl4I4=; b=kXcrbsBdMdvLNzu5f/sqwlXdLkcnShNifEW9e8GvZ6LBmc6sJo+pBHPXy7SgYL7j3v 2geY4NKT7Rf1HYr7lD6chjvXWF0lkpzFGP5bUMQzWqV9z0GhHOQKtI2Y9ooT+8RgBNPT yygz4dQq5Bdlx+fPz+2IxcCwAYuSBukWu37nrxWveunWHC4Yt0vTCAkt08mV89DBzdsZ cPdV8pLcInWJpu30bNol7G5x7HXpCxEpAVWBef2/ICsSaKbDjxVwPz7CarXTCFwUSDtq 6Pzl8hx8YIHdE75qpX9S3TCBAEDtpV8zEVdQS6f867Va73xVbgOJr67X/EKhTFGo0F88 LGZw== X-Forwarded-Encrypted: i=1; AHgh+RoZGkNup1GmZxbe6tE10v4idfkGZKzsc/zJoe+Cvv9St82Vg3q7CG/+sHkpoDqDYCUCjLunRNfNFJ3JeHk=@vger.kernel.org X-Gm-Message-State: AOJu0YxMuCFeDjpZilc2RPiTg1gGsr5ozHguz35IRLYZhjvF1bFEDOt9 XexQNv43bPO1OlDGuBpP0lW+0t1djWzjDd4gmrDO5KnRAVjD1Q+htfBX X-Gm-Gg: AR+sD11t4H+ym0HqnlBsdpqdb6KQf9UWUi3EF2zi18Gh5zQKmqWwV8xGW3qwOfqxvuV UwsFdf+gaP5kLMlC1Rfg7Jb6tSrYIe46qra0qKqDXtExfjDAHNTie6haK7NNU4CgvRtYU+pK1Wu 5ym+j2pMEvlz5SHrh5hTEiGcWAQ++sef8peKiPph1UzJiL0jTiR4Dkpiw+lU8Ap4pYQZ3ov2vL5 37pRfsRun6Dk6g7yt7+LXubioo42rn2Eaf/aAqoTdU2RKAcq8lEjSAuphXJlqLUAQompSRcOTGL 3pXwdb+7qxQIDsXpotav5WP7Bhba9MjdNPecE+t1Sd2eyh3BJ0/fPLUgIa+Kvs4jP7HPHF/VkPf ZDE9JHzZ2rcxLHbCk0Ll2/dV7a+7PQI326hpZ1fa12hwtJBPvbgRgS3m0siauUROuBBjZ6cPqY6 P5TuCxiBSsNQBpOl7bu2Mg7A1VwyziOk/8KDEufRw1tugS7Aa8sPm+ X-Received: by 2002:a7b:c40f:0:b0:495:7303:e38c with SMTP id 5b1f17b1804b1-49573cffa73mr63119865e9.28.1784913274327; Fri, 24 Jul 2026 10:14:34 -0700 (PDT) Received: from f.. (cst-prg-85-255.cust.vodafone.cz. [46.135.85.255]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-496b499c473sm4175225e9.11.2026.07.24.10.14.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 10:14:33 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Mateusz Guzik Subject: [PATCH 1/2] lockref: tidy up dead count handling Date: Fri, 24 Jul 2026 19:14:21 +0200 Message-ID: <20260724171422.429284-2-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260724171422.429284-1-mjguzik@gmail.com> References: <20260724171422.429284-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 1. put the dead val into a macro so that it can be used in other places 2. __lockref_is_dead(): - drop the __ suffix, this is not an internal routine - drop the spurious cast, the value is already a signed int - use READ_ONCE to prevent any compile shenanigans 3. provide lockref_is_dead_or_zero() Signed-off-by: Mateusz Guzik --- fs/ceph/dir.c | 2 +- fs/erofs/zdata.c | 4 ++-- fs/gfs2/glock.c | 6 +++--- fs/gfs2/lock_dlm.c | 6 +++--- fs/gfs2/quota.c | 4 ++-- fs/xfs/xfs_buf.c | 4 ++-- fs/xfs/xfs_qm.c | 4 ++-- include/linux/lockref.h | 12 ++++++++++-- lib/lockref.c | 2 +- 9 files changed, 26 insertions(+), 18 deletions(-) diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index b957149abe5a..f39856ff3ea1 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -1667,7 +1667,7 @@ __dentry_leases_walk(struct ceph_mds_client *mdsc, if (!spin_trylock(&dentry->d_lock)) continue; =20 - if (__lockref_is_dead(&dentry->d_lockref)) { + if (lockref_is_dead(&dentry->d_lockref)) { list_del_init(&di->lease_list); goto next; } diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index 74520e910259..d022d1dff5a1 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -725,7 +725,7 @@ static bool z_erofs_get_pcluster(struct z_erofs_pcluste= r *pcl) return true; =20 spin_lock(&pcl->lockref.lock); - if (__lockref_is_dead(&pcl->lockref)) { + if (lockref_is_dead(&pcl->lockref)) { spin_unlock(&pcl->lockref.lock); return false; } @@ -945,7 +945,7 @@ static void z_erofs_put_pcluster(struct erofs_sb_info *= sbi, if (lockref_put_or_lock(&pcl->lockref)) return; =20 - DBG_BUGON(__lockref_is_dead(&pcl->lockref)); + DBG_BUGON(lockref_is_dead(&pcl->lockref)); if (!--pcl->lockref.count) { if (try_free && xa_trylock(&sbi->managed_pslots)) { free =3D __erofs_try_to_release_pcluster(sbi, pcl); diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index b8a144d3a73b..eaa2980051ed 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -2080,7 +2080,7 @@ static void clear_glock(struct gfs2_glock *gl) gfs2_glock_remove_from_lru(gl); =20 spin_lock(&gl->gl_lockref.lock); - if (!__lockref_is_dead(&gl->gl_lockref)) { + if (!lockref_is_dead(&gl->gl_lockref)) { gl->gl_lockref.count++; if (gl->gl_state !=3D LM_ST_UNLOCKED) request_demote(gl, LM_ST_UNLOCKED, 0, false); @@ -2115,7 +2115,7 @@ static void dump_glock_func(struct gfs2_glock *gl) static void withdraw_glock(struct gfs2_glock *gl) { spin_lock(&gl->gl_lockref.lock); - if (!__lockref_is_dead(&gl->gl_lockref)) { + if (!lockref_is_dead(&gl->gl_lockref)) { /* * We don't want to write back any more dirty data. Unlock the * remaining inode and resource group glocks; this will cause @@ -2483,7 +2483,7 @@ static void gfs2_glock_iter_next(struct gfs2_glock_it= er *gi, loff_t n) continue; break; } else { - if (__lockref_is_dead(&gl->gl_lockref)) + if (lockref_is_dead(&gl->gl_lockref)) continue; n--; } diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 7828ad0b6f5a..cc901fb97da0 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c @@ -126,7 +126,7 @@ static void gdlm_ast(void *arg) clear_bit(GLF_BLOCKING, &gl->gl_flags); =20 /* If the glock is dead, we only react to a dlm_unlock() reply. */ - if (__lockref_is_dead(&gl->gl_lockref) && + if (lockref_is_dead(&gl->gl_lockref) && gl->gl_lksb.sb_status !=3D -DLM_EUNLOCK) return; =20 @@ -182,7 +182,7 @@ static void gdlm_bast(void *arg, int mode) { struct gfs2_glock *gl =3D arg; =20 - if (__lockref_is_dead(&gl->gl_lockref)) + if (lockref_is_dead(&gl->gl_lockref)) return; =20 switch (mode) { @@ -329,7 +329,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl) uint32_t flags =3D 0; int error; =20 - BUG_ON(!__lockref_is_dead(&gl->gl_lockref)); + BUG_ON(!lockref_is_dead(&gl->gl_lockref)); =20 if (test_bit(GLF_INITIAL, &gl->gl_flags)) { gfs2_glock_free(gl); diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 91e9975d25e8..001c8b39ca55 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -342,7 +342,7 @@ static void qd_put(struct gfs2_quota_data *qd) if (lockref_put_or_lock(&qd->qd_lockref)) return; =20 - BUG_ON(__lockref_is_dead(&qd->qd_lockref)); + BUG_ON(lockref_is_dead(&qd->qd_lockref)); sdp =3D qd->qd_sbd; if (unlikely(!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))) { lockref_mark_dead(&qd->qd_lockref); @@ -486,7 +486,7 @@ static bool qd_grab_sync(struct gfs2_sbd *sdp, struct g= fs2_quota_data *qd, qd->qd_sync_gen >=3D sync_gen) goto out; =20 - if (__lockref_is_dead(&qd->qd_lockref)) + if (lockref_is_dead(&qd->qd_lockref)) goto out; qd->qd_lockref.count++; =20 diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 21d67af781da..17b9d643e1a8 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -80,7 +80,7 @@ xfs_buf_stale( =20 spin_lock(&bp->b_lockref.lock); atomic_set(&bp->b_lru_ref, 0); - if (!__lockref_is_dead(&bp->b_lockref)) + if (!lockref_is_dead(&bp->b_lockref)) list_lru_del_obj(&bp->b_target->bt_lru, &bp->b_lru); spin_unlock(&bp->b_lockref.lock); } @@ -841,7 +841,7 @@ static void xfs_buf_destroy( struct xfs_buf *bp) { - ASSERT(__lockref_is_dead(&bp->b_lockref)); + ASSERT(lockref_is_dead(&bp->b_lockref)); ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); =20 if (bp->b_pag) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 896b24f87ac9..99a82107b8e6 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -128,7 +128,7 @@ xfs_qm_dqpurge( struct xfs_quotainfo *qi =3D dqp->q_mount->m_quotainfo; =20 spin_lock(&dqp->q_lockref.lock); - if (dqp->q_lockref.count > 0 || __lockref_is_dead(&dqp->q_lockref)) { + if (dqp->q_lockref.count > 0 || lockref_is_dead(&dqp->q_lockref)) { spin_unlock(&dqp->q_lockref.lock); return -EAGAIN; } @@ -429,7 +429,7 @@ xfs_qm_dquot_isolate( * from the LRU, leave it for the freeing task to complete the freeing * process rather than risk it being free from under us here. */ - if (__lockref_is_dead(&dqp->q_lockref)) + if (lockref_is_dead(&dqp->q_lockref)) goto out_miss_unlock; =20 /* diff --git a/include/linux/lockref.h b/include/linux/lockref.h index 6ded24cdb4a8..ddfb7d3b8cec 100644 --- a/include/linux/lockref.h +++ b/include/linux/lockref.h @@ -34,6 +34,8 @@ struct lockref { }; }; =20 +#define __LOCKREF_DEAD_VAL -128 + /** * lockref_init - Initialize a lockref * @lockref: pointer to lockref structure @@ -55,9 +57,15 @@ void lockref_mark_dead(struct lockref *lockref); bool lockref_get_not_dead(struct lockref *lockref); =20 /* Must be called under spinlock for reliable results */ -static inline bool __lockref_is_dead(const struct lockref *l) +static inline bool lockref_is_dead(const struct lockref *l) +{ + return (READ_ONCE(l->count) =3D=3D __LOCKREF_DEAD_VAL); +} + +static inline bool lockref_is_dead_or_zero(const struct lockref *l) { - return ((int)l->count < 0); + int count =3D READ_ONCE(l->count); + return (count =3D=3D __LOCKREF_DEAD_VAL || count =3D=3D 0); } =20 #endif /* __LINUX_LOCKREF_H */ diff --git a/lib/lockref.c b/lib/lockref.c index 5d8e3ef3860e..9b3dd688d8cd 100644 --- a/lib/lockref.c +++ b/lib/lockref.c @@ -131,7 +131,7 @@ EXPORT_SYMBOL(lockref_put_or_lock); void lockref_mark_dead(struct lockref *lockref) { assert_spin_locked(&lockref->lock); - lockref->count =3D -128; + lockref->count =3D __LOCKREF_DEAD_VAL; } EXPORT_SYMBOL(lockref_mark_dead); =20 --=20 2.48.1 From nobody Fri Jul 24 20:51:10 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B91644C669 for ; Fri, 24 Jul 2026 17:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784913281; cv=none; b=QtWAe9EKZfJv2nmD3A+0i2KFKNrZGx5iainKasPMXI31oE0JvHbawSFQVxr+LGAALBihfoFBkJrh++2mtTjbCpLXSYb2WAdzVLiIGQtowFqWKTOVvAaUhtVf5r+uv1b3mMQ9//GQYCK1ignR5fStPCgISmf+IGjU2OzKhHoV/1I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784913281; c=relaxed/simple; bh=BhrYXuPqq4Tq0j4CkXmq2JxYIle7khWTpjkatFg7E+c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GMKjWXxrfa9rluuITyealNklb7SpzQaGheSqbGTw61x+/h+sc608lMC/1/5sXzF0N5rQbwzowN0+tRa5nXyWg7p3lP2+0bLJ+zjUPvc3bgDnW6vU5ltKCtVrmrknql0zq1zGox6kZdueJs1bOnCa5R/5eDxu7Bo8EcqyMlFX9oE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=klemPDjo; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="klemPDjo" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-4954dff6536so5141845e9.0 for ; Fri, 24 Jul 2026 10:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784913276; x=1785518076; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=I/iJnofotIt7h8Z3Oqw49Fdlh2mKhenEyUhJcxgxuyU=; b=klemPDjovheT+RACWVNUb7QWASbTOdMfICGMGy9qBzG0PtwqV1NWJSqNBrpR+XDkIB 1wlUn8TU3uW7jRX0KKNnuLnUELeMq1Xx+0UQMh9Mppvt7yp25uljLEzP2ZRctgPcm2Za bLRbU3+9NBo6alx9XFa9ozjLzngCK/h0qiEHAEQlx/UjV1SGfkqu9hZGbI0b0kNw3W/2 OyWm7yj/QFmrdp4abm0VI+Oxbdd4QnQTEeHx19QohNakATQaClnbXSDsBfyfVcbN4Q5X IWZUY5FSqfta7+b/d0VYXUtce5vUmKtFHjvsEg0bsHJwqUSN4yVOHoi/G006x8OxFUAl SF2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784913276; x=1785518076; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=I/iJnofotIt7h8Z3Oqw49Fdlh2mKhenEyUhJcxgxuyU=; b=qPqpAsaG2JARbKR0nNTgY7icGxyRxW8O4vf+Xx0eLmFPPZBnNvufdMnxYwFraBZMYn VZy471W4KFKk4tK1iDie1YoYcP85iSbo+CkrBJDZUAvKfQRHLZ1pr+eRVyLh00ThPSUS h9l1Ew+jeRfFzX6t2O6Q1eqCsKh+dgLR3XNtMVvfcfqwkykME4JkI6MmwY9jIzBeRkNF mRruHocJhmnGgUKn31ev+jkZ3prNRBlirlNIzHzn9w5V5DaRp/ObkWHgt1f35U+vMsT8 qCgoaPrRdmHk1k4Ww/M4lognrg3Ja/5cK9Ryoz7rCiGQqZlpxKt6XFrmvnCk0Mo7FXCy Ie8Q== X-Forwarded-Encrypted: i=1; AHgh+RoOkAo1FmqpF9GFol7JsLMmk4PmZrGF7qrgRVGYnvRMYWNtJeBSW5bDXm8v0s33LlqPdhFcB1v3SIV8qZo=@vger.kernel.org X-Gm-Message-State: AOJu0YxbY9p+L4tbmZNqJ2LEK/KNiaCidRZnNcmdmYWeBKQeRjMWOReN iX/nC3G4DP3aGAaiZVaveSD282ysplXp4gBvMQu7qipASnx/4WazQkxJ X-Gm-Gg: AR+sD10ILUFYusJ/lQpT5YzG9SQo7SP50BFXE11QD5PvLlZ7Y8dSCEDIdqeWVUrE4Bm +yOBJWFQPte/10t9T1kvw4PPx9h404R8Q3x/tZTKuX1e3YnJkoeEGwrPJtnAuB4FGtTYc0jgk7o 8UzdZiKcXi4Fv92liP40v/EVHO5M4ZmN5W7f3LysGJryl85KmsD9fvThp4s0AvqAg5NRkLX7e+Y 4IvXlhr0/ub11C7Fl5JcSlnpV0TlCAS1784o535Rz0hMjPGmmULclispUUDZWRxYuSI1OQRAiQG Voq841yw4fT/oQQ2HszOrTNpzeNyFe/GBtYj35Y6JKeZVfyPvvTEp7WldoowOMnaMw9uiBceguP dsTsrBtR1j1QZKAOjujHPwHYcwDJrmBiajKoTsxJsEA2+2+3BfNCkWXRR2B+zpA7rPOwTlOrCj3 xdjw/JxsAfFAr+57tIPVwXntZjxU5V77qWfmX6WmdhWV9eX4Qa/sET X-Received: by 2002:a05:600c:4e91:b0:495:62bc:a022 with SMTP id 5b1f17b1804b1-49573cd20c1mr89068065e9.13.1784913276204; Fri, 24 Jul 2026 10:14:36 -0700 (PDT) Received: from f.. (cst-prg-85-255.cust.vodafone.cz. [46.135.85.255]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-496b499c473sm4175225e9.11.2026.07.24.10.14.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 10:14:35 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Mateusz Guzik Subject: [PATCH 2/2] dcache: use lockref routines for dead count checks Date: Fri, 24 Jul 2026 19:14:22 +0200 Message-ID: <20260724171422.429284-3-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260724171422.429284-1-mjguzik@gmail.com> References: <20260724171422.429284-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Mateusz Guzik --- fs/dcache.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index 3e9af9de7074..2aee85f3fbaa 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -434,7 +434,7 @@ static inline void __d_clear_type_and_inode(struct dent= ry *dentry) static void dentry_free(struct dentry *dentry) { DENTRY_WARN_ONCE(d_really_is_positive(dentry), dentry); - DENTRY_WARN_ONCE(dentry->d_lockref.count >=3D 0, dentry); + DENTRY_WARN_ONCE(!lockref_is_dead(&dentry->d_lockref), dentry); D_FLAG_VERIFY(dentry, 0); if (unlikely(dname_external(dentry))) { struct external_name *p =3D external_name(dentry); @@ -782,7 +782,7 @@ static bool lock_for_kill(struct dentry *dentry) * * If @dentry is idle and remains such after we assemble the full * locking environment for eviction (see lock_for_kill() for details) - * we mark it doomed (->d_lockref.count < 0) and proceed to detaching + * we mark it doomed (see lockref_mark_dead()) and proceed to detaching * it from any filesystem objects. Otherwise we drop ->d_lock and * return %NULL. * @@ -946,7 +946,7 @@ static inline bool fast_dput(struct dentry *dentry) if (unlikely(ret < 0)) { spin_lock(&dentry->d_lock); rcu_read_unlock(); - if (WARN_ON_ONCE(dentry->d_lockref.count <=3D 0)) { + if (WARN_ON_ONCE(lockref_is_dead_or_zero(&dentry->d_lockref))) { spin_unlock(&dentry->d_lock); return true; } @@ -1644,7 +1644,7 @@ static enum d_walk_ret select_collect(void *_data, st= ruct dentry *dentry) if (data->start =3D=3D dentry) goto out; =20 - if (dentry->d_lockref.count <=3D 0) { + if (lockref_is_dead_or_zero(&dentry->d_lockref)) { __move_to_shrink_list(dentry, &data->dispose); data->found++; } @@ -1676,7 +1676,7 @@ static enum d_walk_ret select_collect2(void *_data, s= truct dentry *dentry) if (data->start =3D=3D dentry) goto out; =20 - if (dentry->d_lockref.count <=3D 0) { + if (lockref_is_dead_or_zero(&dentry->d_lockref)) { if (!__move_to_shrink_list(dentry, &data->dispose)) { /* * We need an enter RCU read-side critical area that @@ -1747,7 +1747,7 @@ static void shrink_dcache_tree(struct dentry *parent,= bool for_umount) spin_lock(&v->d_lock); rcu_read_unlock(); =20 - if (unlikely(v->d_lockref.count < 0)) { + if (unlikely(lockref_is_dead(&v->d_lockref))) { // It's doomed; if it isn't dead yet, notify us // once it becomes invisible to d_walk(). need_wait =3D d_add_waiter(v, &wait); @@ -1823,7 +1823,7 @@ void shrink_dcache_for_umount(struct super_block *sb) spin_unlock(&sb->s_roots_lock); spin_lock(&dentry->d_lock); rcu_read_unlock(); - if (unlikely(dentry->d_lockref.count < 0)) { + if (unlikely(lockref_is_dead(&dentry->d_lockref))) { struct completion_list wait; bool need_wait =3D d_add_waiter(dentry, &wait); =20 @@ -2822,7 +2822,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, spin_lock(&dentry->d_lock); rcu_read_unlock(); /* now we can try to grab a reference */ - if (unlikely(dentry->d_lockref.count < 0)) { + if (unlikely(lockref_is_dead(&dentry->d_lockref))) { spin_unlock(&dentry->d_lock); goto retry; } --=20 2.48.1