bio.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2010 Red Hat, Inc.
  4. * Copyright (C) 2016-2023 Christoph Hellwig.
  5. */
  6. #include <linux/iomap.h>
  7. #include <linux/pagemap.h>
  8. #include "internal.h"
  9. #include "trace.h"
  10. static DEFINE_SPINLOCK(failed_read_lock);
  11. static struct bio_list failed_read_list = BIO_EMPTY_LIST;
  12. static void __iomap_read_end_io(struct bio *bio)
  13. {
  14. int error = blk_status_to_errno(bio->bi_status);
  15. struct folio_iter fi;
  16. bio_for_each_folio_all(fi, bio)
  17. iomap_finish_folio_read(fi.folio, fi.offset, fi.length, error);
  18. bio_put(bio);
  19. }
  20. static void
  21. iomap_fail_reads(
  22. struct work_struct *work)
  23. {
  24. struct bio *bio;
  25. struct bio_list tmp = BIO_EMPTY_LIST;
  26. unsigned long flags;
  27. spin_lock_irqsave(&failed_read_lock, flags);
  28. bio_list_merge_init(&tmp, &failed_read_list);
  29. spin_unlock_irqrestore(&failed_read_lock, flags);
  30. while ((bio = bio_list_pop(&tmp)) != NULL) {
  31. __iomap_read_end_io(bio);
  32. cond_resched();
  33. }
  34. }
  35. static DECLARE_WORK(failed_read_work, iomap_fail_reads);
  36. static void iomap_fail_buffered_read(struct bio *bio)
  37. {
  38. unsigned long flags;
  39. /*
  40. * Bounce I/O errors to a workqueue to avoid nested i_lock acquisitions
  41. * in the fserror code. The caller no longer owns the bio reference
  42. * after the spinlock drops.
  43. */
  44. spin_lock_irqsave(&failed_read_lock, flags);
  45. if (bio_list_empty(&failed_read_list))
  46. WARN_ON_ONCE(!schedule_work(&failed_read_work));
  47. bio_list_add(&failed_read_list, bio);
  48. spin_unlock_irqrestore(&failed_read_lock, flags);
  49. }
  50. static void iomap_read_end_io(struct bio *bio)
  51. {
  52. if (bio->bi_status) {
  53. iomap_fail_buffered_read(bio);
  54. return;
  55. }
  56. __iomap_read_end_io(bio);
  57. }
  58. static void iomap_bio_submit_read(struct iomap_read_folio_ctx *ctx)
  59. {
  60. struct bio *bio = ctx->read_ctx;
  61. if (bio)
  62. submit_bio(bio);
  63. }
  64. static int iomap_bio_read_folio_range(const struct iomap_iter *iter,
  65. struct iomap_read_folio_ctx *ctx, size_t plen)
  66. {
  67. struct folio *folio = ctx->cur_folio;
  68. const struct iomap *iomap = &iter->iomap;
  69. loff_t pos = iter->pos;
  70. size_t poff = offset_in_folio(folio, pos);
  71. loff_t length = iomap_length(iter);
  72. sector_t sector;
  73. struct bio *bio = ctx->read_ctx;
  74. sector = iomap_sector(iomap, pos);
  75. if (!bio || bio_end_sector(bio) != sector ||
  76. !bio_add_folio(bio, folio, plen, poff)) {
  77. gfp_t gfp = mapping_gfp_constraint(folio->mapping, GFP_KERNEL);
  78. gfp_t orig_gfp = gfp;
  79. unsigned int nr_vecs = DIV_ROUND_UP(length, PAGE_SIZE);
  80. if (bio)
  81. submit_bio(bio);
  82. if (ctx->rac) /* same as readahead_gfp_mask */
  83. gfp |= __GFP_NORETRY | __GFP_NOWARN;
  84. bio = bio_alloc(iomap->bdev, bio_max_segs(nr_vecs), REQ_OP_READ,
  85. gfp);
  86. /*
  87. * If the bio_alloc fails, try it again for a single page to
  88. * avoid having to deal with partial page reads. This emulates
  89. * what do_mpage_read_folio does.
  90. */
  91. if (!bio)
  92. bio = bio_alloc(iomap->bdev, 1, REQ_OP_READ, orig_gfp);
  93. if (ctx->rac)
  94. bio->bi_opf |= REQ_RAHEAD;
  95. bio->bi_iter.bi_sector = sector;
  96. bio->bi_end_io = iomap_read_end_io;
  97. bio_add_folio_nofail(bio, folio, plen, poff);
  98. ctx->read_ctx = bio;
  99. }
  100. return 0;
  101. }
  102. const struct iomap_read_ops iomap_bio_read_ops = {
  103. .read_folio_range = iomap_bio_read_folio_range,
  104. .submit_read = iomap_bio_submit_read,
  105. };
  106. EXPORT_SYMBOL_GPL(iomap_bio_read_ops);
  107. int iomap_bio_read_folio_range_sync(const struct iomap_iter *iter,
  108. struct folio *folio, loff_t pos, size_t len)
  109. {
  110. const struct iomap *srcmap = iomap_iter_srcmap(iter);
  111. struct bio_vec bvec;
  112. struct bio bio;
  113. bio_init(&bio, srcmap->bdev, &bvec, 1, REQ_OP_READ);
  114. bio.bi_iter.bi_sector = iomap_sector(srcmap, pos);
  115. bio_add_folio_nofail(&bio, folio, len, offset_in_folio(folio, pos));
  116. return submit_bio_wait(&bio);
  117. }