@@ -103,24 +103,28 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
103
103
}
104
104
EXPORT_SYMBOL (blkdev_issue_discard );
105
105
106
+ static sector_t bio_write_zeroes_limit (struct block_device * bdev )
107
+ {
108
+ sector_t bs_mask = (bdev_logical_block_size (bdev ) >> 9 ) - 1 ;
109
+
110
+ return min (bdev_write_zeroes_sectors (bdev ),
111
+ (UINT_MAX >> SECTOR_SHIFT ) & ~bs_mask );
112
+ }
113
+
106
114
static int __blkdev_issue_write_zeroes (struct block_device * bdev ,
107
115
sector_t sector , sector_t nr_sects , gfp_t gfp_mask ,
108
116
struct bio * * biop , unsigned flags )
109
117
{
110
118
struct bio * bio = * biop ;
111
- unsigned int max_sectors ;
112
119
113
120
if (bdev_read_only (bdev ))
114
121
return - EPERM ;
115
-
116
- /* Ensure that max_sectors doesn't overflow bi_size */
117
- max_sectors = bdev_write_zeroes_sectors (bdev );
118
-
119
- if (max_sectors == 0 )
122
+ if (!bdev_write_zeroes_sectors (bdev ))
120
123
return - EOPNOTSUPP ;
121
124
122
125
while (nr_sects ) {
123
- unsigned int len = min_t (sector_t , nr_sects , max_sectors );
126
+ unsigned int len = min_t (sector_t , nr_sects ,
127
+ bio_write_zeroes_limit (bdev ));
124
128
125
129
bio = blk_next_bio (bio , bdev , 0 , REQ_OP_WRITE_ZEROES , gfp_mask );
126
130
bio -> bi_iter .bi_sector = sector ;
0 commit comments