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:
|
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;
|
||||||
|
|
Loading…
Reference in New Issue