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 / raid1.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  3.4 KB  |  136 lines

  1. #ifndef _RAID1_H
  2. #define _RAID1_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. /*
  14.  * memory pools need a pointer to the mddev, so they can force an unplug
  15.  * when memory is tight, and a count of the number of drives that the
  16.  * pool was allocated for, so they know how much to allocate and free.
  17.  * mddev->raid_disks cannot be used, as it can change while a pool is active
  18.  * These two datums are stored in a kmalloced struct.
  19.  */
  20.  
  21. struct pool_info {
  22.     mddev_t *mddev;
  23.     int    raid_disks;
  24. };
  25.  
  26.  
  27. typedef struct r1bio_s r1bio_t;
  28.  
  29. struct r1_private_data_s {
  30.     mddev_t            *mddev;
  31.     mirror_info_t        *mirrors;
  32.     int            raid_disks;
  33.     int            working_disks;
  34.     int            last_used;
  35.     sector_t        next_seq_sect;
  36.     spinlock_t        device_lock;
  37.  
  38.     struct list_head    retry_list;
  39.     /* queue pending writes and submit them on unplug */
  40.     struct bio_list        pending_bio_list;
  41.     /* queue of writes that have been unplugged */
  42.     struct bio_list        flushing_bio_list;
  43.  
  44.     /* for use when syncing mirrors: */
  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.     struct pool_info    *poolinfo;
  60.  
  61.     struct page        *tmppage;
  62.  
  63.     mempool_t *r1bio_pool;
  64.     mempool_t *r1buf_pool;
  65. };
  66.  
  67. typedef struct r1_private_data_s conf_t;
  68.  
  69. /*
  70.  * this is the only point in the RAID code where we violate
  71.  * C type safety. mddev->private is an 'opaque' pointer.
  72.  */
  73. #define mddev_to_conf(mddev) ((conf_t *) mddev->private)
  74.  
  75. /*
  76.  * this is our 'private' RAID1 bio.
  77.  *
  78.  * it contains information about what kind of IO operations were started
  79.  * for this RAID1 operation, and about their status:
  80.  */
  81.  
  82. struct r1bio_s {
  83.     atomic_t        remaining; /* 'have we finished' count,
  84.                         * used from IRQ handlers
  85.                         */
  86.     atomic_t        behind_remaining; /* number of write-behind ios remaining
  87.                          * in this BehindIO request
  88.                          */
  89.     sector_t        sector;
  90.     int            sectors;
  91.     unsigned long        state;
  92.     mddev_t            *mddev;
  93.     /*
  94.      * original bio going to /dev/mdx
  95.      */
  96.     struct bio        *master_bio;
  97.     /*
  98.      * if the IO is in READ direction, then this is where we read
  99.      */
  100.     int            read_disk;
  101.  
  102.     struct list_head    retry_list;
  103.     struct bitmap_update    *bitmap_update;
  104.     /*
  105.      * if the IO is in WRITE direction, then multiple bios are used.
  106.      * We choose the number when they are allocated.
  107.      */
  108.     struct bio        *bios[0];
  109.     /* DO NOT PUT ANY NEW FIELDS HERE - bios array is contiguously alloced*/
  110. };
  111.  
  112. /* when we get a read error on a read-only array, we redirect to another
  113.  * device without failing the first device, or trying to over-write to
  114.  * correct the read error.  To keep track of bad blocks on a per-bio
  115.  * level, we store IO_BLOCKED in the appropriate 'bios' pointer
  116.  */
  117. #define IO_BLOCKED ((struct bio*)1)
  118.  
  119. /* bits for r1bio.state */
  120. #define    R1BIO_Uptodate    0
  121. #define    R1BIO_IsSync    1
  122. #define    R1BIO_Degraded    2
  123. #define    R1BIO_BehindIO    3
  124. #define    R1BIO_Barrier    4
  125. #define R1BIO_BarrierRetry 5
  126. /* For write-behind requests, we call bi_end_io when
  127.  * the last non-write-behind device completes, providing
  128.  * any write was successful.  Otherwise we call when
  129.  * any write-behind write succeeds, otherwise we call
  130.  * with failure when last write completes (and all failed).
  131.  * Record that bi_end_io was called with this flag...
  132.  */
  133. #define    R1BIO_Returned 6
  134.  
  135. #endif
  136.