root/include/linux/md.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 
   2 /*
   3    md.h : Multiple Devices driver for Linux
   4           Copyright (C) 1994-96 Marc ZYNGIER
   5           <zyngier@ufr-info-p7.ibp.fr> or
   6           <maz@gloups.fdn.fr>
   7           
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 2, or (at your option)
  11    any later version.
  12    
  13    You should have received a copy of the GNU General Public License
  14    (for example /usr/src/linux/COPYING); if not, write to the Free
  15    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
  16 */
  17 
  18 #ifndef _MD_H
  19 #define _MD_H
  20 
  21 #include <asm/segment.h>
  22 #include <linux/major.h>
  23 #include <linux/mm.h>
  24 #include <linux/ioctl.h>
  25 
  26 #define MD_VERSION "0.34"
  27 
  28 /* ioctls */
  29 #define REGISTER_DEV _IO (MD_MAJOR, 1)
  30 #define START_MD     _IO (MD_MAJOR, 2)
  31 #define STOP_MD      _IO (MD_MAJOR, 3)
  32 #define MD_INVALID   _IO (MD_MAJOR, 4)
  33 #define MD_VALID     _IO (MD_MAJOR, 5)
  34 
  35 /*
  36    personalities :
  37    Byte 0 : Chunk size factor
  38    Byte 1 : Fault tolerance count for each physical device
  39             (   0 means no fault tolerance,
  40              0xFF means always tolerate faults)
  41    Byte 2 : Personality
  42    Byte 3 : Reserved.
  43  */
  44 
  45 #define FAULT_SHIFT       8
  46 #define PERSONALITY_SHIFT 16
  47 
  48 #define FACTOR_MASK       0xFFUL
  49 #define FAULT_MASK        0xFF00UL
  50 #define PERSONALITY_MASK  0xFF0000UL
  51 
  52 #define MD_RESERVED       0     /* Not used by now */
  53 #define LINEAR            (1UL << PERSONALITY_SHIFT)
  54 #define STRIPED           (2UL << PERSONALITY_SHIFT)
  55 #define STRIPPED          STRIPED /* Long lasting spelling mistake... */
  56 #define RAID0             STRIPED
  57 #define RAID1             (3UL << PERSONALITY_SHIFT)
  58 #define RAID5             (4UL << PERSONALITY_SHIFT)
  59 #define MAX_PERSONALITY   5
  60 
  61 #ifdef __KERNEL__
  62 
  63 #include <linux/config.h>
  64 #include <linux/types.h>
  65 #include <linux/fs.h>
  66 #include <linux/blkdev.h>
  67 
  68 #undef MD_COUNT_SIZE            /* Define this to have stats about
  69                                    chunk size in /proc/mdstat */
  70 #define MAX_REAL     8          /* Max number of physical dev per md dev */
  71 #define MAX_MD_DEV   4          /* Max number of md dev */
  72 
  73 #define FACTOR(a)         ((a)->repartition & FACTOR_MASK)
  74 #define MAX_FAULT(a)      (((a)->repartition & FAULT_MASK)>>8)
  75 #define PERSONALITY(a)    ((a)->repartition & PERSONALITY_MASK)
  76 
  77 #define FACTOR_SHIFT(a) (PAGE_SHIFT + (a) - 10)
  78 
  79 /* Invalidation modes */
  80 #define VALID          0
  81 #define INVALID_NEXT   1
  82 #define INVALID_ALWAYS 2
  83 #define INVALID        3        /* Only useful to md_valid_device */
  84 
  85 /* Return values from personalities to md driver */
  86 #define REDIRECTED_BHREQ 0 /* Redirected individual buffers
  87                               (shouldn't be used anymore since 0.31) */
  88 #define REDIRECTED_REQ   1 /* Redirected whole request */
  89 #define REDIRECT_FAILED -1 /* For RAID-1 */
  90 
  91 struct real_dev
  92 {
  93   kdev_t dev;                   /* Device number */
  94   int size;                     /* Device size (in blocks) */
  95   int offset;                   /* Real device offset (in blocks) in md dev
  96                                    (only used in linear mode) */
  97   struct inode *inode;          /* Lock inode */
  98   int fault_count;              /* Fault counter for invalidation */
  99   int invalid;                  /* Indicate if the device is disabled :
 100                                    VALID          - valid
 101                                    INVALID_NEXT   - disabled for next access
 102                                    INVALID_ALWAYS - permanently disabled
 103                                    (for redundancy modes only) */
 104 };
 105 
 106 struct md_dev;
 107 
 108 struct md_personality
 109 {
 110   char *name;
 111   int (*map)(int minor, struct md_dev *md_dev, struct request *req);
 112   int (*run)(int minor, struct md_dev *md_dev);
 113   int (*stop)(int minor, struct md_dev *md_dev);
 114   int (*status)(char *page, int minor, struct md_dev *md_dev);
 115   int (*ioctl)(struct inode *inode, struct file *file,
 116                unsigned int cmd, unsigned long arg);
 117   int max_invalid_dev;
 118 };
 119 
 120 struct md_dev
 121 {
 122   struct md_personality *pers;
 123   int repartition;
 124   int invalid_dev_count;
 125   int busy;
 126   int nb_dev;
 127   void *private;
 128 #ifdef MD_COUNT_SIZE
 129   unsigned int smallest_count;
 130   unsigned int biggest_count;
 131   unsigned int equal_count;
 132 #endif
 133 };
 134 
 135 extern struct real_dev devices[MAX_MD_DEV][MAX_REAL];
 136 extern struct md_dev md_dev[MAX_MD_DEV];
 137 extern int md_size[MAX_MD_DEV];
 138 
 139 extern void make_md_request(struct request *pending, int n);
 140 extern char *partition_name (kdev_t dev);
 141 
 142 #if defined(CONFIG_MD_SUPPORT_RAID1) || defined(CONFIG_MD_SUPPORT_RAID5)
 143 extern int md_valid_device (int minor, kdev_t dev, int mode);
 144 extern int md_can_reemit (int minor);
 145 #endif
 146 
 147 extern int register_md_personality (int p_num, struct md_personality *p);
 148 extern int unregister_md_personality (int p_num);
 149 
 150 #endif __KERNEL__
 151 #endif _MD_H

/* [previous][next][first][last][top][bottom][index][help] */