OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [include/] [linux/] [md.h] - Diff between revs 1765 and 1782

Only display areas with differences | Details | Blame | View Log

Rev 1765 Rev 1782
/*
/*
   md.h : Multiple Devices driver for Linux
   md.h : Multiple Devices driver for Linux
          Copyright (C) 1994-96 Marc ZYNGIER
          Copyright (C) 1994-96 Marc ZYNGIER
          <zyngier@ufr-info-p7.ibp.fr> or
          <zyngier@ufr-info-p7.ibp.fr> or
          <maz@gloups.fdn.fr>
          <maz@gloups.fdn.fr>
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   the Free Software Foundation; either version 2, or (at your option)
   any later version.
   any later version.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   (for example /usr/src/linux/COPYING); if not, write to the Free
   (for example /usr/src/linux/COPYING); if not, write to the Free
   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
*/
 
 
#ifndef _MD_H
#ifndef _MD_H
#define _MD_H
#define _MD_H
 
 
#include <asm/segment.h>
#include <asm/segment.h>
#include <linux/major.h>
#include <linux/major.h>
#include <linux/ioctl.h>
#include <linux/ioctl.h>
#include <linux/types.h>
#include <linux/types.h>
 
 
/*
/*
 * Different major versions are not compatible.
 * Different major versions are not compatible.
 * Different minor versions are only downward compatible.
 * Different minor versions are only downward compatible.
 * Different patchlevel versions are downward and upward compatible.
 * Different patchlevel versions are downward and upward compatible.
 */
 */
#define MD_MAJOR_VERSION                0
#define MD_MAJOR_VERSION                0
#define MD_MINOR_VERSION                36
#define MD_MINOR_VERSION                36
#define MD_PATCHLEVEL_VERSION           3
#define MD_PATCHLEVEL_VERSION           3
 
 
/* ioctls */
/* ioctls */
#define REGISTER_DEV _IO (MD_MAJOR, 1)
#define REGISTER_DEV _IO (MD_MAJOR, 1)
#define START_MD     _IO (MD_MAJOR, 2)
#define START_MD     _IO (MD_MAJOR, 2)
#define STOP_MD      _IO (MD_MAJOR, 3)
#define STOP_MD      _IO (MD_MAJOR, 3)
 
 
/*
/*
   personalities :
   personalities :
   Byte 0 : Chunk size factor
   Byte 0 : Chunk size factor
   Byte 1 : Fault tolerance count for each physical device
   Byte 1 : Fault tolerance count for each physical device
            (   0 means no fault tolerance,
            (   0 means no fault tolerance,
             0xFF means always tolerate faults), not used by now.
             0xFF means always tolerate faults), not used by now.
   Byte 2 : Personality
   Byte 2 : Personality
   Byte 3 : Reserved.
   Byte 3 : Reserved.
 */
 */
 
 
