diff options
author | Lukas Czerner <lczerner@redhat.com> | 2010-10-27 21:30:04 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-10-27 21:30:04 -0400 |
commit | 53fdcf992d616484d388a8ab9dad07dc8b8f1178 (patch) | |
tree | f9542d11f725bfb552636f53eab455f917138f47 | |
parent | 582987098207f1182ed5c7d01d5fedf7a5f56286 (diff) |
ext4: don't hold spinlock while calling ext4_issue_discard()
We can't hold the block group spinlock because we ext4_issue_discard()
calls wait and hence can get rescheduled.
Google-Bug-Id: 3017678
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r-- | fs/ext4/mballoc.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 53472e27b327..ccdfec6acb75 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -4696,12 +4696,12 @@ do_more: | |||
4696 | * with group lock held. generate_buddy look at | 4696 | * with group lock held. generate_buddy look at |
4697 | * them with group lock_held | 4697 | * them with group lock_held |
4698 | */ | 4698 | */ |
4699 | if (test_opt(sb, DISCARD)) | ||
4700 | ext4_issue_discard(sb, block_group, bit, count); | ||
4699 | ext4_lock_group(sb, block_group); | 4701 | ext4_lock_group(sb, block_group); |
4700 | mb_clear_bits(bitmap_bh->b_data, bit, count); | 4702 | mb_clear_bits(bitmap_bh->b_data, bit, count); |
4701 | mb_free_blocks(inode, &e4b, bit, count); | 4703 | mb_free_blocks(inode, &e4b, bit, count); |
4702 | ext4_mb_return_to_preallocation(inode, &e4b, block, count); | 4704 | ext4_mb_return_to_preallocation(inode, &e4b, block, count); |
4703 | if (test_opt(sb, DISCARD)) | ||
4704 | ext4_issue_discard(sb, block_group, bit, count); | ||
4705 | } | 4705 | } |
4706 | 4706 | ||
4707 | ret = ext4_free_blks_count(sb, gdp) + count; | 4707 | ret = ext4_free_blks_count(sb, gdp) + count; |