aboutsummaryrefslogtreecommitdiffstats
path: root/fs/mbcache.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2008-04-15 17:34:43 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-15 22:35:41 -0400
commit335e92e8a515420bd47a6b0f01cb9a206c0ed6e4 (patch)
tree1518f9afa7ac7047be2c86481b3dbc12f8cc9282 /fs/mbcache.c
parent423bec43079a2942a3004034df7aad76469758d8 (diff)
vfs: fix possible deadlock in ext2, ext3, ext4 when using xattrs
mb_cache_entry_alloc() was allocating cache entries with GFP_KERNEL. But filesystems are calling this function while holding xattr_sem so possible recursion into the fs violates locking ordering of xattr_sem and transaction start / i_mutex for ext2-4. Change mb_cache_entry_alloc() so that filesystems can specify desired gfp mask and use GFP_NOFS from all of them. Signed-off-by: Jan Kara <jack@suse.cz> Reported-by: Dave Jones <davej@redhat.com> Cc: <linux-ext4@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/mbcache.c')
-rw-r--r--fs/mbcache.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/mbcache.c b/fs/mbcache.c
index eb31b73e7d69..ec88ff3d04a9 100644
--- a/fs/mbcache.c
+++ b/fs/mbcache.c
@@ -399,11 +399,11 @@ mb_cache_destroy(struct mb_cache *cache)
399 * if no more memory was available. 399 * if no more memory was available.
400 */ 400 */
401struct mb_cache_entry * 401struct mb_cache_entry *
402mb_cache_entry_alloc(struct mb_cache *cache) 402mb_cache_entry_alloc(struct mb_cache *cache, gfp_t gfp_flags)
403{ 403{
404 struct mb_cache_entry *ce; 404 struct mb_cache_entry *ce;
405 405
406 ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); 406 ce = kmem_cache_alloc(cache->c_entry_cache, gfp_flags);
407 if (ce) { 407 if (ce) {
408 atomic_inc(&cache->c_entry_count); 408 atomic_inc(&cache->c_entry_count);
409 INIT_LIST_HEAD(&ce->e_lru_list); 409 INIT_LIST_HEAD(&ce->e_lru_list);