All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Andreas Gruenbacher <agruenba@redhat.com>,
	Bob Peterson <rpeterso@redhat.com>,
	Sasha Levin <sashal@kernel.org>,
	cluster-devel@redhat.com
Subject: [PATCH AUTOSEL 5.16 03/30] gfs2: Switch lock order of inode and iopen glock
Date: Wed,  6 Apr 2022 21:11:13 -0400	[thread overview]
Message-ID: <20220407011140.113856-3-sashal@kernel.org> (raw)
In-Reply-To: <20220407011140.113856-1-sashal@kernel.org>

From: Andreas Gruenbacher <agruenba@redhat.com>

[ Upstream commit 29464ee36bcaaee2691249f49b9592b8d5c97ece ]

This patch tries to fix the continual ABBA deadlocks we keep having
between the iopen and inode glocks. This switches the lock order in
gfs2_inode_lookup and gfs2_create_inode so the iopen glock is always
locked first.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/gfs2/inode.c | 49 +++++++++++++++++++++++++++----------------------
 1 file changed, 27 insertions(+), 22 deletions(-)

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 89905f4f29bb..b30ff50d17f3 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -131,7 +131,21 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
 		struct gfs2_sbd *sdp = GFS2_SB(inode);
 		struct gfs2_glock *io_gl;
 
-		error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
+		error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE,
+				       &ip->i_gl);
+		if (unlikely(error))
+			goto fail;
+
+		error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE,
+				       &io_gl);
+		if (unlikely(error))
+			goto fail;
+
+		if (blktype != GFS2_BLKST_UNLINKED)
+			gfs2_cancel_delete_work(io_gl);
+		error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT,
+					   &ip->i_iopen_gh);
+		gfs2_glock_put(io_gl);
 		if (unlikely(error))
 			goto fail;
 
@@ -161,16 +175,6 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
 
 		set_bit(GLF_INSTANTIATE_NEEDED, &ip->i_gl->gl_flags);
 
-		error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
-		if (unlikely(error))
-			goto fail;
-		if (blktype != GFS2_BLKST_UNLINKED)
-			gfs2_cancel_delete_work(io_gl);
-		error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
-		gfs2_glock_put(io_gl);
-		if (unlikely(error))
-			goto fail;
-
 		/* Lowest possible timestamp; will be overwritten in gfs2_dinode_in. */
 		inode->i_atime.tv_sec = 1LL << (8 * sizeof(inode->i_atime.tv_sec) - 1);
 		inode->i_atime.tv_nsec = 0;
@@ -716,13 +720,17 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	error = insert_inode_locked4(inode, ip->i_no_addr, iget_test, &ip->i_no_addr);
 	BUG_ON(error);
 
-	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
+	error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
 	if (error)
 		goto fail_gunlock2;
 
+	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
+	if (error)
+		goto fail_gunlock3;
+
 	error = gfs2_trans_begin(sdp, blocks, 0);
 	if (error)
-		goto fail_gunlock2;
+		goto fail_gunlock3;
 
 	if (blocks > 1) {
 		ip->i_eattr = ip->i_no_addr + 1;
@@ -731,10 +739,6 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	init_dinode(dip, ip, symname);
 	gfs2_trans_end(sdp);
 
-	error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
-	if (error)
-		goto fail_gunlock2;
-
 	glock_set_object(ip->i_gl, ip);
 	glock_set_object(io_gl, ip);
 	gfs2_set_iop(inode);
@@ -745,14 +749,14 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	if (default_acl) {
 		error = __gfs2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
 		if (error)
-			goto fail_gunlock3;
+			goto fail_gunlock4;
 		posix_acl_release(default_acl);
 		default_acl = NULL;
 	}
 	if (acl) {
 		error = __gfs2_set_acl(inode, acl, ACL_TYPE_ACCESS);
 		if (error)
-			goto fail_gunlock3;
+			goto fail_gunlock4;
 		posix_acl_release(acl);
 		acl = NULL;
 	}
@@ -760,11 +764,11 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	error = security_inode_init_security(&ip->i_inode, &dip->i_inode, name,
 					     &gfs2_initxattrs, NULL);
 	if (error)
-		goto fail_gunlock3;
+		goto fail_gunlock4;
 
 	error = link_dinode(dip, name, ip, &da);
 	if (error)
-		goto fail_gunlock3;
+		goto fail_gunlock4;
 
 	mark_inode_dirty(inode);
 	d_instantiate(dentry, inode);
@@ -782,9 +786,10 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
 	unlock_new_inode(inode);
 	return error;
 
-fail_gunlock3:
+fail_gunlock4:
 	glock_clear_object(ip->i_gl, ip);
 	glock_clear_object(io_gl, ip);
+fail_gunlock3:
 	gfs2_glock_dq_uninit(&ip->i_iopen_gh);
 fail_gunlock2:
 	gfs2_glock_put(io_gl);
-- 
2.35.1


WARNING: multiple messages have this Message-ID (diff)
From: Sasha Levin <sashal@kernel.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH AUTOSEL 5.16 03/30] gfs2: Switch lock order of inode and iopen glock
Date: Wed,  6 Apr 2022 21:11:13 -0400	[thread overview]
Message-ID: <20220407011140.113856-3-sashal@kernel.org> (raw)
In-Reply-To: <20220407011140.113856-1-sashal@kernel.org>

