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.