ext4: Fix potential inode allocation soft lockup in Orlov allocator

If the Orlov allocator is having trouble finding an appropriate block
group, the fallback code could loop forever, causing a soft lockup
warning in find_group_orlov():

BUG: soft lockup - CPU#0 stuck for 61s! [cp:11728]
     ...
Pid: 11728, comm: cp Not tainted (2.6.30-rc1-dirty #77) Lenovo          
EIP: 0060:[<c021650e>] EFLAGS: 00000246 CPU: 0
EIP is at ext4_get_group_desc+0x54/0x9d
    ...
Call Trace:
 [<c0218021>] find_group_orlov+0x2ee/0x334
 [<c0120a5f>] ? sched_clock+0x8/0xb
 [<c02188e3>] ext4_new_inode+0x2cf/0xb1a

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
Theodore Ts'o 2009-04-22 21:00:36 -04:00
parent e84a26ce17
commit b5451f7b26

View File

@ -585,6 +585,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
fallback: fallback:
ngroups = sbi->s_groups_count; ngroups = sbi->s_groups_count;
avefreei = freei / ngroups; avefreei = freei / ngroups;
fallback_retry:
parent_group = EXT4_I(parent)->i_block_group; parent_group = EXT4_I(parent)->i_block_group;
for (i = 0; i < ngroups; i++) { for (i = 0; i < ngroups; i++) {
grp = (parent_group + i) % ngroups; grp = (parent_group + i) % ngroups;
@ -602,7 +603,7 @@ fallback:
* filesystems the above test can fail to find any blockgroups * filesystems the above test can fail to find any blockgroups
*/ */
avefreei = 0; avefreei = 0;
goto fallback; goto fallback_retry;
} }
return -1; return -1;