diff options
| author | Josef Bacik <jbacik@fusionio.com> | 2012-08-01 15:36:24 -0400 | 
|---|---|---|
| committer | Chris Mason <chris.mason@oracle.com> | 2012-08-28 16:53:33 -0400 | 
| commit | 66657b318e0e443ada229fccd40c8be86cfebdbf (patch) | |
| tree | bf1334fff93556fbc8d82b26a6d5431fd9e74b5c /fs/btrfs/delayed-inode.c | |
| parent | 1fa11e265fa2562fb713171b6a58e72bb7afd276 (diff) | |
| download | olio-linux-3.10-66657b318e0e443ada229fccd40c8be86cfebdbf.tar.xz olio-linux-3.10-66657b318e0e443ada229fccd40c8be86cfebdbf.zip  | |
Btrfs: barrier before waitqueue_active
We need a barrir before calling waitqueue_active otherwise we will miss
wakeups.  So in places that do atomic_dec(); then atomic_read() use
atomic_dec_return() which imply a memory barrier (see memory-barriers.txt)
and then add an explicit memory barrier everywhere else that need them.
Thanks,
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 7 | 
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 00deed4ef3e..07d5eeb1e6f 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -512,8 +512,8 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)  	rb_erase(&delayed_item->rb_node, root);  	delayed_item->delayed_node->count--; -	atomic_dec(&delayed_root->items); -	if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND && +	if (atomic_dec_return(&delayed_root->items) < +	    BTRFS_DELAYED_BACKGROUND &&  	    waitqueue_active(&delayed_root->wait))  		wake_up(&delayed_root->wait);  } @@ -1056,8 +1056,7 @@ static void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node)  		delayed_node->count--;  		delayed_root = delayed_node->root->fs_info->delayed_root; -		atomic_dec(&delayed_root->items); -		if (atomic_read(&delayed_root->items) < +		if (atomic_dec_return(&delayed_root->items) <  		    BTRFS_DELAYED_BACKGROUND &&  		    waitqueue_active(&delayed_root->wait))  			wake_up(&delayed_root->wait);  |