1 /* 2 * iobuf.h 3 * 4 * Defines the structures used to track abstract kernel-space io buffers. 5 * 6 */ 7 8 #ifndef __LINUX_IOBUF_H 9 #define __LINUX_IOBUF_H 10 11 #include <linux/mm.h> 12 #include <linux/init.h> 13 #include <linux/wait.h> 14 #include <asm/atomic.h> 15 16 /* 17 * The kiobuf structure describes a physical set of pages reserved 18 * locked for IO. The reference counts on each page will have been 19 * incremented, and the flags field will indicate whether or not we have 20 * pre-locked all of the pages for IO. 21 * 22 * kiobufs may be passed in arrays to form a kiovec, but we must 23 * preserve the property that no page is present more than once over the 24 * entire iovec. 25 */ 26 27 #define KIO_MAX_ATOMIC_IO 512 /* in kb */ 28 #define KIO_STATIC_PAGES (KIO_MAX_ATOMIC_IO / (PAGE_SIZE >> 10) + 1) 29 #define KIO_MAX_SECTORS (KIO_MAX_ATOMIC_IO * 2) 30 31 /* The main kiobuf struct used for all our IO! */ 32 33 struct kiobuf 34 { 35 int nr_pages; /* Pages actually referenced */ 36 int array_len; /* Space in the allocated lists */ 37 int offset; /* Offset to start of valid data */ 38 int length; /* Number of valid bytes of data */ 39 40 unsigned int locked : 1; /* If set, pages has been locked */ 41 42 struct page ** maplist; 43 struct buffer_head ** bh; 44 unsigned long * blocks; 45 46 /* Dynamic state for IO completion: */ 47 atomic_t io_count; /* IOs still in progress */ 48 int errno; /* Status of completed IO */ 49 void (*end_io) (struct kiobuf *); /* Completion callback */ 50 wait_queue_head_t wait_queue; 51 }; 52 53 54 /* mm/memory.c */ 55 56 int map_user_kiobuf(int rw, struct kiobuf *, unsigned long va, size_t len); 57 void unmap_kiobuf(struct kiobuf *iobuf); 58 int lock_kiovec(int nr, struct kiobuf *iovec[], int wait); 59 int unlock_kiovec(int nr, struct kiobuf *iovec[]); 60 void mark_dirty_kiobuf(struct kiobuf *iobuf, int bytes); 61 62 /* fs/iobuf.c */ 63 64 void end_kio_request(struct kiobuf *, int); 65 void simple_wakeup_kiobuf(struct kiobuf *); 66 int alloc_kiovec(int nr, struct kiobuf **); 67 void free_kiovec(int nr, struct kiobuf **); 68 int expand_kiobuf(struct kiobuf *, int); 69 void kiobuf_wait_for_io(struct kiobuf *); 70 extern int alloc_kiobuf_bhs(struct kiobuf *); 71 extern void free_kiobuf_bhs(struct kiobuf *); 72 73 /* fs/buffer.c */ 74 75 int brw_kiovec(int rw, int nr, struct kiobuf *iovec[], 76 kdev_t dev, unsigned long b[], int size); 77 78 #endif /* __LINUX_IOBUF_H */ 79