fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / genhd.h
index 884d18d..0a022b2 100644 (file)
@@ -9,13 +9,9 @@
  *             <drew@colorado.edu>
  */
 
-#include <linux/config.h>
 #include <linux/types.h>
-#include <linux/major.h>
-#include <linux/device.h>
-#include <linux/smp.h>
-#include <linux/string.h>
-#include <linux/fs.h>
+
+#ifdef CONFIG_BLOCK
 
 enum {
 /* These three have identical behaviour; use the second one if DOS FDISK gets
@@ -28,6 +24,7 @@ enum {
        LINUX_RAID_PARTITION = 0xfd,    /* autodetect RAID partition */
 
        SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION,
+       NEW_SOLARIS_X86_PARTITION = 0xbf,
 
        DM6_AUX1PARTITION = 0x51,       /* no DDO:  use xlated geom */
        DM6_AUX3PARTITION = 0x53,       /* no DDO:  use xlated geom */
@@ -42,6 +39,8 @@ enum {
        UNIXWARE_PARTITION = 0x63,      /* Same as GNU_HURD and SCO Unix */
 };
 
+#ifndef __KERNEL__
+
 struct partition {
        unsigned char boot_ind;         /* 0x80 - active */
        unsigned char head;             /* starting head */
@@ -55,13 +54,38 @@ struct partition {
        unsigned int nr_sects;          /* nr of sectors in partition */
 } __attribute__((packed));
 
+#endif
+
 #ifdef __KERNEL__
+#include <linux/major.h>
+#include <linux/device.h>
+#include <linux/smp.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+
+struct partition {
+       unsigned char boot_ind;         /* 0x80 - active */
+       unsigned char head;             /* starting head */
+       unsigned char sector;           /* starting sector */
+       unsigned char cyl;              /* starting cylinder */
+       unsigned char sys_ind;          /* What partition type */
+       unsigned char end_head;         /* end head */
+       unsigned char end_sector;       /* end sector */
+       unsigned char end_cyl;          /* end cylinder */
+       __le32 start_sect;      /* starting sector counting from 0 */
+       __le32 nr_sects;                /* nr of sectors in partition */
+} __attribute__((packed));
+
 struct hd_struct {
        sector_t start_sect;
        sector_t nr_sects;
        struct kobject kobj;
-       unsigned reads, read_sectors, writes, write_sectors;
+       struct kobject *holder_dir;
+       unsigned ios[2], sectors[2];    /* READs and WRITEs */
        int policy, partno;
+#ifdef CONFIG_FAIL_MAKE_REQUEST
+       int make_it_fail;
+#endif
 };
 
 #define GENHD_FL_REMOVABLE                     1
@@ -69,14 +93,15 @@ struct hd_struct {
 #define GENHD_FL_CD                            8
 #define GENHD_FL_UP                            16
 #define GENHD_FL_SUPPRESS_PARTITION_INFO       32
+#define GENHD_FL_FAIL                          64
 
 struct disk_stats {
-       unsigned read_sectors, write_sectors;
-       unsigned reads, writes;
-       unsigned read_merges, write_merges;
-       unsigned read_ticks, write_ticks;
-       unsigned io_ticks;
-       unsigned time_in_queue;
+       unsigned long sectors[2];       /* READs and WRITEs */
+       unsigned long ios[2];
+       unsigned long merges[2];
+       unsigned long ticks[2];
+       unsigned long io_ticks;
+       unsigned long time_in_queue;
 };
        
 struct gendisk {
@@ -86,22 +111,23 @@ struct gendisk {
                                          * disks that can't be partitioned. */
        char disk_name[32];             /* name of major driver */
        struct hd_struct **part;        /* [indexed by minor] */
+       int part_uevent_suppress;
        struct block_device_operations *fops;
        struct request_queue *queue;
        void *private_data;
        sector_t capacity;
 
        int flags;
-       char devfs_name[64];            /* devfs crap */
-       int number;                     /* more of the same */
        struct device *driverfs_dev;
        struct kobject kobj;
+       struct kobject *holder_dir;
+       struct kobject *slave_dir;
 
        struct timer_rand_state *random;
        int policy;
 
-       unsigned sync_io;               /* RAID */
-       unsigned long stamp, stamp_idle;
+       atomic_t sync_io;               /* RAID */
+       unsigned long stamp;
        int in_flight;
 #ifdef CONFIG_SMP
        struct disk_stats *dkstats;
@@ -110,39 +136,42 @@ struct gendisk {
 #endif
 };
 
+/* Structure for sysfs attributes on block devices */
+struct disk_attribute {
+       struct attribute attr;
+       ssize_t (*show)(struct gendisk *, char *);
+       ssize_t (*store)(struct gendisk *, const char *, size_t);
+};
+
 /* 
  * Macros to operate on percpu disk statistics:
- * Since writes to disk_stats are serialised through the queue_lock,
- * smp_processor_id() should be enough to get to the per_cpu versions
- * of statistics counters
+ *
+ * The __ variants should only be called in critical sections. The full
+ * variants disable/enable preemption.
  */
 #ifdef CONFIG_SMP
-#define disk_stat_add(gendiskp, field, addnd)  \
+#define __disk_stat_add(gendiskp, field, addnd)        \
        (per_cpu_ptr(gendiskp->dkstats, smp_processor_id())->field += addnd)
+
 #define disk_stat_read(gendiskp, field)                                        \
 ({                                                                     \
        typeof(gendiskp->dkstats->field) res = 0;                       \
        int i;                                                          \
-       for (i=0; i < NR_CPUS; i++) {                                   \
-               if (!cpu_possible(i))                                   \
-                       continue;                                       \
+       for_each_possible_cpu(i)                                        \
                res += per_cpu_ptr(gendiskp->dkstats, i)->field;        \
-       }                                                               \
        res;                                                            \
 })
 
 static inline void disk_stat_set_all(struct gendisk *gendiskp, int value)      {
        int i;
-       for (i=0; i < NR_CPUS; i++) {
-               if (cpu_possible(i)) {
-                       memset(per_cpu_ptr(gendiskp->dkstats, i), value,        
-                                       sizeof (struct disk_stats));
-               }
-       }
+       for_each_possible_cpu(i)
+               memset(per_cpu_ptr(gendiskp->dkstats, i), value,
+                               sizeof (struct disk_stats));
 }              
                                
 #else
-#define disk_stat_add(gendiskp, field, addnd) (gendiskp->dkstats.field += addnd)
+#define __disk_stat_add(gendiskp, field, addnd) \
+                               (gendiskp->dkstats.field += addnd)
 #define disk_stat_read(gendiskp, field)        (gendiskp->dkstats.field)
 
 static inline void disk_stat_set_all(struct gendisk *gendiskp, int value)      {
@@ -150,8 +179,21 @@ static inline void disk_stat_set_all(struct gendisk *gendiskp, int value)  {
 }
 #endif
 
-#define disk_stat_inc(gendiskp, field) disk_stat_add(gendiskp, field, 1)
+#define disk_stat_add(gendiskp, field, addnd)                  \
+       do {                                                    \
+               preempt_disable();                              \
+               __disk_stat_add(gendiskp, field, addnd);        \
+               preempt_enable();                               \
+       } while (0)
+
+#define __disk_stat_dec(gendiskp, field) __disk_stat_add(gendiskp, field, -1)
 #define disk_stat_dec(gendiskp, field) disk_stat_add(gendiskp, field, -1)
+
+#define __disk_stat_inc(gendiskp, field) __disk_stat_add(gendiskp, field, 1)
+#define disk_stat_inc(gendiskp, field) disk_stat_add(gendiskp, field, 1)
+
+#define __disk_stat_sub(gendiskp, field, subnd) \
+               __disk_stat_add(gendiskp, field, -subnd)
 #define disk_stat_sub(gendiskp, field, subnd) \
                disk_stat_add(gendiskp, field, -subnd)
 
@@ -185,6 +227,7 @@ static inline void free_disk_stats(struct gendisk *disk)
 extern void disk_round_stats(struct gendisk *disk);
 
 /* drivers/block/genhd.c */
+extern int get_blkdev_list(char *, int);
 extern void add_disk(struct gendisk *disk);
 extern void del_gendisk(struct gendisk *gp);
 extern void unlink_gendisk(struct gendisk *gp);
@@ -218,19 +261,19 @@ static inline void set_capacity(struct gendisk *disk, sector_t size)
 #define SOLARIS_X86_VTOC_SANE  (0x600DDEEEUL)
 
 struct solaris_x86_slice {
-       ushort  s_tag;                  /* ID tag of partition */
-       ushort  s_flag;                 /* permission flags */
-       unsigned int s_start;           /* start sector no of partition */
-       unsigned int s_size;            /* # of blocks in partition */
+       __le16 s_tag;           /* ID tag of partition */
+       __le16 s_flag;          /* permission flags */
+       __le32 s_start;         /* start sector no of partition */
+       __le32 s_size;          /* # of blocks in partition */
 };
 
 struct solaris_x86_vtoc {
        unsigned int v_bootinfo[3];     /* info needed by mboot (unsupported) */
-       unsigned int v_sanity;          /* to verify vtoc sanity */
-       unsigned int v_version;         /* layout version */
+       __le32 v_sanity;                /* to verify vtoc sanity */
+       __le32 v_version;               /* layout version */
        char    v_volume[8];            /* volume name */
-       ushort  v_sectorsz;             /* sector size in bytes */
-       ushort  v_nparts;               /* number of partitions */
+       __le16  v_sectorsz;             /* sector size in bytes */
+       __le16  v_nparts;               /* number of partitions */
        unsigned int v_reserved[10];    /* free space */
        struct solaris_x86_slice
                v_slice[SOLARIS_X86_NUMSLICE]; /* slice headers */
@@ -249,11 +292,11 @@ struct solaris_x86_vtoc {
 /* check against BSD src/sys/sys/disklabel.h for consistency */
 
 #define BSD_DISKMAGIC  (0x82564557UL)  /* The disk magic number */
-#define BSD_MAXPARTITIONS      8
+#define BSD_MAXPARTITIONS      16
 #define OPENBSD_MAXPARTITIONS  16
 #define BSD_FS_UNUSED          0       /* disklabel unused partition entry ID */
 struct bsd_disklabel {
-       __u32   d_magic;                /* the magic number */
+       __le32  d_magic;                /* the magic number */
        __s16   d_type;                 /* drive type */
        __s16   d_subtype;              /* controller/d_type specific */
        char    d_typename[16];         /* type name, e.g. "eagle" */
@@ -278,20 +321,20 @@ struct bsd_disklabel {
        __u32   d_drivedata[NDDATA];    /* drive-type specific information */
 #define NSPARE 5
        __u32   d_spare[NSPARE];        /* reserved for future use */
-       __u32   d_magic2;               /* the magic number (again) */
-       __u16   d_checksum;             /* xor of data incl. partitions */
+       __le32  d_magic2;               /* the magic number (again) */
+       __le16  d_checksum;             /* xor of data incl. partitions */
 
                        /* filesystem and partition information: */
-       __u16   d_npartitions;          /* number of partitions in following */
-       __u32   d_bbsize;               /* size of boot area at sn0, bytes */
-       __u32   d_sbsize;               /* max size of fs superblock, bytes */
+       __le16  d_npartitions;          /* number of partitions in following */
+       __le32  d_bbsize;               /* size of boot area at sn0, bytes */
+       __le32  d_sbsize;               /* max size of fs superblock, bytes */
        struct  bsd_partition {         /* the partition table */
-               __u32   p_size;         /* number of sectors in partition */
-               __u32   p_offset;       /* starting sector */
-               __u32   p_fsize;        /* filesystem basic fragment size */
+               __le32  p_size;         /* number of sectors in partition */
+               __le32  p_offset;       /* starting sector */
+               __le32  p_fsize;        /* filesystem basic fragment size */
                __u8    p_fstype;       /* filesystem type, see below */
                __u8    p_frag;         /* filesystem fragments per block */
-               __u16   p_cpg;          /* filesystem cylinders per group */
+               __le16  p_cpg;          /* filesystem cylinders per group */
        } d_partitions[BSD_MAXPARTITIONS];      /* actually may be more */
 };
 
@@ -309,40 +352,40 @@ struct bsd_disklabel {
 #define UNIXWARE_FS_UNUSED     0               /* Unused slice entry ID */
 
 struct unixware_slice {
-       __u16   s_label;        /* label */
-       __u16   s_flags;        /* permission flags */
-       __u32   start_sect;     /* starting sector */
-       __u32   nr_sects;       /* number of sectors in slice */
+       __le16   s_label;       /* label */
+       __le16   s_flags;       /* permission flags */
+       __le32   start_sect;    /* starting sector */
+       __le32   nr_sects;      /* number of sectors in slice */
 };
 
 struct unixware_disklabel {
-       __u32   d_type;                 /* drive type */
-       __u32   d_magic;                /* the magic number */
-       __u32   d_version;              /* version number */
+       __le32   d_type;                /* drive type */
+       __le32   d_magic;                /* the magic number */
+       __le32   d_version;              /* version number */
        char    d_serial[12];           /* serial number of the device */
-       __u32   d_ncylinders;           /* # of data cylinders per device */
-       __u32   d_ntracks;              /* # of tracks per cylinder */
-       __u32   d_nsectors;             /* # of data sectors per track */
-       __u32   d_secsize;              /* # of bytes per sector */
-       __u32   d_part_start;           /* # of first sector of this partition */
-       __u32   d_unknown1[12];         /* ? */
-       __u32   d_alt_tbl;              /* byte offset of alternate table */
-       __u32   d_alt_len;              /* byte length of alternate table */
-       __u32   d_phys_cyl;             /* # of physical cylinders per device */
-       __u32   d_phys_trk;             /* # of physical tracks per cylinder */
-       __u32   d_phys_sec;             /* # of physical sectors per track */
-       __u32   d_phys_bytes;           /* # of physical bytes per sector */
-       __u32   d_unknown2;             /* ? */
-       __u32   d_unknown3;             /* ? */
-       __u32   d_pad[8];               /* pad */
+       __le32   d_ncylinders;           /* # of data cylinders per device */
+       __le32   d_ntracks;              /* # of tracks per cylinder */
+       __le32   d_nsectors;             /* # of data sectors per track */
+       __le32   d_secsize;              /* # of bytes per sector */
+       __le32   d_part_start;           /* # of first sector of this partition */
+       __le32   d_unknown1[12];         /* ? */
+       __le32  d_alt_tbl;              /* byte offset of alternate table */
+       __le32  d_alt_len;              /* byte length of alternate table */
+       __le32  d_phys_cyl;             /* # of physical cylinders per device */
+       __le32  d_phys_trk;             /* # of physical tracks per cylinder */
+       __le32  d_phys_sec;             /* # of physical sectors per track */
+       __le32  d_phys_bytes;           /* # of physical bytes per sector */
+       __le32  d_unknown2;             /* ? */
+       __le32   d_unknown3;             /* ? */
+       __le32  d_pad[8];               /* pad */
 
        struct unixware_vtoc {
-               __u32   v_magic;                /* the magic number */
-               __u32   v_version;              /* version number */
+               __le32  v_magic;                /* the magic number */
+               __le32  v_version;              /* version number */
                char    v_name[8];              /* volume name */
-               __u16   v_nslices;              /* # of slices */
-               __u16   v_unknown1;             /* ? */
-               __u32   v_reserved[10];         /* reserved */
+               __le16  v_nslices;              /* # of slices */
+               __le16  v_unknown1;             /* ? */
+               __le32  v_reserved[10];         /* reserved */
                struct unixware_slice
                        v_slice[UNIXWARE_NUMSLICE];     /* slice headers */
        } vtoc;
@@ -363,6 +406,7 @@ extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
 extern void add_partition(struct gendisk *, int, sector_t, sector_t);
 extern void delete_partition(struct gendisk *, int);
 
+extern struct gendisk *alloc_disk_node(int minors, int node_id);
 extern struct gendisk *alloc_disk(int minors);
 extern struct kobject *get_disk(struct gendisk *disk);
 extern void put_disk(struct gendisk *disk);
@@ -382,3 +426,5 @@ static inline struct block_device *bdget_disk(struct gendisk *disk, int index)
 #endif
 
 #endif
+
+#endif