blk-lib.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. // SPDX-License-Identifier: GPL-2.0
  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. #include "blk.h"
  11. static sector_t bio_discard_limit(struct block_device *bdev, sector_t sector)
  12. {
  13. unsigned int discard_granularity = bdev_discard_granularity(bdev);
  14. sector_t granularity_aligned_sector;
  15. if (bdev_is_partition(bdev))
  16. sector += bdev->bd_start_sect;
  17. granularity_aligned_sector =
  18. round_up(sector, discard_granularity >> SECTOR_SHIFT);
  19. /*
  20. * Make sure subsequent bios start aligned to the discard granularity if
  21. * it needs to be split.
  22. */
  23. if (granularity_aligned_sector != sector)
  24. return granularity_aligned_sector - sector;
  25. /*
  26. * Align the bio size to the discard granularity to make splitting the bio
  27. * at discard granularity boundaries easier in the driver if needed.
  28. */
  29. return round_down(UINT_MAX, discard_granularity) >> SECTOR_SHIFT;
  30. }
  31. struct bio *blk_alloc_discard_bio(struct block_device *bdev,
  32. sector_t *sector, sector_t *nr_sects, gfp_t gfp_mask)
  33. {
  34. sector_t bio_sects = min(*nr_sects, bio_discard_limit(bdev, *sector));
  35. struct bio *bio;
  36. if (!bio_sects)
  37. return NULL;
  38. bio = bio_alloc(bdev, 0, REQ_OP_DISCARD, gfp_mask);
  39. if (!bio)
  40. return NULL;
  41. bio->bi_iter.bi_sector = *sector;
  42. bio->bi_iter.bi_size = bio_sects << SECTOR_SHIFT;
  43. *sector += bio_sects;
  44. *nr_sects -= bio_sects;
  45. /*
  46. * We can loop for a long time in here if someone does full device
  47. * discards (like mkfs). Be nice and allow us to schedule out to avoid
  48. * softlocking if preempt is disabled.
  49. */
  50. cond_resched();
  51. return bio;
  52. }
  53. int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
  54. sector_t nr_sects, gfp_t gfp_mask, struct bio **biop)
  55. {
  56. struct bio *bio;
  57. while ((bio = blk_alloc_discard_bio(bdev, &sector, &nr_sects,
  58. gfp_mask)))
  59. *biop = bio_chain_and_submit(*biop, bio);
  60. return 0;
  61. }
  62. EXPORT_SYMBOL(__blkdev_issue_discard);
  63. /**
  64. * blkdev_issue_discard - queue a discard
  65. * @bdev: blockdev to issue discard for
  66. * @sector: start sector
  67. * @nr_sects: number of sectors to discard
  68. * @gfp_mask: memory allocation flags (for bio_alloc)
  69. *
  70. * Description:
  71. * Issue a discard request for the sectors in question.
  72. */
  73. int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
  74. sector_t nr_sects, gfp_t gfp_mask)
  75. {
  76. struct bio *bio = NULL;
  77. struct blk_plug plug;
  78. int ret;
  79. blk_start_plug(&plug);
  80. ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, &bio);
  81. if (!ret && bio) {
  82. ret = submit_bio_wait(bio);
  83. if (ret == -EOPNOTSUPP)
  84. ret = 0;
  85. bio_put(bio);
  86. }
  87. blk_finish_plug(&plug);
  88. return ret;
  89. }
  90. EXPORT_SYMBOL(blkdev_issue_discard);
  91. static sector_t bio_write_zeroes_limit(struct block_device *bdev)
  92. {
  93. sector_t bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
  94. return min(bdev_write_zeroes_sectors(bdev),
  95. (UINT_MAX >> SECTOR_SHIFT) & ~bs_mask);
  96. }
  97. /*
  98. * There is no reliable way for the SCSI subsystem to determine whether a
  99. * device supports a WRITE SAME operation without actually performing a write
  100. * to media. As a result, write_zeroes is enabled by default and will be
  101. * disabled if a zeroing operation subsequently fails. This means that this
  102. * queue limit is likely to change at runtime.
  103. */
  104. static void __blkdev_issue_write_zeroes(struct block_device *bdev,
  105. sector_t sector, sector_t nr_sects, gfp_t gfp_mask,
  106. struct bio **biop, unsigned flags, sector_t limit)
  107. {
  108. while (nr_sects) {
  109. unsigned int len = min(nr_sects, limit);
  110. struct bio *bio;
  111. if ((flags & BLKDEV_ZERO_KILLABLE) &&
  112. fatal_signal_pending(current))
  113. break;
  114. bio = bio_alloc(bdev, 0, REQ_OP_WRITE_ZEROES, gfp_mask);
  115. bio->bi_iter.bi_sector = sector;
  116. if (flags & BLKDEV_ZERO_NOUNMAP)
  117. bio->bi_opf |= REQ_NOUNMAP;
  118. bio->bi_iter.bi_size = len << SECTOR_SHIFT;
  119. *biop = bio_chain_and_submit(*biop, bio);
  120. nr_sects -= len;
  121. sector += len;
  122. cond_resched();
  123. }
  124. }
  125. static int blkdev_issue_write_zeroes(struct block_device *bdev, sector_t sector,
  126. sector_t nr_sects, gfp_t gfp, unsigned flags)
  127. {
  128. sector_t limit = bio_write_zeroes_limit(bdev);
  129. struct bio *bio = NULL;
  130. struct blk_plug plug;
  131. int ret = 0;
  132. blk_start_plug(&plug);
  133. __blkdev_issue_write_zeroes(bdev, sector, nr_sects, gfp, &bio,
  134. flags, limit);
  135. if (bio) {
  136. if ((flags & BLKDEV_ZERO_KILLABLE) &&
  137. fatal_signal_pending(current)) {
  138. bio_await_chain(bio);
  139. blk_finish_plug(&plug);
  140. return -EINTR;
  141. }
  142. ret = submit_bio_wait(bio);
  143. bio_put(bio);
  144. }
  145. blk_finish_plug(&plug);
  146. /*
  147. * For some devices there is no non-destructive way to verify whether
  148. * WRITE ZEROES is actually supported. These will clear the capability
  149. * on an I/O error, in which case we'll turn any error into
  150. * "not supported" here.
  151. */
  152. if (ret && !bdev_write_zeroes_sectors(bdev))
  153. return -EOPNOTSUPP;
  154. return ret;
  155. }
  156. /*
  157. * Convert a number of 512B sectors to a number of pages.
  158. * The result is limited to a number of pages that can fit into a BIO.
  159. * Also make sure that the result is always at least 1 (page) for the cases
  160. * where nr_sects is lower than the number of sectors in a page.
  161. */
  162. static unsigned int __blkdev_sectors_to_bio_pages(sector_t nr_sects)
  163. {
  164. sector_t pages = DIV_ROUND_UP_SECTOR_T(nr_sects, PAGE_SIZE / 512);
  165. return min(pages, (sector_t)BIO_MAX_VECS);
  166. }
  167. static void __blkdev_issue_zero_pages(struct block_device *bdev,
  168. sector_t sector, sector_t nr_sects, gfp_t gfp_mask,
  169. struct bio **biop, unsigned int flags)
  170. {
  171. while (nr_sects) {
  172. unsigned int nr_vecs = __blkdev_sectors_to_bio_pages(nr_sects);
  173. struct bio *bio;
  174. bio = bio_alloc(bdev, nr_vecs, REQ_OP_WRITE, gfp_mask);
  175. bio->bi_iter.bi_sector = sector;
  176. if ((flags & BLKDEV_ZERO_KILLABLE) &&
  177. fatal_signal_pending(current))
  178. break;
  179. do {
  180. unsigned int len, added;
  181. len = min_t(sector_t,
  182. PAGE_SIZE, nr_sects << SECTOR_SHIFT);
  183. added = bio_add_page(bio, ZERO_PAGE(0), len, 0);
  184. if (added < len)
  185. break;
  186. nr_sects -= added >> SECTOR_SHIFT;
  187. sector += added >> SECTOR_SHIFT;
  188. } while (nr_sects);
  189. *biop = bio_chain_and_submit(*biop, bio);
  190. cond_resched();
  191. }
  192. }
  193. static int blkdev_issue_zero_pages(struct block_device *bdev, sector_t sector,
  194. sector_t nr_sects, gfp_t gfp, unsigned flags)
  195. {
  196. struct bio *bio = NULL;
  197. struct blk_plug plug;
  198. int ret = 0;
  199. if (flags & BLKDEV_ZERO_NOFALLBACK)
  200. return -EOPNOTSUPP;
  201. blk_start_plug(&plug);
  202. __blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp, &bio, flags);
  203. if (bio) {
  204. if ((flags & BLKDEV_ZERO_KILLABLE) &&
  205. fatal_signal_pending(current)) {
  206. bio_await_chain(bio);
  207. blk_finish_plug(&plug);
  208. return -EINTR;
  209. }
  210. ret = submit_bio_wait(bio);
  211. bio_put(bio);
  212. }
  213. blk_finish_plug(&plug);
  214. return ret;
  215. }
  216. /**
  217. * __blkdev_issue_zeroout - generate number of zero filed write bios
  218. * @bdev: blockdev to issue
  219. * @sector: start sector
  220. * @nr_sects: number of sectors to write
  221. * @gfp_mask: memory allocation flags (for bio_alloc)
  222. * @biop: pointer to anchor bio
  223. * @flags: controls detailed behavior
  224. *
  225. * Description:
  226. * Zero-fill a block range, either using hardware offload or by explicitly
  227. * writing zeroes to the device.
  228. *
  229. * If a device is using logical block provisioning, the underlying space will
  230. * not be released if %flags contains BLKDEV_ZERO_NOUNMAP.
  231. *
  232. * If %flags contains BLKDEV_ZERO_NOFALLBACK, the function will return
  233. * -EOPNOTSUPP if no explicit hardware offload for zeroing is provided.
  234. */
  235. int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
  236. sector_t nr_sects, gfp_t gfp_mask, struct bio **biop,
  237. unsigned flags)
  238. {
  239. sector_t limit = bio_write_zeroes_limit(bdev);
  240. if (bdev_read_only(bdev))
  241. return -EPERM;
  242. if (limit) {
  243. __blkdev_issue_write_zeroes(bdev, sector, nr_sects,
  244. gfp_mask, biop, flags, limit);
  245. } else {
  246. if (flags & BLKDEV_ZERO_NOFALLBACK)
  247. return -EOPNOTSUPP;
  248. __blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp_mask,
  249. biop, flags);
  250. }
  251. return 0;
  252. }
  253. EXPORT_SYMBOL(__blkdev_issue_zeroout);
  254. /**
  255. * blkdev_issue_zeroout - zero-fill a block range
  256. * @bdev: blockdev to write
  257. * @sector: start sector
  258. * @nr_sects: number of sectors to write
  259. * @gfp_mask: memory allocation flags (for bio_alloc)
  260. * @flags: controls detailed behavior
  261. *
  262. * Description:
  263. * Zero-fill a block range, either using hardware offload or by explicitly
  264. * writing zeroes to the device. See __blkdev_issue_zeroout() for the
  265. * valid values for %flags.
  266. */
  267. int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
  268. sector_t nr_sects, gfp_t gfp_mask, unsigned flags)
  269. {
  270. int ret;
  271. if ((sector | nr_sects) & ((bdev_logical_block_size(bdev) >> 9) - 1))
  272. return -EINVAL;
  273. if (bdev_read_only(bdev))
  274. return -EPERM;
  275. if (bdev_write_zeroes_sectors(bdev)) {
  276. ret = blkdev_issue_write_zeroes(bdev, sector, nr_sects,
  277. gfp_mask, flags);
  278. if (ret != -EOPNOTSUPP)
  279. return ret;
  280. }
  281. return blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp_mask, flags);
  282. }
  283. EXPORT_SYMBOL(blkdev_issue_zeroout);
  284. int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector,
  285. sector_t nr_sects, gfp_t gfp)
  286. {
  287. sector_t bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
  288. unsigned int max_sectors = bdev_max_secure_erase_sectors(bdev);
  289. struct bio *bio = NULL;
  290. struct blk_plug plug;
  291. int ret = 0;
  292. /* make sure that "len << SECTOR_SHIFT" doesn't overflow */
  293. if (max_sectors > UINT_MAX >> SECTOR_SHIFT)
  294. max_sectors = UINT_MAX >> SECTOR_SHIFT;
  295. max_sectors &= ~bs_mask;
  296. if (max_sectors == 0)
  297. return -EOPNOTSUPP;
  298. if ((sector | nr_sects) & bs_mask)
  299. return -EINVAL;
  300. if (bdev_read_only(bdev))
  301. return -EPERM;
  302. blk_start_plug(&plug);
  303. while (nr_sects) {
  304. unsigned int len = min_t(sector_t, nr_sects, max_sectors);
  305. bio = blk_next_bio(bio, bdev, 0, REQ_OP_SECURE_ERASE, gfp);
  306. bio->bi_iter.bi_sector = sector;
  307. bio->bi_iter.bi_size = len << SECTOR_SHIFT;
  308. sector += len;
  309. nr_sects -= len;
  310. cond_resched();
  311. }
  312. if (bio) {
  313. ret = submit_bio_wait(bio);
  314. bio_put(bio);
  315. }
  316. blk_finish_plug(&plug);
  317. return ret;
  318. }
  319. EXPORT_SYMBOL(blkdev_issue_secure_erase);