raid1-10.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* Maximum size of each resync request */
  2. #define RESYNC_BLOCK_SIZE (64*1024)
  3. #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
  4. /* for managing resync I/O pages */
  5. struct resync_pages {
  6. void *raid_bio;
  7. struct page *pages[RESYNC_PAGES];
  8. };
  9. static inline int resync_alloc_pages(struct resync_pages *rp,
  10. gfp_t gfp_flags)
  11. {
  12. int i;
  13. for (i = 0; i < RESYNC_PAGES; i++) {
  14. rp->pages[i] = alloc_page(gfp_flags);
  15. if (!rp->pages[i])
  16. goto out_free;
  17. }
  18. return 0;
  19. out_free:
  20. while (--i >= 0)
  21. put_page(rp->pages[i]);
  22. return -ENOMEM;
  23. }
  24. static inline void resync_free_pages(struct resync_pages *rp)
  25. {
  26. int i;
  27. for (i = 0; i < RESYNC_PAGES; i++)
  28. put_page(rp->pages[i]);
  29. }
  30. static inline void resync_get_all_pages(struct resync_pages *rp)
  31. {
  32. int i;
  33. for (i = 0; i < RESYNC_PAGES; i++)
  34. get_page(rp->pages[i]);
  35. }
  36. static inline struct page *resync_fetch_page(struct resync_pages *rp,
  37. unsigned idx)
  38. {
  39. if (WARN_ON_ONCE(idx >= RESYNC_PAGES))
  40. return NULL;
  41. return rp->pages[idx];
  42. }
  43. /*
  44. * 'strct resync_pages' stores actual pages used for doing the resync
  45. * IO, and it is per-bio, so make .bi_private points to it.
  46. */
  47. static inline struct resync_pages *get_resync_pages(struct bio *bio)
  48. {
  49. return bio->bi_private;
  50. }
  51. /* generally called after bio_reset() for reseting bvec */
  52. static void md_bio_reset_resync_pages(struct bio *bio, struct resync_pages *rp,
  53. int size)
  54. {
  55. int idx = 0;
  56. /* initialize bvec table again */
  57. do {
  58. struct page *page = resync_fetch_page(rp, idx);
  59. int len = min_t(int, size, PAGE_SIZE);
  60. /*
  61. * won't fail because the vec table is big
  62. * enough to hold all these pages
  63. */
  64. bio_add_page(bio, page, len, 0);
  65. size -= len;
  66. } while (idx++ < RESYNC_PAGES && size > 0);
  67. }