A non-text attachment was scrubbed...
Name: not available
Type: application/octet-stream
Size: 4424 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20220406/01df5e68/attachment.obj>

  parent reply	other threads:[~2022-04-07  1:14 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-07  1:11 [PATCH AUTOSEL 5.16 01/30] gfs2: assign rgrp glock before compute_bitstructs Sasha Levin
2022-04-07  1:11 ` [Cluster-devel] " Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 02/30] gfs2: cancel timed-out glock requests Sasha Levin
2022-04-07  1:11   ` [Cluster-devel] " Sasha Levin
2022-04-07  1:11 ` Sasha Levin [this message]
2022-04-07  1:11   ` [Cluster-devel] [PATCH AUTOSEL 5.16 03/30] gfs2: Switch lock order of inode and iopen glock Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 04/30] rtc: fix use-after-free on device removal Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 05/30] rtc: pcf2127: fix bug when reading alarm registers Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 06/30] kconfig: add fflush() before ferror() check Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 07/30] um: Cleanup syscall_handler_t definition/cast, fix warning Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 08/30] um: port_user: Improve error handling when port-helper is not found Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 09/30] Input: add bounds checking to input_set_capability() Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 10/30] Input: stmfts - fix reference leak in stmfts_input_open Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 11/30] nvme-pci: add quirks for Samsung X5 SSDs Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 12/30] gfs2: Disable page faults during lockless buffered reads Sasha Levin
2022-04-07  1:11   ` [Cluster-devel] " Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 13/30] rtc: sun6i: Fix time overflow handling Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 14/30] crypto: stm32 - fix reference leak in stm32_crc_remove Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 15/30] crypto: x86/chacha20 - Avoid spurious jumps to other functions Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 16/30] ALSA: hda/realtek: Enable headset mic on Lenovo P360 Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 17/30] s390/traps: improve panic message for translation-specification exception Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 18/30] s390/pci: improve zpci_dev reference counting Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 19/30] vhost_vdpa: don't setup irq offloading when irq_num < 0 Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 20/30] tools/virtio: compile with -pthread Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 21/30] nvmet: use a private workqueue instead of the system workqueue Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 22/30] nvme-multipath: fix hang when disk goes live over reconnect Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 23/30] rtc: mc146818-lib: Fix the AltCentury for AMD platforms Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 24/30] fs: fix an infinite loop in iomap_fiemap Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 25/30] MIPS: lantiq: check the return value of kzalloc() Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 26/30] drbd: remove usage of list iterator variable after loop Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 27/30] platform/chrome: cros_ec_debugfs: detach log reader wq from devm Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 28/30] ARM: 9191/1: arm/stacktrace, kasan: Silence KASAN warnings in unwind_frame() Sasha Levin
2022-04-07  1:11   ` Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 29/30] nilfs2: fix lockdep warnings in page operations for btree nodes Sasha Levin
2022-04-07  1:11 ` [PATCH AUTOSEL 5.16 30/30] nilfs2: fix lockdep warnings during disk space reclamation Sasha Levin
2022-04-07  1:11   ` Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220407011140.113856-3-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=agruenba@redhat.com \
    --cc=cluster-devel@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rpeterso@redhat.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.