blkdev_write_iter: expand generic_file_checks() call in there
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 7 Apr 2015 15:35:14 +0000 (11:35 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 12 Apr 2015 02:29:48 +0000 (22:29 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/block_dev.c

index bcd7f97beab9d5cabb841ed3d8b968d0719aa890..897ee0503932fbbf7adc88b0fd27591576696160 100644 (file)
@@ -1595,18 +1595,21 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
        struct file *file = iocb->ki_filp;
+       struct inode *bd_inode = file->f_mapping->host;
+       loff_t size = i_size_read(bd_inode);
        struct blk_plug plug;
        ssize_t ret;
-       size_t count = iov_iter_count(from);
 
-       ret = generic_write_checks(file, &iocb->ki_pos, &count, 1);
-       if (ret)
-               return ret;
+       if (bdev_read_only(I_BDEV(bd_inode)))
+               return -EPERM;
 
-       if (count == 0)
+       if (!iov_iter_count(from))
                return 0;
 
-       iov_iter_truncate(from, count);
+       if (iocb->ki_pos >= size)
+               return -ENOSPC;
+
+       iov_iter_truncate(from, size - iocb->ki_pos);
 
        blk_start_plug(&plug);
        ret = __generic_file_write_iter(iocb, from);