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