|
23 | 23 | #include <linux/kernel.h>
|
24 | 24 | #include <linux/bug.h>
|
25 | 25 | #include <linux/errno.h>
|
| 26 | +#include <linux/mm.h> |
26 | 27 |
|
27 | 28 | /*
|
28 | 29 | * was unsigned short, but we might as well be ready for > 64kB I/O pages
|
@@ -50,16 +51,39 @@ struct bvec_iter {
|
50 | 51 | */
|
51 | 52 | #define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx])
|
52 | 53 |
|
53 |
| -#define bvec_iter_page(bvec, iter) \ |
| 54 | +/* multi-page (mp_bvec) helpers */ |
| 55 | +#define mp_bvec_iter_page(bvec, iter) \ |
54 | 56 | (__bvec_iter_bvec((bvec), (iter))->bv_page)
|
55 | 57 |
|
56 |
| -#define bvec_iter_len(bvec, iter) \ |
| 58 | +#define mp_bvec_iter_len(bvec, iter) \ |
57 | 59 | min((iter).bi_size, \
|
58 | 60 | __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done)
|
59 | 61 |
|
60 |
| -#define bvec_iter_offset(bvec, iter) \ |
| 62 | +#define mp_bvec_iter_offset(bvec, iter) \ |
61 | 63 | (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done)
|
62 | 64 |
|
| 65 | +#define mp_bvec_iter_page_idx(bvec, iter) \ |
| 66 | + (mp_bvec_iter_offset((bvec), (iter)) / PAGE_SIZE) |
| 67 | + |
| 68 | +#define mp_bvec_iter_bvec(bvec, iter) \ |
| 69 | +((struct bio_vec) { \ |
| 70 | + .bv_page = mp_bvec_iter_page((bvec), (iter)), \ |
| 71 | + .bv_len = mp_bvec_iter_len((bvec), (iter)), \ |
| 72 | + .bv_offset = mp_bvec_iter_offset((bvec), (iter)), \ |
| 73 | +}) |
| 74 | + |
| 75 | +/* For building single-page bvec in flight */ |
| 76 | + #define bvec_iter_offset(bvec, iter) \ |
| 77 | + (mp_bvec_iter_offset((bvec), (iter)) % PAGE_SIZE) |
| 78 | + |
| 79 | +#define bvec_iter_len(bvec, iter) \ |
| 80 | + min_t(unsigned, mp_bvec_iter_len((bvec), (iter)), \ |
| 81 | + PAGE_SIZE - bvec_iter_offset((bvec), (iter))) |
| 82 | + |
| 83 | +#define bvec_iter_page(bvec, iter) \ |
| 84 | + nth_page(mp_bvec_iter_page((bvec), (iter)), \ |
| 85 | + mp_bvec_iter_page_idx((bvec), (iter))) |
| 86 | + |
63 | 87 | #define bvec_iter_bvec(bvec, iter) \
|
64 | 88 | ((struct bio_vec) { \
|
65 | 89 | .bv_page = bvec_iter_page((bvec), (iter)), \
|
|
0 commit comments