Merge branch 'for-4.8/core' of git://git.kernel.dk/linux-block
[linux-2.6-block.git] / block / blk-lib.c
1 /*
2  * Functions related to generic helpers functions
3  */
4 #include <linux/kernel.h>
5 #include <linux/module.h>
6 #include <linux/bio.h>
7 #include <linux/blkdev.h>
8 #include <linux/scatterlist.h>
9
10 #include "blk.h"
11
12 static struct bio *next_bio(struct bio *bio, unsigned int nr_pages,
13                 gfp_t gfp)
14 {
15         struct bio *new = bio_alloc(gfp, nr_pages);
16
17         if (bio) {
18                 bio_chain(bio, new);
19                 submit_bio(bio);
20         }
21
22         return new;
23 }
24
25 int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
26                 sector_t nr_sects, gfp_t gfp_mask, int op_flags,
27                 struct bio **biop)
28 {
29         struct request_queue *q = bdev_get_queue(bdev);
30         struct bio *bio = *biop;
31         unsigned int granularity;
32         int alignment;
33
34         if (!q)
35                 return -ENXIO;
36         if (!blk_queue_discard(q))
37                 return -EOPNOTSUPP;
38         if ((op_flags & REQ_SECURE) && !blk_queue_secdiscard(q))
39                 return -EOPNOTSUPP;
40
41         /* Zero-sector (unknown) and one-sector granularities are the same.  */
42         granularity = max(q->limits.discard_granularity >> 9, 1U);
43         alignment = (bdev_discard_alignment(bdev) >> 9) % granularity;
44
45         while (nr_sects) {
46                 unsigned int req_sects;
47                 sector_t end_sect, tmp;
48
49                 /* Make sure bi_size doesn't overflow */
50                 req_sects = min_t(sector_t, nr_sects, UINT_MAX >> 9);
51
52                 /**
53                  * If splitting a request, and the next starting sector would be
54                  * misaligned, stop the discard at the previous aligned sector.
55                  */
56                 end_sect = sector + req_sects;
57                 tmp = end_sect;
58                 if (req_sects < nr_sects &&
59                     sector_div(tmp, granularity) != alignment) {
60                         end_sect = end_sect - alignment;
61                         sector_div(end_sect, granularity);
62                         end_sect = end_sect * granularity + alignment;
63                         req_sects = end_sect - sector;
64                 }
65
66                 bio = next_bio(bio, 1, gfp_mask);
67                 bio->bi_iter.bi_sector = sector;
68                 bio->bi_bdev = bdev;
69                 bio_set_op_attrs(bio, REQ_OP_DISCARD, op_flags);
70
71                 bio->bi_iter.bi_size = req_sects << 9;
72                 nr_sects -= req_sects;
73                 sector = end_sect;
74
75                 /*
76                  * We can loop for a long time in here, if someone does
77                  * full device discards (like mkfs). Be nice and allow
78                  * us to schedule out to avoid softlocking if preempt
79                  * is disabled.
80                  */
81                 cond_resched();
82         }
83
84         *biop = bio;
85         return 0;
86 }
87 EXPORT_SYMBOL(__blkdev_issue_discard);
88
89 /**
90  * blkdev_issue_discard - queue a discard
91  * @bdev:       blockdev to issue discard for
92  * @sector:     start sector
93  * @nr_sects:   number of sectors to discard
94  * @gfp_mask:   memory allocation flags (for bio_alloc)
95  * @flags:      BLKDEV_IFL_* flags to control behaviour
96  *
97  * Description:
98  *    Issue a discard request for the sectors in question.
99  */
100 int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
101                 sector_t nr_sects, gfp_t gfp_mask, unsigned long flags)
102 {
103         int op_flags = 0;
104         struct bio *bio = NULL;
105         struct blk_plug plug;
106         int ret;
107
108         if (flags & BLKDEV_DISCARD_SECURE)
109                 op_flags |= REQ_SECURE;
110
111         blk_start_plug(&plug);
112         ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, op_flags,
113                         &bio);
114         if (!ret && bio) {
115                 ret = submit_bio_wait(bio);
116                 if (ret == -EOPNOTSUPP)
117                         ret = 0;
118                 bio_put(bio);
119         }
120         blk_finish_plug(&plug);
121
122         return ret;
123 }
124 EXPORT_SYMBOL(blkdev_issue_discard);
125
126 /**
127  * blkdev_issue_write_same - queue a write same operation
128  * @bdev:       target blockdev
129  * @sector:     start sector
130  * @nr_sects:   number of sectors to write
131  * @gfp_mask:   memory allocation flags (for bio_alloc)
132  * @page:       page containing data to write
133  *
134  * Description:
135  *    Issue a write same request for the sectors in question.
136  */
137 int blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
138                             sector_t nr_sects, gfp_t gfp_mask,
139                             struct page *page)
140 {
141         struct request_queue *q = bdev_get_queue(bdev);
142         unsigned int max_write_same_sectors;
143         struct bio *bio = NULL;
144         int ret = 0;
145
146         if (!q)
147                 return -ENXIO;
148
149         /* Ensure that max_write_same_sectors doesn't overflow bi_size */
150         max_write_same_sectors = UINT_MAX >> 9;
151
152         while (nr_sects) {
153                 bio = next_bio(bio, 1, gfp_mask);
154                 bio->bi_iter.bi_sector = sector;
155                 bio->bi_bdev = bdev;
156                 bio->bi_vcnt = 1;
157                 bio->bi_io_vec->bv_page = page;
158                 bio->bi_io_vec->bv_offset = 0;
159                 bio->bi_io_vec->bv_len = bdev_logical_block_size(bdev);
160                 bio_set_op_attrs(bio, REQ_OP_WRITE_SAME, 0);
161
162                 if (nr_sects > max_write_same_sectors) {
163                         bio->bi_iter.bi_size = max_write_same_sectors << 9;
164                         nr_sects -= max_write_same_sectors;
165                         sector += max_write_same_sectors;
166                 } else {
167                         bio->bi_iter.bi_size = nr_sects << 9;
168                         nr_sects = 0;
169                 }
170         }
171
172         if (bio) {
173                 ret = submit_bio_wait(bio);
174                 bio_put(bio);
175         }
176         return ret != -EOPNOTSUPP ? ret : 0;
177 }
178 EXPORT_SYMBOL(blkdev_issue_write_same);
179
180 /**
181  * blkdev_issue_zeroout - generate number of zero filed write bios
182  * @bdev:       blockdev to issue
183  * @sector:     start sector
184  * @nr_sects:   number of sectors to write
185  * @gfp_mask:   memory allocation flags (for bio_alloc)
186  *
187  * Description:
188  *  Generate and issue number of bios with zerofiled pages.
189  */
190
191 static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
192                                   sector_t nr_sects, gfp_t gfp_mask)
193 {
194         int ret;
195         struct bio *bio = NULL;
196         unsigned int sz;
197
198         while (nr_sects != 0) {
199                 bio = next_bio(bio, min(nr_sects, (sector_t)BIO_MAX_PAGES),
200                                 gfp_mask);
201                 bio->bi_iter.bi_sector = sector;
202                 bio->bi_bdev   = bdev;
203                 bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
204
205                 while (nr_sects != 0) {
206                         sz = min((sector_t) PAGE_SIZE >> 9 , nr_sects);
207                         ret = bio_add_page(bio, ZERO_PAGE(0), sz << 9, 0);
208                         nr_sects -= ret >> 9;
209                         sector += ret >> 9;
210                         if (ret < (sz << 9))
211                                 break;
212                 }
213         }
214
215         if (bio) {
216                 ret = submit_bio_wait(bio);
217                 bio_put(bio);
218                 return ret;
219         }
220         return 0;
221 }
222
223 /**
224  * blkdev_issue_zeroout - zero-fill a block range
225  * @bdev:       blockdev to write
226  * @sector:     start sector
227  * @nr_sects:   number of sectors to write
228  * @gfp_mask:   memory allocation flags (for bio_alloc)
229  * @discard:    whether to discard the block range
230  *
231  * Description:
232  *  Zero-fill a block range.  If the discard flag is set and the block
233  *  device guarantees that subsequent READ operations to the block range
234  *  in question will return zeroes, the blocks will be discarded. Should
235  *  the discard request fail, if the discard flag is not set, or if
236  *  discard_zeroes_data is not supported, this function will resort to
237  *  zeroing the blocks manually, thus provisioning (allocating,
238  *  anchoring) them. If the block device supports the WRITE SAME command
239  *  blkdev_issue_zeroout() will use it to optimize the process of
240  *  clearing the block range. Otherwise the zeroing will be performed
241  *  using regular WRITE calls.
242  */
243
244 int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
245                          sector_t nr_sects, gfp_t gfp_mask, bool discard)
246 {
247         struct request_queue *q = bdev_get_queue(bdev);
248
249         if (discard && blk_queue_discard(q) && q->limits.discard_zeroes_data &&
250             blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, 0) == 0)
251                 return 0;
252
253         if (bdev_write_same(bdev) &&
254             blkdev_issue_write_same(bdev, sector, nr_sects, gfp_mask,
255                                     ZERO_PAGE(0)) == 0)
256                 return 0;
257
258         return __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask);
259 }
260 EXPORT_SYMBOL(blkdev_issue_zeroout);