@@ -1677,6 +1677,7 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
1677
1677
struct inode * bd_inode = bdev_file_inode (file );
1678
1678
loff_t size = i_size_read (bd_inode );
1679
1679
struct blk_plug plug ;
1680
+ size_t shorted = 0 ;
1680
1681
ssize_t ret ;
1681
1682
1682
1683
if (bdev_read_only (I_BDEV (bd_inode )))
@@ -1694,12 +1695,17 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
1694
1695
if ((iocb -> ki_flags & (IOCB_NOWAIT | IOCB_DIRECT )) == IOCB_NOWAIT )
1695
1696
return - EOPNOTSUPP ;
1696
1697
1697
- iov_iter_truncate (from , size - iocb -> ki_pos );
1698
+ size -= iocb -> ki_pos ;
1699
+ if (iov_iter_count (from ) > size ) {
1700
+ shorted = iov_iter_count (from ) - size ;
1701
+ iov_iter_truncate (from , size );
1702
+ }
1698
1703
1699
1704
blk_start_plug (& plug );
1700
1705
ret = __generic_file_write_iter (iocb , from );
1701
1706
if (ret > 0 )
1702
1707
ret = generic_write_sync (iocb , ret );
1708
+ iov_iter_reexpand (from , iov_iter_count (from ) + shorted );
1703
1709
blk_finish_plug (& plug );
1704
1710
return ret ;
1705
1711
}
@@ -1711,13 +1717,21 @@ ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
1711
1717
struct inode * bd_inode = bdev_file_inode (file );
1712
1718
loff_t size = i_size_read (bd_inode );
1713
1719
loff_t pos = iocb -> ki_pos ;
1720
+ size_t shorted = 0 ;
1721
+ ssize_t ret ;
1714
1722
1715
1723
if (pos >= size )
1716
1724
return 0 ;
1717
1725
1718
1726
size -= pos ;
1719
- iov_iter_truncate (to , size );
1720
- return generic_file_read_iter (iocb , to );
1727
+ if (iov_iter_count (to ) > size ) {
1728
+ shorted = iov_iter_count (to ) - size ;
1729
+ iov_iter_truncate (to , size );
1730
+ }
1731
+
1732
+ ret = generic_file_read_iter (iocb , to );
1733
+ iov_iter_reexpand (to , iov_iter_count (to ) + shorted );
1734
+ return ret ;
1721
1735
}
1722
1736
EXPORT_SYMBOL_GPL (blkdev_read_iter );
1723
1737
0 commit comments