All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	Chuck Ebbert <cebbert@redhat.com>,
	Domenico Andreoli <cavokz@gmail.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	Trond Myklebust <Trond.Myklebust@netapp.com>
Subject: [patch 08/12] NLM: Fix a circular lock dependency in lockd
Date: Mon, 8 Oct 2007 11:06:29 -0700	[thread overview]
Message-ID: <20071008180629.GI7627@kroah.com> (raw)
In-Reply-To: <20071008180551.GA7627@kroah.com>

[-- Attachment #1: nlm-fix-a-circular-lock-dependency-in-lockd.patch --]
[-- Type: text/plain, Size: 3377 bytes --]

From: Trond Myklebust <Trond.Myklebust@netapp.com>

commit 255129d1e9ca0ed3d69d5517fae3e03d7ab4b806 in upstream.

The problem is that the garbage collector for the 'host' structures
nlm_gc_hosts(), holds nlm_host_mutex while calling down to
nlmsvc_mark_resources, which, eventually takes the file->f_mutex.

We cannot therefore call nlmsvc_lookup_host() from within
nlmsvc_create_block, since the caller will already hold file->f_mutex, so
the attempt to grab nlm_host_mutex may deadlock.

Fix the problem by calling nlmsvc_lookup_host() outside the file->f_mutex.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 fs/lockd/svclock.c |   29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

--- a/fs/lockd/svclock.c
+++ b/fs/lockd/svclock.c
@@ -171,19 +171,14 @@ found:
  * GRANTED_RES message by cookie, without having to rely on the client's IP
  * address. --okir
  */
-static inline struct nlm_block *
-nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_file *file,
-		struct nlm_lock *lock, struct nlm_cookie *cookie)
+static struct nlm_block *
+nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_host *host,
+		    struct nlm_file *file, struct nlm_lock *lock,
+		    struct nlm_cookie *cookie)
 {
 	struct nlm_block	*block;
-	struct nlm_host		*host;
 	struct nlm_rqst		*call = NULL;
 
-	/* Create host handle for callback */
-	host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
-	if (host == NULL)
-		return NULL;
-
 	call = nlm_alloc_call(host);
 	if (call == NULL)
 		return NULL;
@@ -366,6 +361,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, stru
 			struct nlm_lock *lock, int wait, struct nlm_cookie *cookie)
 {
 	struct nlm_block	*block = NULL;
+	struct nlm_host		*host;
 	int			error;
 	__be32			ret;
 
@@ -377,6 +373,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, stru
 				(long long)lock->fl.fl_end,
 				wait);
 
+	/* Create host handle for callback */
+	host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
+	if (host == NULL)
+		return nlm_lck_denied_nolocks;
 
 	/* Lock file against concurrent access */
 	mutex_lock(&file->f_mutex);
