Single important block patch for 2.6.38
Hi Linus,
This fixes a regression introduced early in the 2.6.38 series, where blkdev_issue_zeroout() has a nasty race that causes a panic. Thanks to Lukas Czerner for finding and fixing this one. Please pull!
git://git.kernel.dk/linux-2.6-block.git for-linus
Lukas Czerner (1):
block: fix mis-synchronisation in blkdev_issue_zeroout()
block/blk-lib.c | 19 +++++++------------ 1 files changed, 7 insertions(+), 12 deletions(-)
block/blk-lib.c +7 -12
@@ -109,7 +109,6 @@ struct bio_batchatomic_t done;unsigned long flags;struct completion *wait; -bio_end_io_t *end_io; };static void bio_batch_end_io (struct bio *bio,int err)
@@ -122,12 +121,9 @@ static void bio_batch_end_io(struct bio *bio, int err)else clear_bit (BIO_UPTODATE , &bb->flags); } -if (bb) { -if (bb->end_io) - bb->end_io (bio, err); -atomic_inc (&bb->done); -complete (bb->wait); - } +if (bb) +if (atomic_dec_and_test (&bb->done)) +complete (bb->wait);bio_put (bio); }
@@ -150,13 +146,12 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,int ret;struct bio *bio;struct bio_batch bb; -unsigned int sz, issued =0 ; +unsigned int sz;DECLARE_COMPLETION_ONSTACK (wait); -atomic_set (&bb.done,0 ); +atomic_set (&bb.done,1 ); bb.flags =1 <<BIO_UPTODATE ; bb.wait = &wait; - bb.end_io =NULL ; submit: ret =0 ;
@@ -185,12 +180,12 @@ submit:break ; } ret =0 ; - issued++; +atomic_inc (&bb.done);submit_bio (WRITE , bio); }/* Wait for bios in-flight */ -while (issued !=atomic_read (&bb.done)) +if (!atomic_dec_and_test (&bb.done))wait_for_completion (&wait);if (!test_bit (BIO_UPTODATE , &bb.flags))
Signature · 1 line
Jens Axboe
Quoted 4 lines · Jens Axboe
This fixes a regression introduced early in the 2.6.38 series, where
blkdev_issue_zeroout()has a nasty race that causes a panic. Thanks to Lukas Czerner for finding and fixing this one. Please pull!
What about the "Null pointer OOPS in sync_inodes_sb" issue due to the broken sb->s_bdi setting to NULL?
Linus
Quoted 8 lines · Linus Torvalds
Quoted 4 lines · Jens Axboe
This fixes a regression introduced early in the 2.6.38 series, where
blkdev_issue_zeroout()has a nasty race that causes a panic. Thanks to Lukas Czerner for finding and fixing this one. Please pull!What about the "Null pointer OOPS in
sync_inodes_sb" issue due to the brokensb->s_bdisetting to NULL?
Sent something out to George to test, hopefully we can close this one for 2.6.38 in a simple fashion.
Signature · 1 line
Jens Axboe