Subject : 2.6.36 BUG: scheduling while atomic: rc.sysinit/1376/0x00000002
Submitter : Mathias Burén <firstname.lastname@example.org>
Date : 2010-11-01 18:39
Message-ID : AANLkTi=kkW7ruOVp7mPsMDWRRkL2CqrOJCyZqxj_Vekm@mail.gmail.com
References : http://marc.info/?l=linux-kernel&m=128863676810517&w=2
This entry is being used for tracking a regression from 2.6.35. Please don't
close it until the problem is fixed in the mainline.
This is caused by an interaction in two changes that happened in parallel in 2.6.36: commit id's dd3932eddf4 (block: remove BLKDEV_IFL_WAIT) and
commit 5c521830cf3 (ext4: Support discard requests when running in no-journal mode).
The problem is that ext4_free_blocks() can be called by functions which are holding spinlocks, so it can't sleep --- and sb_issue_discard() now always waits for the discard to be completed. It doesn't support an asynchronous mode at all.
The fix for the short-term is to remove the call to ext4_issue_discard() in ext4_free_blocks(). This effectively removes the functionality of commit 5c521830cf3. The long-term fix would be to implement a version of sb_issue_discard() which supports asynchronous mode, with an optional callback.
Author: Theodore Ts'o <email@example.com>
Date: Mon Nov 8 13:49:33 2010 -0500
ext4: Don't call sb_issue_discard() in ext4_free_blocks()