#define FAULT_SHIFT       8
#define FAULT_SHIFT       8
#define PERSONALITY_SHIFT 16
#define PERSONALITY_SHIFT 16
 
 
#define FACTOR_MASK       0x000000FFUL
#define FACTOR_MASK       0x000000FFUL
#define FAULT_MASK        0x0000FF00UL
#define FAULT_MASK        0x0000FF00UL
#define PERSONALITY_MASK  0x00FF0000UL
#define PERSONALITY_MASK  0x00FF0000UL
 
 
#define MD_RESERVED       0     /* Not used by now */
#define MD_RESERVED       0     /* Not used by now */
#define LINEAR            (1UL << PERSONALITY_SHIFT)
#define LINEAR            (1UL << PERSONALITY_SHIFT)
#define STRIPED           (2UL << PERSONALITY_SHIFT)
#define STRIPED           (2UL << PERSONALITY_SHIFT)
#define RAID0             STRIPED
#define RAID0             STRIPED
#define RAID1             (3UL << PERSONALITY_SHIFT)
#define RAID1             (3UL << PERSONALITY_SHIFT)
#define RAID5             (4UL << PERSONALITY_SHIFT)
#define RAID5             (4UL << PERSONALITY_SHIFT)
#define MAX_PERSONALITY   5
#define MAX_PERSONALITY   5
 
 
/*
/*
 * MD superblock.
 * MD superblock.
 *
 *
 * The MD superblock maintains some statistics on each MD configuration.
 * The MD superblock maintains some statistics on each MD configuration.
 * Each real device in the MD set contains it near the end of the device.
 * Each real device in the MD set contains it near the end of the device.
 * Some of the ideas are copied from the ext2fs implementation.
 * Some of the ideas are copied from the ext2fs implementation.
 *
 *
 * We currently use 4096 bytes as follows:
 * We currently use 4096 bytes as follows:
 *
 *
 *      word offset     function
 *      word offset     function
 *
 *
 *         0  -    31   Constant generic MD device information.
 *         0  -    31   Constant generic MD device information.
 *        32  -    63   Generic state information.
 *        32  -    63   Generic state information.
 *        64  -   127   Personality specific information.
 *        64  -   127   Personality specific information.
 *       128  -   511   12 32-words descriptors of the disks in the raid set.
 *       128  -   511   12 32-words descriptors of the disks in the raid set.
 *       512  -   911   Reserved.
 *       512  -   911   Reserved.
 *       912  -  1023   Disk specific descriptor.
 *       912  -  1023   Disk specific descriptor.
 */
 */
 
 
/*
/*
 * If x is the real device size in bytes, we return an apparent size of:
 * If x is the real device size in bytes, we return an apparent size of:
 *
 *
 *      y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
 *      y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
 *
 *
 * and place the 4kB superblock at offset y.
 * and place the 4kB superblock at offset y.
 */
 */
#define MD_RESERVED_BYTES               (64 * 1024)
#define MD_RESERVED_BYTES               (64 * 1024)
#define MD_RESERVED_SECTORS             (MD_RESERVED_BYTES / 512)
#define MD_RESERVED_SECTORS             (MD_RESERVED_BYTES / 512)
#define MD_RESERVED_BLOCKS              (MD_RESERVED_BYTES / BLOCK_SIZE)
#define MD_RESERVED_BLOCKS              (MD_RESERVED_BYTES / BLOCK_SIZE)
 
 
#define MD_NEW_SIZE_SECTORS(x)          ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
#define MD_NEW_SIZE_SECTORS(x)          ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
#define MD_NEW_SIZE_BLOCKS(x)           ((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)
#define MD_NEW_SIZE_BLOCKS(x)           ((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)
 
 
#define MD_SB_BYTES                     4096
#define MD_SB_BYTES                     4096
#define MD_SB_WORDS                     (MD_SB_BYTES / 4)
#define MD_SB_WORDS                     (MD_SB_BYTES / 4)
#define MD_SB_BLOCKS                    (MD_SB_BYTES / BLOCK_SIZE)
#define MD_SB_BLOCKS                    (MD_SB_BYTES / BLOCK_SIZE)
#define MD_SB_SECTORS                   (MD_SB_BYTES / 512)
#define MD_SB_SECTORS                   (MD_SB_BYTES / 512)
 
 
/*
/*
 * The following are counted in 32-bit words
 * The following are counted in 32-bit words
 */
 */
