diff options
Diffstat (limited to 'fs/block_dev.c')
| -rw-r--r-- | fs/block_dev.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index b3c1d3dae77d..1a1e5e3b1eaf 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1661,6 +1661,39 @@ static int blkdev_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 1661 | return ret; | 1661 | return ret; |
| 1662 | } | 1662 | } |
| 1663 | 1663 | ||
| 1664 | static ssize_t blkdev_splice_read(struct file *file, loff_t *ppos, | ||
| 1665 | struct pipe_inode_info *pipe, size_t len, | ||
| 1666 | unsigned int flags) | ||
| 1667 | { | ||
| 1668 | ssize_t ret; | ||
| 1669 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | ||
| 1670 | |||
| 1671 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1672 | |||
| 1673 | ret = generic_file_splice_read(file, ppos, pipe, len, flags); | ||
| 1674 | |||
| 1675 | percpu_up_read(&bdev->bd_block_size_semaphore); | ||
| 1676 | |||
| 1677 | return ret; | ||
| 1678 | } | ||
| 1679 | |||
| 1680 | static ssize_t blkdev_splice_write(struct pipe_inode_info *pipe, | ||
| 1681 | struct file *file, loff_t *ppos, size_t len, | ||
| 1682 | unsigned int flags) | ||
| 1683 | { | ||
| 1684 | ssize_t ret; | ||
| 1685 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | ||
| 1686 | |||
| 1687 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1688 | |||
| 1689 | ret = generic_file_splice_write(pipe, file, ppos, len, flags); | ||
| 1690 | |||
| 1691 | percpu_up_read(&bdev->bd_block_size_semaphore); | ||
| 1692 | |||
| 1693 | return ret; | ||
| 1694 | } | ||
| 1695 | |||
| 1696 | |||
| 1664 | /* | 1697 | /* |
| 1665 | * Try to release a page associated with block device when the system | 1698 | * Try to release a page associated with block device when the system |
| 1666 | * is under memory pressure. | 1699 | * is under memory pressure. |
| @@ -1699,8 +1732,8 @@ const struct file_operations def_blk_fops = { | |||
| 1699 | #ifdef CONFIG_COMPAT | 1732 | #ifdef CONFIG_COMPAT |
| 1700 | .compat_ioctl = compat_blkdev_ioctl, | 1733 | .compat_ioctl = compat_blkdev_ioctl, |
| 1701 | #endif | 1734 | #endif |
| 1702 | .splice_read = generic_file_splice_read, | 1735 | .splice_read = blkdev_splice_read, |
| 1703 | .splice_write = generic_file_splice_write, | 1736 | .splice_write = blkdev_splice_write, |
| 1704 | }; | 1737 | }; |
| 1705 | 1738 | ||
| 1706 | int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) | 1739 | int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) |
