diff options
-rw-r--r-- | fs/aio.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -1543,7 +1543,20 @@ static void aio_batch_add(struct address_space *mapping, | |||
1543 | } | 1543 | } |
1544 | 1544 | ||
1545 | abe = mempool_alloc(abe_pool, GFP_KERNEL); | 1545 | abe = mempool_alloc(abe_pool, GFP_KERNEL); |
1546 | BUG_ON(!igrab(mapping->host)); | 1546 | |
1547 | /* | ||
1548 | * we should be using igrab here, but | ||
1549 | * we don't want to hammer on the global | ||
1550 | * inode spinlock just to take an extra | ||
1551 | * reference on a file that we must already | ||
1552 | * have a reference to. | ||
1553 | * | ||
1554 | * When we're called, we always have a reference | ||
1555 | * on the file, so we must always have a reference | ||
1556 | * on the inode, so igrab must always just | ||
1557 | * bump the count and move on. | ||
1558 | */ | ||
1559 | atomic_inc(&mapping->host->i_count); | ||
1547 | abe->mapping = mapping; | 1560 | abe->mapping = mapping; |
1548 | hlist_add_head(&abe->list, &batch_hash[bucket]); | 1561 | hlist_add_head(&abe->list, &batch_hash[bucket]); |
1549 | return; | 1562 | return; |