@@ -385,7 +385,8 @@ nlmsvc_lock(struct svc_rqst *rqstp, stru
 	 */
 	block = nlmsvc_lookup_block(file, lock);
 	if (block == NULL) {
-		block = nlmsvc_create_block(rqstp, file, lock, cookie);
+		block = nlmsvc_create_block(rqstp, nlm_get_host(host), file,
+				lock, cookie);
 		ret = nlm_lck_denied_nolocks;
 		if (block == NULL)
 			goto out;
@@ -449,6 +450,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, stru
 out:
 	mutex_unlock(&file->f_mutex);
 	nlmsvc_release_block(block);
+	nlm_release_host(host);
 	dprintk("lockd: nlmsvc_lock returned %u\n", ret);
 	return ret;
 }
@@ -477,10 +479,15 @@ nlmsvc_testlock(struct svc_rqst *rqstp, 
 
 	if (block == NULL) {
 		struct file_lock *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
+		struct nlm_host	*host;
 
 		if (conf == NULL)
 			return nlm_granted;
-		block = nlmsvc_create_block(rqstp, file, lock, cookie);
+		/* Create host handle for callback */
+		host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
+		if (host == NULL)
+			return nlm_lck_denied_nolocks;
+		block = nlmsvc_create_block(rqstp, host, file, lock, cookie);
 		if (block == NULL) {
 			kfree(conf);
 			return nlm_granted;

-- 

  parent reply	other threads:[~2007-10-08 18:32 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20071008180406.052382073@mini.kroah.org>
2007-10-08 18:05 ` [patch 00/12] 2.6.22.10 -stable review Greg KH
2007-10-08 18:06   ` [patch 01/12] scsi_transport_spi: fix domain validation failure from incorrect width setting Greg KH
2007-10-08 18:06   ` [patch 02/12] sky2: reduce impact of watchdog timer Greg KH
2007-10-08 18:06   ` [patch 03/12] sky2: fix VLAN receive processing Greg KH
2007-10-08 18:06   ` [patch 04/12] sky2: fix transmit state on resume Greg KH
2007-10-08 18:06   ` [patch 05/12] libata: update drive blacklists Greg KH
2007-10-08 18:06   ` [patch 06/12] Fix ppp_mppe kernel stack usage Greg KH
2007-10-08 18:06   ` [patch 07/12] i2c-algo-bit: Read block data bugfix Greg KH
2007-10-08 18:06   ` Greg KH [this message]
2007-10-08 20:01     ` [patch 08/12] NLM: Fix a circular lock dependency in lockd Roel Kluin
2007-10-09 15:00       ` Trond Myklebust
2007-10-09 15:13         ` Greg KH
2007-10-09 15:27           ` Trond Myklebust
2007-10-09 20:41             ` [stable] " Greg KH
2007-10-08 18:06   ` [patch 09/12] Fix SMP poweroff hangs Greg KH
2007-10-09 15:17     ` Olof Johansson
2007-10-09 22:20       ` [stable] " Greg KH
2007-10-09 23:21         ` Thomas Gleixner
2007-10-09 23:27           ` Linus Torvalds
2007-10-09 23:35             ` Thomas Gleixner
2007-10-10  5:29               ` Linus Torvalds
     [not found]                 ` <200710092359.47144.spaceman__spiff@cox.net>
2007-10-10 14:57                   ` ARPM shutdown oops (Re: [stable] [patch 09/12] Fix SMP poweroff hangs) Linus Torvalds
2007-10-10 16:31                     ` H. Peter Anvin
2007-10-11  3:05                     ` Kevin
2007-10-11 15:31                       ` Linus Torvalds
2007-10-11 18:42                         ` Jeff Garzik
2007-10-11 19:19                           ` Dave Jones
2007-10-11 20:55                           ` Rafael J. Wysocki
2007-10-11 23:27                           ` APM " Adrian Bunk
2007-10-12 12:05                             ` Rafael J. Wysocki
2007-10-10  0:03             ` [stable] [patch 09/12] Fix SMP poweroff hangs Olof Johansson
2007-10-10  0:03               ` Olof Johansson
2007-10-10  0:08             ` [PATCH] powerpc: don't enable cpu hotplug on mpic-based pseries Olof Johansson
2007-10-10  0:08               ` Olof Johansson
2007-10-10  0:18               ` Stephen Rothwell
2007-10-10  0:18                 ` Stephen Rothwell
2007-10-10  0:38                 ` [PATCH v2] " Olof Johansson
2007-10-10 10:08                   ` Milton Miller
2007-10-10 10:08                     ` Milton Miller
2007-10-10 16:43                     ` Olof Johansson
2007-10-10 16:43                       ` Olof Johansson
2007-10-11 15:25                       ` Milton Miller
2007-10-11  5:52                   ` Paul Mackerras
2007-10-11  5:59                     ` Olof Johansson
2007-10-11 21:42                     ` Milton Miller
2007-10-11  0:24             ` [stable] [patch 09/12] Fix SMP poweroff hangs Paul Mackerras
2007-10-09 23:28           ` Greg KH
     [not found]           ` <alpine.LFD.0.999.0710091625520.3838@woody.linux%foundation.org>
2007-10-10 10:06             ` Milton Miller
2007-10-10 11:35               ` Rafael J. Wysocki
2007-10-10 11:35               ` Rafael J. Wysocki
2007-10-10 10:06             ` Milton Miller
2007-10-08 18:06   ` [patch 10/12] Fix timer_stats printout of events/sec Greg KH
2007-10-08 18:06   ` [patch 11/12] SELinux: clear parent death signal on SID transitions Greg KH
2007-10-08 18:06   ` [patch 12/12] i386: Use global flag to disable broken local apic timer on AMD CPUs Greg KH
2007-10-08 18:09   ` [patch 00/12] 2.6.22.10 -stable review Greg KH

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=20071008180629.GI7627@kroah.com \
    --to=gregkh@suse.de \
    --cc=Trond.Myklebust@netapp.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=zwane@arm.linux.org.uk \
    /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.