@@ -111,17 +111,12 @@ static sector_t bio_write_zeroes_limit(struct block_device *bdev)
111
111
(UINT_MAX >> SECTOR_SHIFT ) & ~bs_mask );
112
112
}
113
113
114
- static int __blkdev_issue_write_zeroes (struct block_device * bdev ,
114
+ static void __blkdev_issue_write_zeroes (struct block_device * bdev ,
115
115
sector_t sector , sector_t nr_sects , gfp_t gfp_mask ,
116
116
struct bio * * biop , unsigned flags )
117
117
{
118
118
struct bio * bio = * biop ;
119
119
120
- if (bdev_read_only (bdev ))
121
- return - EPERM ;
122
- if (!bdev_write_zeroes_sectors (bdev ))
123
- return - EOPNOTSUPP ;
124
-
125
120
while (nr_sects ) {
126
121
unsigned int len = min_t (sector_t , nr_sects ,
127
122
bio_write_zeroes_limit (bdev ));
@@ -138,7 +133,6 @@ static int __blkdev_issue_write_zeroes(struct block_device *bdev,
138
133
}
139
134
140
135
* biop = bio ;
141
- return 0 ;
142
136
}
143
137
144
138
/*
@@ -154,17 +148,14 @@ static unsigned int __blkdev_sectors_to_bio_pages(sector_t nr_sects)
154
148
return min (pages , (sector_t )BIO_MAX_VECS );
155
149
}
156
150
157
- static int __blkdev_issue_zero_pages (struct block_device * bdev ,
151
+ static void __blkdev_issue_zero_pages (struct block_device * bdev ,
158
152
sector_t sector , sector_t nr_sects , gfp_t gfp_mask ,
159
153
struct bio * * biop )
160
154
{
161
155
struct bio * bio = * biop ;
162
156
int bi_size = 0 ;
163
157
unsigned int sz ;
164
158
165
- if (bdev_read_only (bdev ))
166
- return - EPERM ;
167
-
168
159
while (nr_sects != 0 ) {
169
160
bio = blk_next_bio (bio , bdev , __blkdev_sectors_to_bio_pages (nr_sects ),
170
161
REQ_OP_WRITE , gfp_mask );
@@ -182,7 +173,6 @@ static int __blkdev_issue_zero_pages(struct block_device *bdev,
182
173
}
183
174
184
175
* biop = bio ;
185
- return 0 ;
186
176
}
187
177
188
178
/**
@@ -208,15 +198,19 @@ int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
208
198
sector_t nr_sects , gfp_t gfp_mask , struct bio * * biop ,
209
199
unsigned flags )
210
200
{
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 ;
217
203
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 ;
220
214
}
221
215
EXPORT_SYMBOL (__blkdev_issue_zeroout );
222
216
@@ -245,21 +239,22 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
245
239
bs_mask = (bdev_logical_block_size (bdev ) >> 9 ) - 1 ;
246
240
if ((sector | nr_sects ) & bs_mask )
247
241
return - EINVAL ;
242
+ if (bdev_read_only (bdev ))
243
+ return - EPERM ;
244
+ if ((flags & BLKDEV_ZERO_NOFALLBACK ) && !try_write_zeroes )
245
+ return - EOPNOTSUPP ;
248
246
249
247
retry :
250
248
bio = NULL ;
251
249
blk_start_plug (& plug );
252
250
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 );
258
253
} else {
259
- /* No zeroing offload support */
260
- ret = - EOPNOTSUPP ;
254
+ __blkdev_issue_zero_pages ( bdev , sector , nr_sects , gfp_mask ,
255
+ & bio ) ;
261
256
}
262
- if (ret == 0 && bio ) {
257
+ if (bio ) {
263
258
ret = submit_bio_wait (bio );
264
259
bio_put (bio );
265
260
}
0 commit comments