block: make sure discard bio is aligned with logical block size
[linux-2.6-block.git] / block / blk-lib.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
f31e7e40
DM
2/*
3 * Functions related to generic helpers functions
4 */
5#include <linux/kernel.h>
6#include <linux/module.h>
7#include <linux/bio.h>
8#include <linux/blkdev.h>
9#include <linux/scatterlist.h>
10
11#include "blk.h"
12
a2d6b3a2 13struct bio *blk_next_bio(struct bio *bio, unsigned int nr_pages, gfp_t gfp)
f31e7e40 14{
9082e87b
CH
15 struct bio *new = bio_alloc(gfp, nr_pages);
16
17 if (bio) {
18 bio_chain(bio, new);
4e49ea4a 19 submit_bio(bio);
9082e87b 20 }
5dba3089 21
9082e87b 22 return new;
f31e7e40
DM
23}
24
38f25255 25int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
288dab8a 26 sector_t nr_sects, gfp_t gfp_mask, int flags,
469e3216 27 struct bio **biop)
f31e7e40 28{
f31e7e40 29 struct request_queue *q = bdev_get_queue(bdev);
38f25255 30 struct bio *bio = *biop;
ef295ecf 31 unsigned int op;
28b2be20 32 sector_t bs_mask;
f31e7e40
DM
33
34 if (!q)
35 return -ENXIO;
288dab8a 36
a13553c7
ID
37 if (bdev_read_only(bdev))
38 return -EPERM;
39
288dab8a
CH
40 if (flags & BLKDEV_DISCARD_SECURE) {
41 if (!blk_queue_secure_erase(q))
42 return -EOPNOTSUPP;
43 op = REQ_OP_SECURE_ERASE;
44 } else {
45 if (!blk_queue_discard(q))
46 return -EOPNOTSUPP;
47 op = REQ_OP_DISCARD;
48 }
f31e7e40 49
28b2be20
DW
50 bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
51 if ((sector | nr_sects) & bs_mask)
52 return -EINVAL;
53
5dba3089 54 while (nr_sects) {
744889b7
ML
55 unsigned int req_sects = nr_sects;
56 sector_t end_sect;
c6e66634 57
b88aef36
MP
58 if (!req_sects)
59 goto fail;
1adfc5e4 60 req_sects = min(req_sects, bio_allowed_max_sectors(q));
a22c4d7e 61
c6e66634 62 end_sect = sector + req_sects;
c6e66634 63
a2d6b3a2 64 bio = blk_next_bio(bio, 0, gfp_mask);
4f024f37 65 bio->bi_iter.bi_sector = sector;
74d46992 66 bio_set_dev(bio, bdev);
288dab8a 67 bio_set_op_attrs(bio, op, 0);
f31e7e40 68
4f024f37 69 bio->bi_iter.bi_size = req_sects << 9;
c6e66634
PB
70 nr_sects -= req_sects;
71 sector = end_sect;
f31e7e40 72
c8123f8c
JA
73 /*
74 * We can loop for a long time in here, if someone does
75 * full device discards (like mkfs). Be nice and allow
76 * us to schedule out to avoid softlocking if preempt
77 * is disabled.
78 */
79 cond_resched();
5dba3089 80 }
38f25255
CH
81
82 *biop = bio;
83 return 0;
b88aef36
MP
84
85fail:
86 if (bio) {
87 submit_bio_wait(bio);
88 bio_put(bio);
89 }
90 *biop = NULL;
91 return -EOPNOTSUPP;
38f25255
CH
92}
93EXPORT_SYMBOL(__blkdev_issue_discard);
94
95/**
96 * blkdev_issue_discard - queue a discard
97 * @bdev: blockdev to issue discard for
98 * @sector: start sector
99 * @nr_sects: number of sectors to discard
100 * @gfp_mask: memory allocation flags (for bio_alloc)
e554911c 101 * @flags: BLKDEV_DISCARD_* flags to control behaviour
38f25255
CH
102 *
103 * Description:
104 * Issue a discard request for the sectors in question.
105 */
106int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
107 sector_t nr_sects, gfp_t gfp_mask, unsigned long flags)
108{
38f25255
CH
109 struct bio *bio = NULL;
110 struct blk_plug plug;
111 int ret;
112
38f25255 113 blk_start_plug(&plug);
288dab8a 114 ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, flags,
38f25255 115 &bio);
bbd848e0 116 if (!ret && bio) {
4e49ea4a 117 ret = submit_bio_wait(bio);
48920ff2 118 if (ret == -EOPNOTSUPP)
bbd848e0 119 ret = 0;
05bd92dd 120 bio_put(bio);
bbd848e0 121 }
0cfbcafc 122 blk_finish_plug(&plug);
f31e7e40 123
bbd848e0 124 return ret;
f31e7e40
DM
125}
126EXPORT_SYMBOL(blkdev_issue_discard);
3f14d792 127
4363ac7c 128/**
e73c23ff 129 * __blkdev_issue_write_same - generate number of bios with same page
4363ac7c
MP
130 * @bdev: target blockdev
131 * @sector: start sector
132 * @nr_sects: number of sectors to write
133 * @gfp_mask: memory allocation flags (for bio_alloc)
134 * @page: page containing data to write
e73c23ff 135 * @biop: pointer to anchor bio
4363ac7c
MP
136 *
137 * Description:
e73c23ff 138 * Generate and issue number of bios(REQ_OP_WRITE_SAME) with same page.
4363ac7c 139 */
e73c23ff
CK
140static int __blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
141 sector_t nr_sects, gfp_t gfp_mask, struct page *page,
142 struct bio **biop)
4363ac7c 143{
4363ac7c
MP
144 struct request_queue *q = bdev_get_queue(bdev);
145 unsigned int max_write_same_sectors;
e73c23ff 146 struct bio *bio = *biop;
28b2be20 147 sector_t bs_mask;
4363ac7c
MP
148
149 if (!q)
150 return -ENXIO;
151
a13553c7
ID
152 if (bdev_read_only(bdev))
153 return -EPERM;
154
28b2be20
DW
155 bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
156 if ((sector | nr_sects) & bs_mask)
157 return -EINVAL;
158
e73c23ff
CK
159 if (!bdev_write_same(bdev))
160 return -EOPNOTSUPP;
161
b49a0871
ML
162 /* Ensure that max_write_same_sectors doesn't overflow bi_size */
163 max_write_same_sectors = UINT_MAX >> 9;
4363ac7c 164
4363ac7c 165 while (nr_sects) {
a2d6b3a2 166 bio = blk_next_bio(bio, 1, gfp_mask);
4f024f37 167 bio->bi_iter.bi_sector = sector;
74d46992 168 bio_set_dev(bio, bdev);
4363ac7c
MP
169 bio->bi_vcnt = 1;
170 bio->bi_io_vec->bv_page = page;
171 bio->bi_io_vec->bv_offset = 0;
172 bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev);
95fe6c1a 173 bio_set_op_attrs(bio, REQ_OP_WRITE_SAME, 0);
4363ac7c
MP
174
175 if (nr_sects > max_write_same_sectors) {
4f024f37 176 bio->bi_iter.bi_size = max_write_same_sectors << 9;
4363ac7c
MP
177 nr_sects -= max_write_same_sectors;
178 sector += max_write_same_sectors;
179 } else {
4f024f37 180 bio->bi_iter.bi_size = nr_sects << 9;
4363ac7c
MP
181 nr_sects = 0;
182 }
e73c23ff 183 cond_resched();
4363ac7c
MP
184 }
185
e73c23ff
CK
186 *biop = bio;
187 return 0;
188}
189
190/**
191 * blkdev_issue_write_same - queue a write same operation
192 * @bdev: target blockdev
193 * @sector: start sector
194 * @nr_sects: number of sectors to write
195 * @gfp_mask: memory allocation flags (for bio_alloc)
196 * @page: page containing data
197 *
198 * Description:
199 * Issue a write same request for the sectors in question.
200 */
201int blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
202 sector_t nr_sects, gfp_t gfp_mask,
203 struct page *page)
204{
205 struct bio *bio = NULL;
206 struct blk_plug plug;
207 int ret;
208
209 blk_start_plug(&plug);
210 ret = __blkdev_issue_write_same(bdev, sector, nr_sects, gfp_mask, page,
211 &bio);
212 if (ret == 0 && bio) {
4e49ea4a 213 ret = submit_bio_wait(bio);
05bd92dd
ST
214 bio_put(bio);
215 }
e73c23ff 216 blk_finish_plug(&plug);
3f40bf2c 217 return ret;
4363ac7c
MP
218}
219EXPORT_SYMBOL(blkdev_issue_write_same);
220
a6f0788e
CK
221static int __blkdev_issue_write_zeroes(struct block_device *bdev,
222 sector_t sector, sector_t nr_sects, gfp_t gfp_mask,
d928be9f 223 struct bio **biop, unsigned flags)
a6f0788e
CK
224{
225 struct bio *bio = *biop;
226 unsigned int max_write_zeroes_sectors;
227 struct request_queue *q = bdev_get_queue(bdev);
228
229 if (!q)
230 return -ENXIO;
231
a13553c7
ID
232 if (bdev_read_only(bdev))
233 return -EPERM;
234
a6f0788e
CK
235 /* Ensure that max_write_zeroes_sectors doesn't overflow bi_size */
236 max_write_zeroes_sectors = bdev_write_zeroes_sectors(bdev);
237
238 if (max_write_zeroes_sectors == 0)
239 return -EOPNOTSUPP;
240
241 while (nr_sects) {
a2d6b3a2 242 bio = blk_next_bio(bio, 0, gfp_mask);
a6f0788e 243 bio->bi_iter.bi_sector = sector;
74d46992 244 bio_set_dev(bio, bdev);
d928be9f
CH
245 bio->bi_opf = REQ_OP_WRITE_ZEROES;
246 if (flags & BLKDEV_ZERO_NOUNMAP)
247 bio->bi_opf |= REQ_NOUNMAP;
a6f0788e
CK
248
249 if (nr_sects > max_write_zeroes_sectors) {
250 bio->bi_iter.bi_size = max_write_zeroes_sectors << 9;
251 nr_sects -= max_write_zeroes_sectors;
252 sector += max_write_zeroes_sectors;
253 } else {
254 bio->bi_iter.bi_size = nr_sects << 9;
255 nr_sects = 0;
256 }
257 cond_resched();
258 }
259
260 *biop = bio;
261 return 0;
262}
263
615d22a5
DLM
264/*
265 * Convert a number of 512B sectors to a number of pages.
266 * The result is limited to a number of pages that can fit into a BIO.
267 * Also make sure that the result is always at least 1 (page) for the cases
268 * where nr_sects is lower than the number of sectors in a page.
269 */
270static unsigned int __blkdev_sectors_to_bio_pages(sector_t nr_sects)
271{
09c2c359 272 sector_t pages = DIV_ROUND_UP_SECTOR_T(nr_sects, PAGE_SIZE / 512);
615d22a5 273
09c2c359 274 return min(pages, (sector_t)BIO_MAX_PAGES);
615d22a5
DLM
275}
276
425a4dba
ID
277static int __blkdev_issue_zero_pages(struct block_device *bdev,
278 sector_t sector, sector_t nr_sects, gfp_t gfp_mask,
279 struct bio **biop)
280{
281 struct request_queue *q = bdev_get_queue(bdev);
282 struct bio *bio = *biop;
283 int bi_size = 0;
284 unsigned int sz;
285
286 if (!q)
287 return -ENXIO;
288
a13553c7
ID
289 if (bdev_read_only(bdev))
290 return -EPERM;
291
425a4dba 292 while (nr_sects != 0) {
a2d6b3a2
DLM
293 bio = blk_next_bio(bio, __blkdev_sectors_to_bio_pages(nr_sects),
294 gfp_mask);
425a4dba
ID
295 bio->bi_iter.bi_sector = sector;
296 bio_set_dev(bio, bdev);
297 bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
298
299 while (nr_sects != 0) {
300 sz = min((sector_t) PAGE_SIZE, nr_sects << 9);
301 bi_size = bio_add_page(bio, ZERO_PAGE(0), sz, 0);
302 nr_sects -= bi_size >> 9;
303 sector += bi_size >> 9;
304 if (bi_size < sz)
305 break;
306 }
307 cond_resched();
308 }
309
310 *biop = bio;
311 return 0;
312}
313
3f14d792 314/**
e73c23ff 315 * __blkdev_issue_zeroout - generate number of zero filed write bios
3f14d792
DM
316 * @bdev: blockdev to issue
317 * @sector: start sector
318 * @nr_sects: number of sectors to write
319 * @gfp_mask: memory allocation flags (for bio_alloc)
e73c23ff 320 * @biop: pointer to anchor bio
ee472d83 321 * @flags: controls detailed behavior
3f14d792
DM
322 *
323 * Description:
ee472d83
CH
324 * Zero-fill a block range, either using hardware offload or by explicitly
325 * writing zeroes to the device.
326 *
327 * If a device is using logical block provisioning, the underlying space will
328 * not be released if %flags contains BLKDEV_ZERO_NOUNMAP.
cb365b96
CH
329 *
330 * If %flags contains BLKDEV_ZERO_NOFALLBACK, the function will return
331 * -EOPNOTSUPP if no explicit hardware offload for zeroing is provided.
3f14d792 332 */
e73c23ff
CK
333int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
334 sector_t nr_sects, gfp_t gfp_mask, struct bio **biop,
ee472d83 335 unsigned flags)
3f14d792 336{
18edc8ea 337 int ret;
28b2be20
DW
338 sector_t bs_mask;
339
340 bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
341 if ((sector | nr_sects) & bs_mask)
342 return -EINVAL;
3f14d792 343
a6f0788e 344 ret = __blkdev_issue_write_zeroes(bdev, sector, nr_sects, gfp_mask,
d928be9f 345 biop, flags);
cb365b96 346 if (ret != -EOPNOTSUPP || (flags & BLKDEV_ZERO_NOFALLBACK))
425a4dba 347 return ret;
3f14d792 348
425a4dba
ID
349 return __blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp_mask,
350 biop);
3f14d792 351}
e73c23ff 352EXPORT_SYMBOL(__blkdev_issue_zeroout);
579e8f3c
MP
353
354/**
355 * blkdev_issue_zeroout - zero-fill a block range
356 * @bdev: blockdev to write
357 * @sector: start sector
358 * @nr_sects: number of sectors to write
359 * @gfp_mask: memory allocation flags (for bio_alloc)
ee472d83 360 * @flags: controls detailed behavior
579e8f3c
MP
361 *
362 * Description:
ee472d83
CH
363 * Zero-fill a block range, either using hardware offload or by explicitly
364 * writing zeroes to the device. See __blkdev_issue_zeroout() for the
365 * valid values for %flags.
579e8f3c 366 */
579e8f3c 367int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
ee472d83 368 sector_t nr_sects, gfp_t gfp_mask, unsigned flags)
579e8f3c 369{
d5ce4c31
ID
370 int ret = 0;
371 sector_t bs_mask;
372 struct bio *bio;
e73c23ff 373 struct blk_plug plug;
d5ce4c31 374 bool try_write_zeroes = !!bdev_write_zeroes_sectors(bdev);
d93ba7a5 375
d5ce4c31
ID
376 bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
377 if ((sector | nr_sects) & bs_mask)
378 return -EINVAL;
379
380retry:
381 bio = NULL;
e73c23ff 382 blk_start_plug(&plug);
d5ce4c31
ID
383 if (try_write_zeroes) {
384 ret = __blkdev_issue_write_zeroes(bdev, sector, nr_sects,
385 gfp_mask, &bio, flags);
386 } else if (!(flags & BLKDEV_ZERO_NOFALLBACK)) {
387 ret = __blkdev_issue_zero_pages(bdev, sector, nr_sects,
388 gfp_mask, &bio);
389 } else {
390 /* No zeroing offload support */
391 ret = -EOPNOTSUPP;
392 }
e73c23ff
CK
393 if (ret == 0 && bio) {
394 ret = submit_bio_wait(bio);
395 bio_put(bio);
396 }
397 blk_finish_plug(&plug);
d5ce4c31
ID
398 if (ret && try_write_zeroes) {
399 if (!(flags & BLKDEV_ZERO_NOFALLBACK)) {
400 try_write_zeroes = false;
401 goto retry;
402 }
403 if (!bdev_write_zeroes_sectors(bdev)) {
404 /*
405 * Zeroing offload support was indicated, but the
406 * device reported ILLEGAL REQUEST (for some devices
407 * there is no non-destructive way to verify whether
408 * WRITE ZEROES is actually supported).
409 */
410 ret = -EOPNOTSUPP;
411 }
412 }
579e8f3c 413
e73c23ff 414 return ret;
579e8f3c 415}
3f14d792 416EXPORT_SYMBOL(blkdev_issue_zeroout);