Re: [PATCH] reiserfs: fix deadlocks with quotas

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu 02-08-12 21:36:04, Jeff Mahoney wrote:
> The BKL push-down for reiserfs made lock recursion a special case that needs
> to be handled explicitly. One of the cases that was unhandled is dropping
> the quota during inode eviction. Both reiserfs_evict_inode and
> reiserfs_write_dquot take the write lock, but when the journal lock is
> taken it only drops one the references. The locking rules are that the journal
> lock be acquired before the write lock so leaving the reference open leads
> to a ABBA deadlock.
> 
> This patch pushes the unlock up before clear_inode and avoids the recursive
> locking.
> 
> Another ABBA situation can occur when the write lock is dropped while reading
> the bitmap buffer while in the quota code. When the lock is reacquired, it
> will deadlock against dquot->dq_lock and dqopt->dqio_mutex in the dquot_acquire
> path. It's safe to retain the lock across the read and should be cached under
> write load.
> 
> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx>
  Yeah, the patch looks good. Since we don't have reiserfs maintainer, I
guess I'll push this through my tree.

								Honza

> ---
>  fs/reiserfs/bitmap.c |    2 --
>  fs/reiserfs/inode.c  |    2 +-
>  2 files changed, 1 insertion(+), 3 deletions(-)
> 
> --- a/fs/reiserfs/bitmap.c
> +++ b/fs/reiserfs/bitmap.c
> @@ -1334,9 +1334,7 @@ struct buffer_head *reiserfs_read_bitmap
>  	else if (bitmap == 0)
>  		block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1;
>  
> -	reiserfs_write_unlock(sb);
>  	bh = sb_bread(sb, block);
> -	reiserfs_write_lock(sb);
>  	if (bh == NULL)
>  		reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) "
>  		                 "reading failed", __func__, block);
> --- a/fs/reiserfs/inode.c
> +++ b/fs/reiserfs/inode.c
> @@ -76,10 +76,10 @@ void reiserfs_evict_inode(struct inode *
>  		;
>  	}
>        out:
> +	reiserfs_write_unlock_once(inode->i_sb, depth);
>  	clear_inode(inode);	/* note this must go after the journal_end to prevent deadlock */
>  	dquot_drop(inode);
>  	inode->i_blocks = 0;
> -	reiserfs_write_unlock_once(inode->i_sb, depth);
>  	return;
>  
>  no_delete:
> 
> -- 
> Jeff Mahoney
> SUSE Labs
-- 
Jan Kara <jack@xxxxxxx>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux File System Development]     [Linux BTRFS]     [Linux NFS]     [Linux Filesystems]     [Ext4 Filesystem]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Resources]

  Powered by Linux