diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-29 11:57:10 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-29 11:57:10 -0700 | 
| commit | d506aa68c23db708ad45ca8c17f0d7f5d7029a37 (patch) | |
| tree | 90c38b2938564e6486d51417ac51ecfed17b0d3d /fs | |
| parent | 7f474df0a7b7dadfc01ba778460a91f554ca1481 (diff) | |
| parent | cb1a5ab6ece7a37da4ac98ee26b0475b7c3ea79e (diff) | |
Merge branch 'for-linus' of git://git.kernel.dk/linux-block
Pull block layer fixes from Jens Axboe:
 "A small collection of fixes for the current kernel.  This contains:
   - Two error handling fixes from Jan Kara.  One for null_blk on
     failure to add a device, and the other for the block/scsi_ioctl
     SCSI_IOCTL_SEND_COMMAND fixing up the error jump point.
   - A commit added in the merge window for the bio integrity bits
     unfortunately disabled merging for all requests if
     CONFIG_BLK_DEV_INTEGRITY wasn't set.  Reverse the logic, so that
     integrity checking wont disallow merges when not enabled.
   - A fix from Ming Lei for merging and generating too many segments.
     This caused a BUG in virtio_blk.
   - Two error handling printk() fixups from Robert Elliott, improving
     the information given when we rate limit.
   - Error handling fixup on elevator_init() failure from Sudip
     Mukherjee.
   - A fix from Tony Battersby, fixing up a memory leak in the
     scatterlist handling with scsi-mq"
* 'for-linus' of git://git.kernel.dk/linux-block:
  block: Fix merge logic when CONFIG_BLK_DEV_INTEGRITY is not defined
  lib/scatterlist: fix memory leak with scsi-mq
  block: fix wrong error return in elevator_init()
  scsi: Fix error handling in SCSI_IOCTL_SEND_COMMAND
  null_blk: Cleanup error recovery in null_add_dev()
  blk-merge: recaculate segment if it isn't less than max segments
  fs: clarify rate limit suppressed buffer I/O errors
  fs: merge I/O error prints into one line
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/buffer.c | 38 | 
1 files changed, 9 insertions, 29 deletions
| diff --git a/fs/buffer.c b/fs/buffer.c index 6c48f20eddd4..20805db2c987 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -128,21 +128,15 @@ __clear_page_buffers(struct page *page)  	page_cache_release(page);  } - -static int quiet_error(struct buffer_head *bh) -{ -	if (!test_bit(BH_Quiet, &bh->b_state) && printk_ratelimit()) -		return 0; -	return 1; -} - - -static void buffer_io_error(struct buffer_head *bh) +static void buffer_io_error(struct buffer_head *bh, char *msg)  {  	char b[BDEVNAME_SIZE]; -	printk(KERN_ERR "Buffer I/O error on device %s, logical block %Lu\n", + +	if (!test_bit(BH_Quiet, &bh->b_state)) +		printk_ratelimited(KERN_ERR +			"Buffer I/O error on dev %s, logical block %llu%s\n",  			bdevname(bh->b_bdev, b), -			(unsigned long long)bh->b_blocknr); +			(unsigned long long)bh->b_blocknr, msg);  }  /* @@ -177,17 +171,10 @@ EXPORT_SYMBOL(end_buffer_read_sync);  void end_buffer_write_sync(struct buffer_head *bh, int uptodate)  { -	char b[BDEVNAME_SIZE]; -  	if (uptodate) {  		set_buffer_uptodate(bh);  	} else { -		if (!quiet_error(bh)) { -			buffer_io_error(bh); -			printk(KERN_WARNING "lost page write due to " -					"I/O error on %s\n", -				       bdevname(bh->b_bdev, b)); -		} +		buffer_io_error(bh, ", lost sync page write");  		set_buffer_write_io_error(bh);  		clear_buffer_uptodate(bh);  	} @@ -304,8 +291,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate)  		set_buffer_uptodate(bh);  	} else {  		clear_buffer_uptodate(bh); -		if (!quiet_error(bh)) -			buffer_io_error(bh); +		buffer_io_error(bh, ", async page read");  		SetPageError(page);  	} @@ -353,7 +339,6 @@ still_busy:   */  void end_buffer_async_write(struct buffer_head *bh, int uptodate)  { -	char b[BDEVNAME_SIZE];  	unsigned long flags;  	struct buffer_head *first;  	struct buffer_head *tmp; @@ -365,12 +350,7 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate)  	if (uptodate) {  		set_buffer_uptodate(bh);  	} else { -		if (!quiet_error(bh)) { -			buffer_io_error(bh); -			printk(KERN_WARNING "lost page write due to " -					"I/O error on %s\n", -			       bdevname(bh->b_bdev, b)); -		} +		buffer_io_error(bh, ", lost async page write");  		set_bit(AS_EIO, &page->mapping->flags);  		set_buffer_write_io_error(bh);  		clear_buffer_uptodate(bh); | 
