public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Dave Chinner <david@fromorbit.com>
Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com
Subject: Re: [PATCH 06/12] repair: use recursive buffer locking
Date: Sun, 18 Dec 2011 17:54:45 -0500	[thread overview]
Message-ID: <20111218225445.GB20578@infradead.org> (raw)
In-Reply-To: <20111213022208.GZ14273@dastard>

On Tue, Dec 13, 2011 at 01:22:08PM +1100, Dave Chinner wrote:
> >  	if (use_xfs_buf_lock) {
> > -		if (flags & LIBXFS_GETBUF_TRYLOCK) {
> > -			int ret;
> > +		int ret;
> >  
> > -			ret = pthread_mutex_trylock(&bp->b_lock);
> > -			if (ret) {
> > -				ASSERT(ret == EAGAIN);
> > -				cache_node_put(libxfs_bcache, (struct cache_node *)bp);
> > -				return NULL;
> > +		ret = pthread_mutex_trylock(&bp->b_lock);
> > +		if (ret) {
> > +			ASSERT(ret == EAGAIN);
> > +			if (flags & LIBXFS_GETBUF_TRYLOCK)
> > +				goto out_put;
> > +
> > +			if (pthread_equal(bp->b_holder, pthread_self())) {
> > +				fprintf(stderr,
> > +	_("recursive buffer locking detected\n"));
> 
> "Warning: recursive buffer locking @ bno %lld detected"
> 
> might be more informative, especially to do with the severity of the
> issue.

Ok, I'll make it print the block number.

> 
> > +				bp->b_recur++;
> > +			} else {
> > +				pthread_mutex_lock(&bp->b_lock);
> >  			}
> > -		} else {
> > -			pthread_mutex_lock(&bp->b_lock);
> >  		}
> > +
> > +		bp->b_holder = pthread_self();
> 
> That should probably only be written in the branch where the lock is
> taken not every time through here.

We actually should return the buffer just after incrementing the
recursion count, else we might add it to the global list of buffers
twice.

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2011-12-18 22:54 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-02 17:46 [PATCH 00/12] xfs_repair queue Christoph Hellwig
2011-12-02 17:46 ` [PATCH 01/12] repair: do not walk the unlinked inode list Christoph Hellwig
2011-12-12 22:55   ` Dave Chinner
2012-01-12 19:30   ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 02/12] repair: allocate and free inode records individually Christoph Hellwig
2011-12-12 23:16   ` Dave Chinner
2012-01-12 22:38   ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 03/12] repair: allocate and free extent " Christoph Hellwig
2011-12-12 23:21   ` Dave Chinner
2012-01-12 22:39   ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 04/12] xfsprogs: allow linking against libtcmalloc Christoph Hellwig
2011-12-13  0:05   ` Dave Chinner
2011-12-18 22:47     ` Christoph Hellwig
2011-12-02 17:46 ` [PATCH 05/12] repair: update extent count after zapping duplicate blocks Christoph Hellwig
2011-12-13  2:12   ` Dave Chinner
2012-02-02 12:39     ` [PATCH v2] " Christoph Hellwig
2012-02-02 18:19       ` Mark Tinguely
2012-01-13 17:18   ` [PATCH 05/12] " Mark Tinguely
2011-12-02 17:46 ` [PATCH 06/12] repair: use recursive buffer locking Christoph Hellwig
2011-12-13  2:22   ` Dave Chinner
2011-12-18 22:54     ` Christoph Hellwig [this message]
2012-01-13 20:10       ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 07/12] repair: fix another ABBA deadlock in inode prefetching Christoph Hellwig
2011-12-13  2:35   ` Dave Chinner
2012-01-13 18:51   ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 08/12] repair: handle filesystems with the log in allocation group 0 Christoph Hellwig
2011-12-13  2:36   ` Dave Chinner
2012-01-13 15:18   ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 09/12] repair: kill check_inode_block Christoph Hellwig
2012-01-11 11:29   ` Christoph Hellwig
2012-01-11 21:28     ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 10/12] repair: mark local functions static Christoph Hellwig
2012-01-11 11:30   ` Christoph Hellwig
2012-01-11 21:37     ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 11/12] repair: move extern declarations to headers Christoph Hellwig
2012-01-11 11:30   ` Christoph Hellwig
2012-01-11 21:40     ` Mark Tinguely
2011-12-02 17:46 ` [PATCH 12/12] repair: cleanup inode record macros Christoph Hellwig
2012-01-11 11:30   ` Christoph Hellwig
2012-01-12 17:05     ` Mark Tinguely

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=20111218225445.GB20578@infradead.org \
    --to=hch@infradead.org \
    --cc=david@fromorbit.com \
    --cc=xfs@oss.sgi.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox