@@ -111,17 +111,12 @@ static sector_t bio_write_zeroes_limit(struct block_device *bdev)
111111 (UINT_MAX >> SECTOR_SHIFT ) & ~bs_mask );
112112}
113113
114- static int __blkdev_issue_write_zeroes (struct block_device * bdev ,
114+ static void __blkdev_issue_write_zeroes (struct block_device * bdev ,
115115 sector_t sector , sector_t nr_sects , gfp_t gfp_mask ,
116116 struct bio * * biop , unsigned flags )
117117{
118118 struct bio * bio = * biop ;
119119
120- if (bdev_read_only (bdev ))
121- return - EPERM ;
122- if (!bdev_write_zeroes_sectors (bdev ))
123- return - EOPNOTSUPP ;
124-
125120 while (nr_sects ) {
126121 unsigned int len = min_t (sector_t , nr_sects ,
127122 bio_write_zeroes_limit (bdev ));
@@ -138,7 +133,6 @@ static int __blkdev_issue_write_zeroes(struct block_device *bdev,
138133 }
139134
140135 * biop = bio ;
141- return 0 ;
142136}
143137
144138/*
@@ -154,17 +148,14 @@ static unsigned int __blkdev_sectors_to_bio_pages(sector_t nr_sects)
154148 return min (pages , (sector_t )BIO_MAX_VECS );
155149}
156150
157- static int __blkdev_issue_zero_pages (struct block_device * bdev ,
151+ static void __blkdev_issue_zero_pages (struct block_device * bdev ,
158152 sector_t sector , sector_t nr_sects , gfp_t gfp_mask ,
159153 struct bio * * biop )
160154{
161155 struct bio * bio = * biop ;
162156 int bi_size = 0 ;
163157 unsigned int sz ;
164158
165- if (bdev_read_only (bdev ))
166- return - EPERM ;
167-
168159 while (nr_sects != 0 ) {
169160 bio = blk_next_bio (bio , bdev , __blkdev_sectors_to_bio_pages (nr_sects ),
170161 REQ_OP_WRITE , gfp_mask );
@@ -182,7 +173,6 @@ static int __blkdev_issue_zero_pages(struct block_device *bdev,
182173 }
183174
184175 * biop = bio ;
185- return 0 ;
186176}
187177
188178/**
@@ -208,15 +198,19 @@ int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
208198 sector_t nr_sects , gfp_t gfp_mask , struct bio * * biop ,
209199 unsigned flags )
210200{
211- int ret ;
212-
213- ret = __blkdev_issue_write_zeroes (bdev , sector , nr_sects , gfp_mask ,
214- biop , flags );
215- if (ret != - EOPNOTSUPP || (flags & BLKDEV_ZERO_NOFALLBACK ))
216- return ret ;
201+ if (bdev_read_only (bdev ))
202+ return - EPERM ;
217203
218- return __blkdev_issue_zero_pages (bdev , sector , nr_sects , gfp_mask ,
219- biop );
204+ if (bdev_write_zeroes_sectors (bdev )) {
205+ __blkdev_issue_write_zeroes (bdev , sector , nr_sects ,
206+ gfp_mask , biop , flags );
207+ } else {
208+ if (flags & BLKDEV_ZERO_NOFALLBACK )
209+ return - EOPNOTSUPP ;
210+ __blkdev_issue_zero_pages (bdev , sector , nr_sects , gfp_mask ,
211+ biop );
212+ }
213+ return 0 ;
220214}
221215EXPORT_SYMBOL (__blkdev_issue_zeroout );
222216
@@ -245,21 +239,22 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
245239 bs_mask = (bdev_logical_block_size (bdev ) >> 9 ) - 1 ;
246240 if ((sector | nr_sects ) & bs_mask )
247241 return - EINVAL ;
242+ if (bdev_read_only (bdev ))
243+ return - EPERM ;
244+ if ((flags & BLKDEV_ZERO_NOFALLBACK ) && !try_write_zeroes )
245+ return - EOPNOTSUPP ;
248246
249247retry :
250248 bio = NULL ;
251249 blk_start_plug (& plug );
252250 if (try_write_zeroes ) {
253- ret = __blkdev_issue_write_zeroes (bdev , sector , nr_sects ,
254- gfp_mask , & bio , flags );
255- } else if (!(flags & BLKDEV_ZERO_NOFALLBACK )) {
256- ret = __blkdev_issue_zero_pages (bdev , sector , nr_sects ,
257- gfp_mask , & bio );
251+ __blkdev_issue_write_zeroes (bdev , sector , nr_sects , gfp_mask ,
252+ & bio , flags );
258253 } else {
259- /* No zeroing offload support */
260- ret = - EOPNOTSUPP ;
254+ __blkdev_issue_zero_pages ( bdev , sector , nr_sects , gfp_mask ,
255+ & bio ) ;
261256 }
262- if (ret == 0 && bio ) {
257+ if (bio ) {
263258 ret = submit_bio_wait (bio );
264259 bio_put (bio );
265260 }
0 commit comments