home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / raid / raid10.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.9 KB  |  120 lines

  1. #ifndef _RAID10_H
  2. #define _RAID10_H
  3.  
  4. #include <linux/raid/md.h>
  5.  
  6. typedef struct mirror_info mirror_info_t;
  7.  
  8. struct mirror_info {
  9.     mdk_rdev_t    *rdev;
  10.     sector_t    head_position;
  11. };
  12.  
  13. typedef struct r10bio_s r10bio_t;
  14.  
  15. struct r10_private_data_s {
  16.     mddev_t            *mddev;
  17.     mirror_info_t        *mirrors;
  18.     int            raid_disks;
  19.     int            working_disks;
  20.     spinlock_t        device_lock;
  21.  
  22.     /* geometry */
  23.     int            near_copies;  /* number of copies layed out raid0 style */
  24.     int             far_copies;   /* number of copies layed out
  25.                            * at large strides across drives
  26.                            */
  27.     int            copies;          /* near_copies * far_copies.
  28.                            * must be <= raid_disks
  29.                            */
  30.     sector_t        stride;          /* distance between far copies.
  31.                            * This is size / far_copies
  32.                            */
  33.  
  34.     int chunk_shift; /* shift from chunks to sectors */
  35.     sector_t chunk_mask;
  36.  
  37.     struct list_head    retry_list;
  38.     /* queue pending writes and submit them on unplug */
  39.     struct bio_list        pending_bio_list;
  40.  
  41.  
  42.     spinlock_t        resync_lock;
  43.     int nr_pending;
  44.     int nr_waiting;
  45.     int nr_queued;
  46.     int barrier;
  47.     sector_t        next_resync;
  48.     int            fullsync;  /* set to 1 if a full sync is needed,
  49.                         * (fresh device added).
  50.                         * Cleared when a sync completes.
  51.                         */
  52.  
  53.     wait_queue_head_t    wait_barrier;
  54.  
  55.     mempool_t *r10bio_pool;
  56.     mempool_t *r10buf_pool;
  57.     struct page        *tmppage;
  58. };
  59.  
  60. typedef struct r10_private_data_s conf_t;
  61.  
  62. /*
  63.  * this is the only point in the RAID code where we violate
  64.  * C type safety. mddev->private is an 'opaque' pointer.
  65.  */
  66. #define mddev_to_conf(mddev) ((conf_t *) mddev->private)
  67.  
  68. /*
  69.  * this is our 'private' RAID10 bio.
  70.  *
  71.  * it contains information about what kind of IO operations were started
  72.  * for this RAID10 operation, and about their status:
  73.  */
  74.  
  75. struct r10bio_s {
  76.     atomic_t        remaining; /* 'have we finished' count,
  77.                         * used from IRQ handlers
  78.                         */
  79.     sector_t        sector;    /* virtual sector number */
  80.     int            sectors;
  81.     unsigned long        state;
  82.     mddev_t            *mddev;
  83.     /*
  84.      * original bio going to /dev/mdx
  85.      */
  86.     struct bio        *master_bio;
  87.     /*
  88.      * if the IO is in READ direction, then this is where we read
  89.      */
  90.     int            read_slot;
  91.  
  92.     struct list_head    retry_list;
  93.     /*
  94.      * if the IO is in WRITE direction, then multiple bios are used,
  95.      * one for each copy.
  96.      * When resyncing we also use one for each copy.
  97.      * When reconstructing, we use 2 bios, one for read, one for write.
  98.      * We choose the number when they are allocated.
  99.      */
  100.     struct {
  101.         struct bio        *bio;
  102.         sector_t addr;
  103.         int devnum;
  104.     } devs[0];
  105. };
  106.  
  107. /* when we get a read error on a read-only array, we redirect to another
  108.  * device without failing the first device, or trying to over-write to
  109.  * correct the read error.  To keep track of bad blocks on a per-bio
  110.  * level, we store IO_BLOCKED in the appropriate 'bios' pointer
  111.  */
  112. #define IO_BLOCKED ((struct bio*)1)
  113.  
  114. /* bits for r10bio.state */
  115. #define    R10BIO_Uptodate    0
  116. #define    R10BIO_IsSync    1
  117. #define    R10BIO_IsRecover 2
  118. #define    R10BIO_Degraded 3
  119. #endif
  120.