diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-12 17:13:23 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-12 17:13:23 -0500 |
commit | 3e12cefbe143b4947171ff92dd50024c4841e291 (patch) | |
tree | f58ec23a4092576ed08843cca5f5443a32106bd1 /fs/block_dev.c | |
parent | 6bec0035286119eefc32a5b1102127e6a4032cb2 (diff) | |
parent | d427e3c82ef4fc5fbb22c0cef0b040e6767b1028 (diff) |
Merge branch 'for-3.20/core' of git://git.kernel.dk/linux-block
Pull core block IO changes from Jens Axboe:
"This contains:
- A series from Christoph that cleans up and refactors various parts
of the REQ_BLOCK_PC handling. Contributions in that series from
Dongsu Park and Kent Overstreet as well.
- CFQ:
- A bug fix for cfq for realtime IO scheduling from Jeff Moyer.
- A stable patch fixing a potential crash in CFQ in OOM
situations. From Konstantin Khlebnikov.
- blk-mq:
- Add support for tag allocation policies, from Shaohua. This is
a prep patch enabling libata (and other SCSI parts) to use the
blk-mq tagging, instead of rolling their own.
- Various little tweaks from Keith and Mike, in preparation for
DM blk-mq support.
- Minor little fixes or tweaks from me.
- A double free error fix from Tony Battersby.
- The partition 4k issue fixes from Matthew and Boaz.
- Add support for zero+unprovision for blkdev_issue_zeroout() from
Martin"
* 'for-3.20/core' of git://git.kernel.dk/linux-block: (27 commits)
block: remove unused function blk_bio_map_sg
block: handle the null_mapped flag correctly in blk_rq_map_user_iov
blk-mq: fix double-free in error path
block: prevent request-to-request merging with gaps if not allowed
blk-mq: make blk_mq_run_queues() static
dm: fix multipath regression due to initializing wrong request
cfq-iosched: handle failure of cfq group allocation
block: Quiesce zeroout wrapper
block: rewrite and split __bio_copy_iov()
block: merge __bio_map_user_iov into bio_map_user_iov
block: merge __bio_map_kern into bio_map_kern
block: pass iov_iter to the BLOCK_PC mapping functions
block: add a helper to free bio bounce buffer pages
block: use blk_rq_map_user_iov to implement blk_rq_map_user
block: simplify bio_map_kern
block: mark blk-mq devices as stackable
block: keep established cmd_flags when cloning into a blk-mq request
block: add blk-mq support to blk_insert_cloned_request()
block: require blk_rq_prep_clone() be given an initialized clone request
blk-mq: add tag allocation policy
...
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index a9f92794d7a0..975266be67d3 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -421,6 +421,46 @@ int bdev_write_page(struct block_device *bdev, sector_t sector, | |||
421 | } | 421 | } |
422 | EXPORT_SYMBOL_GPL(bdev_write_page); | 422 | EXPORT_SYMBOL_GPL(bdev_write_page); |
423 | 423 | ||
424 | /** | ||
425 | * bdev_direct_access() - Get the address for directly-accessibly memory | ||
426 | * @bdev: The device containing the memory | ||
427 | * @sector: The offset within the device | ||
428 | * @addr: Where to put the address of the memory | ||
429 | * @pfn: The Page Frame Number for the memory | ||
430 | * @size: The number of bytes requested | ||
431 | * | ||
432 | * If a block device is made up of directly addressable memory, this function | ||
433 | * will tell the caller the PFN and the address of the memory. The address | ||
434 | * may be directly dereferenced within the kernel without the need to call | ||
435 | * ioremap(), kmap() or similar. The PFN is suitable for inserting into | ||
436 | * page tables. | ||
437 | * | ||
438 | * Return: negative errno if an error occurs, otherwise the number of bytes | ||
439 | * accessible at this address. | ||
440 | */ | ||
441 | long bdev_direct_access(struct block_device *bdev, sector_t sector, | ||
442 | void **addr, unsigned long *pfn, long size) | ||
443 | { | ||
444 | long avail; | ||
445 | const struct block_device_operations *ops = bdev->bd_disk->fops; | ||
446 | |||
447 | if (size < 0) | ||
448 | return size; | ||
449 | if (!ops->direct_access) | ||
450 | return -EOPNOTSUPP; | ||
451 | if ((sector + DIV_ROUND_UP(size, 512)) > | ||
452 | part_nr_sects_read(bdev->bd_part)) | ||
453 | return -ERANGE; | ||
454 | sector += get_start_sect(bdev); | ||
455 | if (sector % (PAGE_SIZE / 512)) | ||
456 | return -EINVAL; | ||
457 | avail = ops->direct_access(bdev, sector, addr, pfn, size); | ||
458 | if (!avail) | ||
459 | return -ERANGE; | ||
460 | return min(avail, size); | ||
461 | } | ||
462 | EXPORT_SYMBOL_GPL(bdev_direct_access); | ||
463 | |||
424 | /* | 464 | /* |
425 | * pseudo-fs | 465 | * pseudo-fs |
426 | */ | 466 | */ |