#define MD_SB_GENERIC_OFFSET            0
#define MD_SB_GENERIC_OFFSET            0
#define MD_SB_PERSONALITY_OFFSET        64
#define MD_SB_PERSONALITY_OFFSET        64
#define MD_SB_DISKS_OFFSET              128
#define MD_SB_DISKS_OFFSET              128
#define MD_SB_DESCRIPTOR_OFFSET         992
#define MD_SB_DESCRIPTOR_OFFSET         992
 
 
#define MD_SB_GENERIC_CONSTANT_WORDS    32
#define MD_SB_GENERIC_CONSTANT_WORDS    32
#define MD_SB_GENERIC_STATE_WORDS       32
#define MD_SB_GENERIC_STATE_WORDS       32
#define MD_SB_GENERIC_WORDS             (MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
#define MD_SB_GENERIC_WORDS             (MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
#define MD_SB_PERSONALITY_WORDS         64
#define MD_SB_PERSONALITY_WORDS         64
#define MD_SB_DISKS_WORDS               384
#define MD_SB_DISKS_WORDS               384
#define MD_SB_DESCRIPTOR_WORDS          32
#define MD_SB_DESCRIPTOR_WORDS          32
#define MD_SB_RESERVED_WORDS            (1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
#define MD_SB_RESERVED_WORDS            (1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
#define MD_SB_EQUAL_WORDS               (MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
#define MD_SB_EQUAL_WORDS               (MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
#define MD_SB_DISKS                     (MD_SB_DISKS_WORDS / MD_SB_DESCRIPTOR_WORDS)
#define MD_SB_DISKS                     (MD_SB_DISKS_WORDS / MD_SB_DESCRIPTOR_WORDS)
 
 
/*
/*
 * Device "operational" state bits
 * Device "operational" state bits
 */
 */
#define MD_FAULTY_DEVICE                0        /* Device is faulty / operational */
#define MD_FAULTY_DEVICE                0        /* Device is faulty / operational */
#define MD_ACTIVE_DEVICE                1       /* Device is a part or the raid set / spare disk */
#define MD_ACTIVE_DEVICE                1       /* Device is a part or the raid set / spare disk */
#define MD_SYNC_DEVICE                  2       /* Device is in sync with the raid set */
#define MD_SYNC_DEVICE                  2       /* Device is in sync with the raid set */
 
 
typedef struct md_device_descriptor_s {
typedef struct md_device_descriptor_s {
        __u32 number;           /* 0 Device number in the entire set */
        __u32 number;           /* 0 Device number in the entire set */
        __u32 major;            /* 1 Device major number */
        __u32 major;            /* 1 Device major number */
        __u32 minor;            /* 2 Device minor number */
        __u32 minor;            /* 2 Device minor number */
        __u32 raid_disk;        /* 3 The role of the device in the raid set */
        __u32 raid_disk;        /* 3 The role of the device in the raid set */
        __u32 state;            /* 4 Operational state */
        __u32 state;            /* 4 Operational state */
        __u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
        __u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
} md_descriptor_t;
} md_descriptor_t;
 
 
#define MD_SB_MAGIC             0xa92b4efc
#define MD_SB_MAGIC             0xa92b4efc
 
 
/*
/*
 * Superblock state bits
 * Superblock state bits
 */
 */
