From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu, 11 Oct 2012 00:04:23 +0000 (+0900)
Subject: Merge branch 'for-3.7/core' of git://git.kernel.dk/linux-block
X-Git-Tag: firefly_0821_release~3680^2~1858
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ce40be7a820bb393ac4ac69865f018d2f4038cf0;p=firefly-linux-kernel-4.4.55.git

Merge branch 'for-3.7/core' of git://git.kernel.dk/linux-block

Pull block IO update from Jens Axboe:
 "Core block IO bits for 3.7.  Not a huge round this time, it contains:

   - First series from Kent cleaning up and generalizing bio allocation
     and freeing.

   - WRITE_SAME support from Martin.

   - Mikulas patches to prevent O_DIRECT crashes when someone changes
     the block size of a device.

   - Make bio_split() work on data-less bio's (like trim/discards).

   - A few other minor fixups."

Fixed up silent semantic mis-merge as per Mikulas Patocka and Andrew
Morton.  It is due to the VM no longer using a prio-tree (see commit
6b2dbba8b6ac: "mm: replace vma prio_tree with an interval tree").

So make set_blocksize() use mapping_mapped() instead of open-coding the
internal VM knowledge that has changed.

* 'for-3.7/core' of git://git.kernel.dk/linux-block: (26 commits)
  block: makes bio_split support bio without data
  scatterlist: refactor the sg_nents
  scatterlist: add sg_nents
  fs: fix include/percpu-rwsem.h export error
  percpu-rw-semaphore: fix documentation typos
  fs/block_dev.c:1644:5: sparse: symbol 'blkdev_mmap' was not declared
  blockdev: turn a rw semaphore into a percpu rw semaphore
  Fix a crash when block device is read and block size is changed at the same time
  block: fix request_queue->flags initialization
  block: lift the initial queue bypass mode on blk_register_queue() instead of blk_init_allocated_queue()
  block: ioctl to zero block ranges
  block: Make blkdev_issue_zeroout use WRITE SAME
  block: Implement support for WRITE SAME
  block: Consolidate command flag and queue limit checks for merges
  block: Clean up special command handling logic
  block/blk-tag.c: Remove useless kfree
  block: remove the duplicated setting for congestion_threshold
  block: reject invalid queue attribute values
  block: Add bio_clone_bioset(), bio_clone_kmalloc()
  block: Consolidate bio_alloc_bioset(), bio_kmalloc()
  ...
---

ce40be7a820bb393ac4ac69865f018d2f4038cf0
diff --cc fs/block_dev.c
index 38e721b35d45,37967bcea05c..b3c1d3dae77d
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@@ -124,6 -126,20 +126,19 @@@ int set_blocksize(struct block_device *
  	if (size < bdev_logical_block_size(bdev))
  		return -EINVAL;
  
+ 	/* Prevent starting I/O or mapping the device */
+ 	percpu_down_write(&bdev->bd_block_size_semaphore);
+ 
+ 	/* Check that the block device is not memory mapped */
+ 	mapping = bdev->bd_inode->i_mapping;
+ 	mutex_lock(&mapping->i_mmap_mutex);
 -	if (!prio_tree_empty(&mapping->i_mmap) ||
 -	    !list_empty(&mapping->i_mmap_nonlinear)) {
++	if (mapping_mapped(mapping)) {
+ 		mutex_unlock(&mapping->i_mmap_mutex);
+ 		percpu_up_write(&bdev->bd_block_size_semaphore);
+ 		return -EBUSY;
+ 	}
+ 	mutex_unlock(&mapping->i_mmap_mutex);
+ 
  	/* Don't change the size if it is same as current */
  	if (bdev->bd_block_size != size) {
  		sync_blockdev(bdev);