linux/drivers/md/dm-io.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2003 Sistina Software
   3 *
   4 * This file is released under the GPL.
   5 */
   6
   7#ifndef _DM_IO_H
   8#define _DM_IO_H
   9
  10#include "dm.h"
  11
  12struct io_region {
  13        struct block_device *bdev;
  14        sector_t sector;
  15        sector_t count;         /* If this is zero the region is ignored. */
  16};
  17
  18struct page_list {
  19        struct page_list *next;
  20        struct page *page;
  21};
  22
  23typedef void (*io_notify_fn)(unsigned long error, void *context);
  24
  25enum dm_io_mem_type {
  26        DM_IO_PAGE_LIST,/* Page list */
  27        DM_IO_BVEC,     /* Bio vector */
  28        DM_IO_VMA,      /* Virtual memory area */
  29        DM_IO_KMEM,     /* Kernel memory */
  30};
  31
  32struct dm_io_memory {
  33        enum dm_io_mem_type type;
  34
  35        union {
  36                struct page_list *pl;
  37                struct bio_vec *bvec;
  38                void *vma;
  39                void *addr;
  40        } ptr;
  41
  42        unsigned offset;
  43};
  44
  45struct dm_io_notify {
  46        io_notify_fn fn;        /* Callback for asynchronous requests */
  47        void *context;          /* Passed to callback */
  48};
  49
  50/*
  51 * IO request structure
  52 */
  53struct dm_io_client;
  54struct dm_io_request {
  55        int bi_rw;                      /* READ|WRITE - not READA */
  56        struct dm_io_memory mem;        /* Memory to use for io */
  57        struct dm_io_notify notify;     /* Synchronous if notify.fn is NULL */
  58        struct dm_io_client *client;    /* Client memory handler */
  59};
  60
  61/*
  62 * For async io calls, users can alternatively use the dm_io() function below
  63 * and dm_io_client_create() to create private mempools for the client.
  64 *
  65 * Create/destroy may block.
  66 */
  67struct dm_io_client *dm_io_client_create(unsigned num_pages);
  68int dm_io_client_resize(unsigned num_pages, struct dm_io_client *client);
  69void dm_io_client_destroy(struct dm_io_client *client);
  70
  71/*
  72 * IO interface using private per-client pools.
  73 * Each bit in the optional 'sync_error_bits' bitset indicates whether an
  74 * error occurred doing io to the corresponding region.
  75 */
  76int dm_io(struct dm_io_request *io_req, unsigned num_regions,
  77          struct io_region *region, unsigned long *sync_error_bits);
  78
  79#endif
  80