On Fri, Oct 09 2009, Nick Piggin wrote: > On Fri, Oct 09, 2009 at 11:51:19AM +0200, Jens Axboe wrote: > > Nick, > > > > One more thing... I see you converted part of btrfs, but there's still > > this one sitting in btrfs_invalidate_inodes() > > > > if (atomic_read(&inode->i_count) > 1) > > d_prune_aliases(inode); > > > > Not sure how best to solve that, with a __d_prune_aliases() that assumed > > the lock was held it would be easy. But perhaps you have better ideas, > > this email is more of a heads-up since perhaps you missed this spot > > (CC'ing Chris). > > It's OK, you can load inode->i_count integer atomically -- in this > sequence d_prune_aliases can't have assumed anything about i_count > anyway because regardless of its type it might have changed in > between. Right, it was already racy wrt i_count. So the below should be OK. diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d3dadb6..7e02b5d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3419,8 +3419,10 @@ again: inode = igrab(&entry->vfs_inode); if (inode) { spin_unlock(&root->inode_lock); - if (atomic_read(&inode->i_count) > 1) + + if (inode->i_count > 1) d_prune_aliases(inode); + /* * btrfs_drop_inode will remove it from * the inode cache when its usage count -- Jens Axboe -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html