#define MD_SB_CLEAN             0
#define MD_SB_CLEAN             0
#define MD_SB_ERRORS            1
#define MD_SB_ERRORS            1
 
 
typedef struct md_superblock_s {
typedef struct md_superblock_s {
 
 
        /*
        /*
         * Constant generic information
         * Constant generic information
         */
         */
        __u32 md_magic;         /*  0 MD identifier */
        __u32 md_magic;         /*  0 MD identifier */
        __u32 major_version;    /*  1 major version to which the set conforms */
        __u32 major_version;    /*  1 major version to which the set conforms */
        __u32 minor_version;    /*  2 minor version to which the set conforms */
        __u32 minor_version;    /*  2 minor version to which the set conforms */
        __u32 patch_version;    /*  3 patchlevel version to which the set conforms */
        __u32 patch_version;    /*  3 patchlevel version to which the set conforms */
        __u32 gvalid_words;     /*  4 Number of non-reserved words in this section */
        __u32 gvalid_words;     /*  4 Number of non-reserved words in this section */
        __u32 set_magic;        /*  5 Raid set identifier */
        __u32 set_magic;        /*  5 Raid set identifier */
        __u32 ctime;            /*  6 Creation time */
        __u32 ctime;            /*  6 Creation time */
        __u32 level;            /*  7 Raid personality (mirroring, raid5, ...) */
        __u32 level;            /*  7 Raid personality (mirroring, raid5, ...) */
        __u32 size;             /*  8 Apparent size of each individual disk, in kB */
        __u32 size;             /*  8 Apparent size of each individual disk, in kB */
        __u32 nr_disks;         /*  9 Number of total disks in the raid set */
        __u32 nr_disks;         /*  9 Number of total disks in the raid set */
        __u32 raid_disks;       /* 10 Number of disks in a fully functional raid set */
        __u32 raid_disks;       /* 10 Number of disks in a fully functional raid set */
        __u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 11];
        __u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 11];
 
 
        /*
        /*
         * Generic state information
         * Generic state information
         */
         */
        __u32 utime;            /*  0 Superblock update time */
        __u32 utime;            /*  0 Superblock update time */
        __u32 state;            /*  1 State bits (clean, ...) */
        __u32 state;            /*  1 State bits (clean, ...) */
        __u32 active_disks;     /*  2 Number of currently active disks (some non-faulty disks might not be in sync) */
        __u32 active_disks;     /*  2 Number of currently active disks (some non-faulty disks might not be in sync) */
        __u32 working_disks;    /*  3 Number of working disks */
        __u32 working_disks;    /*  3 Number of working disks */
        __u32 failed_disks;     /*  4 Number of failed disks */
        __u32 failed_disks;     /*  4 Number of failed disks */
        __u32 spare_disks;      /*  5 Number of spare disks */
        __u32 spare_disks;      /*  5 Number of spare disks */
        __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 6];
        __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 6];
 
 
        /*
        /*
         * Personality information
         * Personality information
         */
         */
        __u32 parity_algorithm;
        __u32 parity_algorithm;
        __u32 chunk_size;
        __u32 chunk_size;
        __u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 2];
        __u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 2];
 
 
        /*
        /*
         * Disks information
         * Disks information
         */
         */
        md_descriptor_t disks[MD_SB_DISKS];
        md_descriptor_t disks[MD_SB_DISKS];
 
 
        /*
        /*
         * Reserved
         * Reserved
         */
         */
        __u32 reserved[MD_SB_RESERVED_WORDS];
        __u32 reserved[MD_SB_RESERVED_WORDS];
 
 
        /*
        /*
         * Active descriptor
         * Active descriptor
         */
         */
        md_descriptor_t descriptor;
        md_descriptor_t descriptor;
} md_superblock_t;
} md_superblock_t;
 
 
#ifdef __KERNEL__
#ifdef __KERNEL__
 
 
#include <linux/mm.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/fs.h>
#include <linux/blkdev.h>
#include <linux/blkdev.h>
 
 
#define MAX_REAL     8          /* Max number of physical dev per md dev */
#define MAX_REAL     8          /* Max number of physical dev per md dev */
#define MAX_MD_DEV   4          /* Max number of md dev */
#define MAX_MD_DEV   4          /* Max number of md dev */
#define MAX_MD_THREADS 2        /* Max number of kernel threads */
#define MAX_MD_THREADS 2        /* Max number of kernel threads */
 
 
#define FACTOR(a)         ((a)->repartition & FACTOR_MASK)
#define FACTOR(a)         ((a)->repartition & FACTOR_MASK)
#define MAX_FAULT(a)      (((a)->repartition & FAULT_MASK)>>8)
#define MAX_FAULT(a)      (((a)->repartition & FAULT_MASK)>>8)
#define PERSONALITY(a)    ((a)->repartition & PERSONALITY_MASK)
#define PERSONALITY(a)    ((a)->repartition & PERSONALITY_MASK)
 
 
#define FACTOR_SHIFT(a) (PAGE_SHIFT + (a) - 10)
#define FACTOR_SHIFT(a) (PAGE_SHIFT + (a) - 10)
 
 
struct real_dev
struct real_dev
{
{
  kdev_t dev;                   /* Device number */
  kdev_t dev;                   /* Device number */
  int size;                     /* Device size (in blocks) */
  int size;                     /* Device size (in blocks) */
  int offset;                   /* Real device offset (in blocks) in md dev
  int offset;                   /* Real device offset (in blocks) in md dev
                                   (only used in linear mode) */
                                   (only used in linear mode) */
  struct inode *inode;          /* Lock inode */
  struct inode *inode;          /* Lock inode */
  md_superblock_t *sb;
  md_superblock_t *sb;
  u32 sb_offset;
  u32 sb_offset;
};
};
 
 
struct md_dev;
struct md_dev;
 
 
struct md_personality
struct md_personality
{
{
  char *name;
  char *name;
  int (*map)(struct md_dev *md_dev, kdev_t *rdev,
  int (*map)(struct md_dev *md_dev, kdev_t *rdev,
                      unsigned long *rsector, unsigned long size);
                      unsigned long *rsector, unsigned long size);
  int (*make_request)(struct md_dev *md_dev, int rw, struct buffer_head * bh);
  int (*make_request)(struct md_dev *md_dev, int rw, struct buffer_head * bh);
  void (*end_request)(struct buffer_head * bh, int uptodate);
  void (*end_request)(struct buffer_head * bh, int uptodate);
  int (*run)(int minor, struct md_dev *md_dev);
  int (*run)(int minor, struct md_dev *md_dev);
  int (*stop)(int minor, struct md_dev *md_dev);
  int (*stop)(int minor, struct md_dev *md_dev);
  int (*status)(char *page, int minor, struct md_dev *md_dev);
  int (*status)(char *page, int minor, struct md_dev *md_dev);
  int (*ioctl)(struct inode *inode, struct file *file,
  int (*ioctl)(struct inode *inode, struct file *file,
               unsigned int cmd, unsigned long arg);
               unsigned int cmd, unsigned long arg);
  int max_invalid_dev;
  int max_invalid_dev;
  int (*error_handler)(struct md_dev *md_dev, kdev_t dev);
  int (*error_handler)(struct md_dev *md_dev, kdev_t dev);
};
};
 
 
struct md_dev
struct md_dev
{
{
  struct real_dev devices[MAX_REAL];
  struct real_dev devices[MAX_REAL];
  struct md_personality *pers;
  struct md_personality *pers;
  md_superblock_t *sb;
  md_superblock_t *sb;
  int sb_dirty;
  int sb_dirty;
  int repartition;
  int repartition;
  int busy;
  int busy;
  int nb_dev;
  int nb_dev;
  void *private;
  void *private;
};
};
 
 
struct md_thread {
struct md_thread {
        void                    (*run) (void *data);
        void                    (*run) (void *data);
        void                    *data;
        void                    *data;
        struct wait_queue       *wqueue;
        struct wait_queue       *wqueue;
        __u32                   flags;
        __u32                   flags;
};
};
 
 
#define THREAD_WAKEUP   0
#define THREAD_WAKEUP   0
 
 
extern struct md_dev md_dev[MAX_MD_DEV];
extern struct md_dev md_dev[MAX_MD_DEV];
extern int md_size[MAX_MD_DEV];
extern int md_size[MAX_MD_DEV];
 
 
extern char *partition_name (kdev_t dev);
extern char *partition_name (kdev_t dev);
 
 
extern int register_md_personality (int p_num, struct md_personality *p);
extern int register_md_personality (int p_num, struct md_personality *p);
extern int unregister_md_personality (int p_num);
extern int unregister_md_personality (int p_num);
extern struct md_thread *md_register_thread (void (*run) (void *data), void *data);
extern struct md_thread *md_register_thread (void (*run) (void *data), void *data);
extern void md_unregister_thread (struct md_thread *thread);
extern void md_unregister_thread (struct md_thread *thread);
extern void md_wakeup_thread(struct md_thread *thread);
extern void md_wakeup_thread(struct md_thread *thread);
extern int md_update_sb (int minor);
extern int md_update_sb (int minor);
 
 
#endif __KERNEL__
#endif __KERNEL__
#endif _MD_H
#endif _MD_H
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.