git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
->splice_write() via ->write_iter()
[pandora-kernel.git]
/
fs
/
block_dev.c
diff --git
a/fs/block_dev.c
b/fs/block_dev.c
index
ba0d2b0
..
e68e150
100644
(file)
--- a/
fs/block_dev.c
+++ b/
fs/block_dev.c
@@
-165,14
+165,15
@@
blkdev_get_block(struct inode *inode, sector_t iblock,
}
static ssize_t
}
static ssize_t
-blkdev_direct_IO(int rw, struct kiocb *iocb,
const struct iovec *iov
,
- loff_t offset
, unsigned long nr_segs
)
+blkdev_direct_IO(int rw, struct kiocb *iocb,
struct iov_iter *iter
,
+ loff_t offset)
{
struct file *file = iocb->ki_filp;
struct inode *inode = file->f_mapping->host;
{
struct file *file = iocb->ki_filp;
struct inode *inode = file->f_mapping->host;
- return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
- nr_segs, blkdev_get_block, NULL, NULL, 0);
+ return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iter,
+ offset, blkdev_get_block,
+ NULL, NULL, 0);
}
int __sync_blockdev(struct block_device *bdev, int wait)
}
int __sync_blockdev(struct block_device *bdev, int wait)
@@
-1508,43
+1509,38
@@
static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
* Does not take i_mutex for the write and thus is not for general purpose
* use.
*/
* Does not take i_mutex for the write and thus is not for general purpose
* use.
*/
-ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,
- unsigned long nr_segs, loff_t pos)
+ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
struct file *file = iocb->ki_filp;
struct blk_plug plug;
ssize_t ret;
{
struct file *file = iocb->ki_filp;
struct blk_plug plug;
ssize_t ret;
- BUG_ON(iocb->ki_pos != pos);
-
blk_start_plug(&plug);
blk_start_plug(&plug);
- ret = __generic_file_
aio_write(iocb, iov, nr_segs, &iocb->ki_pos
);
+ ret = __generic_file_
write_iter(iocb, from
);
if (ret > 0) {
ssize_t err;
if (ret > 0) {
ssize_t err;
-
- err = generic_write_sync(file, pos, ret);
+ err = generic_write_sync(file, iocb->ki_pos - ret, ret);
if (err < 0)
ret = err;
}
blk_finish_plug(&plug);
return ret;
}
if (err < 0)
ret = err;
}
blk_finish_plug(&plug);
return ret;
}
-EXPORT_SYMBOL_GPL(blkdev_
aio_write
);
+EXPORT_SYMBOL_GPL(blkdev_
write_iter
);
-static ssize_t blkdev_aio_read(struct kiocb *iocb, const struct iovec *iov,
- unsigned long nr_segs, loff_t pos)
+static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
struct file *file = iocb->ki_filp;
struct inode *bd_inode = file->f_mapping->host;
loff_t size = i_size_read(bd_inode);
{
struct file *file = iocb->ki_filp;
struct inode *bd_inode = file->f_mapping->host;
loff_t size = i_size_read(bd_inode);
+ loff_t pos = iocb->ki_pos;
if (pos >= size)
return 0;
size -= pos;
if (pos >= size)
return 0;
size -= pos;
- if (size < iocb->ki_nbytes)
- nr_segs = iov_shorten((struct iovec *)iov, nr_segs, size);
- return generic_file_aio_read(iocb, iov, nr_segs, pos);
+ iov_iter_truncate(to, size);
+ return generic_file_read_iter(iocb, to);
}
/*
}
/*
@@
-1576,10
+1572,10
@@
const struct file_operations def_blk_fops = {
.open = blkdev_open,
.release = blkdev_close,
.llseek = block_llseek,
.open = blkdev_open,
.release = blkdev_close,
.llseek = block_llseek,
- .read =
do
_sync_read,
- .write =
do
_sync_write,
- .
aio_read = blkdev_aio_read
,
- .
aio_write = blkdev_aio_write
,
+ .read =
new
_sync_read,
+ .write =
new
_sync_write,
+ .
read_iter = blkdev_read_iter
,
+ .
write_iter = blkdev_write_iter
,
.mmap = generic_file_mmap,
.fsync = blkdev_fsync,
.unlocked_ioctl = block_ioctl,
.mmap = generic_file_mmap,
.fsync = blkdev_fsync,
.unlocked_ioctl = block_ioctl,
@@
-1587,7
+1583,7
@@
const struct file_operations def_blk_fops = {
.compat_ioctl = compat_blkdev_ioctl,
#endif
.splice_read = generic_file_splice_read,
.compat_ioctl = compat_blkdev_ioctl,
#endif
.splice_read = generic_file_splice_read,
- .splice_write =
generic
_file_splice_write,
+ .splice_write =
iter
_file_splice_write,
};
int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
};
int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)