diff options
Diffstat (limited to 'include/linux/bio.h')
| -rw-r--r-- | include/linux/bio.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index b900d2c67d29..7b214fd672a2 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
| @@ -132,6 +132,7 @@ struct bio { | |||
| 132 | * top 4 bits of bio flags indicate the pool this bio came from | 132 | * top 4 bits of bio flags indicate the pool this bio came from |
| 133 | */ | 133 | */ |
| 134 | #define BIO_POOL_BITS (4) | 134 | #define BIO_POOL_BITS (4) |
| 135 | #define BIO_POOL_NONE ((1UL << BIO_POOL_BITS) - 1) | ||
| 135 | #define BIO_POOL_OFFSET (BITS_PER_LONG - BIO_POOL_BITS) | 136 | #define BIO_POOL_OFFSET (BITS_PER_LONG - BIO_POOL_BITS) |
| 136 | #define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET) | 137 | #define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET) |
| 137 | #define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) | 138 | #define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) |
| @@ -504,6 +505,115 @@ static inline int bio_has_data(struct bio *bio) | |||
| 504 | return bio && bio->bi_io_vec != NULL; | 505 | return bio && bio->bi_io_vec != NULL; |
| 505 | } | 506 | } |
| 506 | 507 | ||
| 508 | /* | ||
| 509 | * BIO list managment for use by remapping drivers (e.g. DM or MD). | ||
| 510 | * | ||
| 511 | * A bio_list anchors a singly-linked list of bios chained through the bi_next | ||
| 512 | * member of the bio. The bio_list also caches the last list member to allow | ||
| 513 | * fast access to the tail. | ||
| 514 | */ | ||
| 515 | struct bio_list { | ||
| 516 | struct bio *head; | ||
| 517 | struct bio *tail; | ||
| 518 | }; | ||
| 519 | |||
| 520 | static inline int bio_list_empty(const struct bio_list *bl) | ||
| 521 | { | ||
| 522 | return bl->head == NULL; | ||
| 523 | } | ||
| 524 | |||
| 525 | static inline void bio_list_init(struct bio_list *bl) | ||
| 526 | { | ||
| 527 | bl->head = bl->tail = NULL; | ||
| 528 | } | ||
| 529 | |||
| 530 | #define bio_list_for_each(bio, bl) \ | ||
| 531 | for (bio = (bl)->head; bio; bio = bio->bi_next) | ||
| 532 | |||
| 533 | static inline unsigned bio_list_size(const struct bio_list *bl) | ||
| 534 | { | ||
| 535 | unsigned sz = 0; | ||
| 536 | struct bio *bio; | ||
| 537 | |||
| 538 | bio_list_for_each(bio, bl) | ||
| 539 | sz++; | ||
| 540 | |||
| 541 | return sz; | ||
| 542 | } | ||
| 543 | |||
| 544 | static inline void bio_list_add(struct bio_list *bl, struct bio *bio) | ||
| 545 | { | ||
| 546 | bio->bi_next = NULL; | ||
| 547 | |||
| 548 | if (bl->tail) | ||
| 549 | bl->tail->bi_next = bio; | ||
| 550 | else | ||
| 551 | bl->head = bio; | ||
| 552 | |||
| 553 | bl->tail = bio; | ||
| 554 | } | ||
| 555 | |||
| 556 | static inline void bio_list_add_head(struct bio_list *bl, struct bio *bio) | ||
| 557 | { | ||
| 558 | bio->bi_next = bl->head; | ||
| 559 | |||
| 560 | bl->head = bio; | ||
| 561 | |||
| 562 | if (!bl->tail) | ||
| 563 | bl->tail = bio; | ||
| 564 | } | ||
| 565 | |||
| 566 | static inline void bio_list_merge(struct bio_list *bl, struct bio_list *bl2) | ||
| 567 | { | ||
| 568 | if (!bl2->head) | ||
| 569 | return; | ||
| 570 | |||
| 571 | if (bl->tail) | ||
| 572 | bl->tail->bi_next = bl2->head; | ||
| 573 | else | ||
| 574 | bl->head = bl2->head; | ||
| 575 | |||
| 576 | bl->tail = bl2->tail; | ||
| 577 | } | ||
| 578 | |||
| 579 | static inline void bio_list_merge_head(struct bio_list *bl, | ||
| 580 | struct bio_list *bl2) | ||
| 581 | { | ||
| 582 | if (!bl2->head) | ||
| 583 | return; | ||
| 584 | |||
| 585 | if (bl->head) | ||
| 586 | bl2->tail->bi_next = bl->head; | ||
| 587 | else | ||
| 588 | bl->tail = bl2->tail; | ||
| 589 | |||
| 590 | bl->head = bl2->head; | ||
| 591 | } | ||
| 592 | |||
| 593 | static inline struct bio *bio_list_pop(struct bio_list *bl) | ||
| 594 | { | ||
| 595 | struct bio *bio = bl->head; | ||
| 596 | |||
| 597 | if (bio) { | ||
| 598 | bl->head = bl->head->bi_next; | ||
| 599 | if (!bl->head) | ||
| 600 | bl->tail = NULL; | ||
| 601 | |||
| 602 | bio->bi_next = NULL; | ||
| 603 | } | ||
| 604 | |||
| 605 | return bio; | ||
| 606 | } | ||
| 607 | |||
| 608 | static inline struct bio *bio_list_get(struct bio_list *bl) | ||
| 609 | { | ||
| 610 | struct bio *bio = bl->head; | ||
| 611 | |||
| 612 | bl->head = bl->tail = NULL; | ||
| 613 | |||
| 614 | return bio; | ||
| 615 | } | ||
| 616 | |||
| 507 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | 617 | #if defined(CONFIG_BLK_DEV_INTEGRITY) |
| 508 | 618 | ||
| 509 | #define bip_vec_idx(bip, idx) (&(bip->bip_vec[(idx)])) | 619 | #define bip_vec_idx(bip, idx) (&(bip->bip_vec[(idx)])) |
