111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/**************************************************************************** 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert **************************************************************************** 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** This header was automatically generated from a Linux kernel header 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** of the same name, to make information necessary for userspace to 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** call into the kernel available to libc. It contains only constants, 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** structures, and macros generated from the original header, and thus, 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** contains no copyrightable information. 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert **************************************************************************** 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/ 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef __LINUX_BIO_H 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __LINUX_BIO_H 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/highmem.h> 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/mempool.h> 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/ioprio.h> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/io.h> 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(BIO_VMERGE_MAX_SIZE) && defined(BIO_VMERGE_BOUNDARY) 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_VIRT_START_SIZE(x) (bvec_to_phys(x) & (BIO_VMERGE_BOUNDARY - 1)) 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_VIRT_OVERSIZE(x) ((x) > BIO_VMERGE_MAX_SIZE) 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_VIRT_START_SIZE(x) 0 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_VIRT_OVERSIZE(x) 0 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef BIO_VMERGE_BOUNDARY 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_VMERGE_BOUNDARY 0 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_DEBUG 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef BIO_DEBUG 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_BUG_ON BUG_ON 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_BUG_ON 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_MAX_PAGES 256 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_MAX_SIZE (BIO_MAX_PAGES << PAGE_CACHE_SHIFT) 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_MAX_SECTORS (BIO_MAX_SIZE >> 9) 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bio_vec { 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct page *bv_page; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int bv_len; 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int bv_offset; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bio_set; 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bio; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int (bio_end_io_t) (struct bio *, unsigned int, int); 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void (bio_destructor_t) (struct bio *); 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bio { 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t bi_sector; 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bio *bi_next; 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct block_device *bi_bdev; 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long bi_flags; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long bi_rw; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short bi_vcnt; 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short bi_idx; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short bi_phys_segments; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned short bi_hw_segments; 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int bi_size; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int bi_hw_front_size; 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int bi_hw_back_size; 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int bi_max_vecs; 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bio_vec *bi_io_vec; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bio_end_io_t *bi_end_io; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t bi_cnt; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *bi_private; 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bio_destructor_t *bi_destructor; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_UPTODATE 0 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_RW_BLOCK 1 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_EOF 2 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_SEG_VALID 3 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_CLONED 4 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_BOUNCED 5 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_USER_MAPPED 6 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_EOPNOTSUPP 7 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_POOL_BITS (4) 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_POOL_OFFSET (BITS_PER_LONG - BIO_POOL_BITS) 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET) 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET) 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_RW 0 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_RW_AHEAD 1 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_RW_BARRIER 2 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_RW_FAILFAST 3 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_RW_SYNC 4 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_PRIO_SHIFT (8 * sizeof(unsigned long) - IOPRIO_BITS) 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_prio(bio) ((bio)->bi_rw >> BIO_PRIO_SHIFT) 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_prio_valid(bio) ioprio_valid(bio_prio(bio)) 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_set_prio(bio, prio) do { WARN_ON(prio >= (1 << IOPRIO_BITS)); (bio)->bi_rw &= ((1UL << BIO_PRIO_SHIFT) - 1); (bio)->bi_rw |= ((unsigned long) (prio) << BIO_PRIO_SHIFT); } while (0) 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_iovec_idx(bio, idx) (&((bio)->bi_io_vec[(idx)])) 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_iovec(bio) bio_iovec_idx((bio), (bio)->bi_idx) 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_page(bio) bio_iovec((bio))->bv_page 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_offset(bio) bio_iovec((bio))->bv_offset 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx) 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_sectors(bio) ((bio)->bi_size >> 9) 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_cur_sectors(bio) (bio_iovec(bio)->bv_len >> 9) 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_data(bio) (page_address(bio_page((bio))) + bio_offset((bio))) 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER)) 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC)) 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_failfast(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST)) 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD)) 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_to_phys(bio) (page_to_phys(bio_page((bio))) + (unsigned long) bio_offset((bio))) 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bvec_to_phys(bv) (page_to_phys((bv)->bv_page) + (unsigned long) (bv)->bv_offset) 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bio_kmap_atomic(bio, idx, kmtype) (kmap_atomic(bio_iovec_idx((bio), (idx))->bv_page, kmtype) + bio_iovec_idx((bio), (idx))->bv_offset) 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bio_kunmap_atomic(addr, kmtype) kunmap_atomic(addr, kmtype) 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __BVEC_END(bio) bio_iovec_idx((bio), (bio)->bi_vcnt - 1) 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __BVEC_START(bio) bio_iovec_idx((bio), (bio)->bi_idx) 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef BIOVEC_PHYS_MERGEABLE 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) ((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2))) 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_VIRT_MERGEABLE(vec1, vec2) ((((bvec_to_phys((vec1)) + (vec1)->bv_len) | bvec_to_phys((vec2))) & (BIO_VMERGE_BOUNDARY - 1)) == 0) 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __BIO_SEG_BOUNDARY(addr1, addr2, mask) (((addr1) | (mask)) == (((addr2) - 1) | (mask))) 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIOVEC_SEG_BOUNDARY(q, b1, b2) __BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, (q)->seg_boundary_mask) 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BIO_SEG_BOUNDARY(q, b1, b2) BIOVEC_SEG_BOUNDARY((q), __BVEC_END((b1)), __BVEC_START((b2))) 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_io_error(bio, bytes) bio_endio((bio), (bytes), -EIO) 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bio_for_each_segment(bvl, bio, i, start_idx) for (bvl = bio_iovec_idx((bio), (start_idx)), i = (start_idx); i < (bio)->bi_vcnt; bvl++, i++) 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_for_each_segment(bvl, bio, i) __bio_for_each_segment(bvl, bio, i, (bio)->bi_idx) 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_get(bio) atomic_inc(&(bio)->bi_cnt) 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bio_pair { 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bio bio1, bio2; 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bio_vec bv1, bv2; 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t cnt; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int error; 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct request_queue; 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct sg_iovec; 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bvec_kmap_irq(bvec, flags) (page_address((bvec)->bv_page) + (bvec)->bv_offset) 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bvec_kunmap_irq(buf, flags) do { *(flags) = 0; } while (0) 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __bio_kunmap_irq(buf, flags) bvec_kunmap_irq(buf, flags) 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_kmap_irq(bio, flags) __bio_kmap_irq((bio), (bio)->bi_idx, (flags)) 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define bio_kunmap_irq(buf,flags) __bio_kunmap_irq(buf, flags) 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 172