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