| From 6574835ac73f3b012bdeb06c6126ae6663100325 Mon Sep 17 00:00:00 2001 |
| From: Niu Yawei <yawei.niu@gmail.com> |
| Date: Fri, 1 Feb 2013 21:31:27 -0500 |
| Subject: [PATCH] ext4: fix race in ext4_mb_add_n_trim() |
| |
| commit f1167009711032b0d747ec89a632a626c901a1ad upstream. |
| |
| In ext4_mb_add_n_trim(), lg_prealloc_lock should be taken when |
| changing the lg_prealloc_list. |
| |
| Signed-off-by: Niu Yawei <yawei.niu@intel.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| fs/ext4/mballoc.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
| index f1c9a84c50a3..5e440caf82de 100644 |
| --- a/fs/ext4/mballoc.c |
| +++ b/fs/ext4/mballoc.c |
| @@ -4153,7 +4153,7 @@ static void ext4_mb_add_n_trim(struct ext4_allocation_context *ac) |
| /* The max size of hash table is PREALLOC_TB_SIZE */ |
| order = PREALLOC_TB_SIZE - 1; |
| /* Add the prealloc space to lg */ |
| - rcu_read_lock(); |
| + spin_lock(&lg->lg_prealloc_lock); |
| list_for_each_entry_rcu(tmp_pa, &lg->lg_prealloc_list[order], |
| pa_inode_list) { |
| spin_lock(&tmp_pa->pa_lock); |
| @@ -4177,12 +4177,12 @@ static void ext4_mb_add_n_trim(struct ext4_allocation_context *ac) |
| if (!added) |
| list_add_tail_rcu(&pa->pa_inode_list, |
| &lg->lg_prealloc_list[order]); |
| - rcu_read_unlock(); |
| + spin_unlock(&lg->lg_prealloc_lock); |
| |
| /* Now trim the list to be not more than 8 elements */ |
| if (lg_prealloc_count > 8) { |
| ext4_mb_discard_lg_preallocations(sb, lg, |
| - order, lg_prealloc_count); |
| + order, lg_prealloc_count); |
| return; |
| } |
| return ; |
| -- |
| 1.8.5.2 |
| |