linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / include / linux / genhd.h
index 749992d..eef5ccd 100644 (file)
@@ -28,6 +28,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 */
@@ -77,7 +78,7 @@ struct hd_struct {
        sector_t start_sect;
        sector_t nr_sects;
        struct kobject kobj;
-       unsigned reads, read_sectors, writes, write_sectors;
+       unsigned ios[2], sectors[2];    /* READs and WRITEs */
        int policy, partno;
 };
 
@@ -88,10 +89,10 @@ struct hd_struct {
 #define GENHD_FL_SUPPRESS_PARTITION_INFO       32
 
 struct disk_stats {
-       unsigned read_sectors, write_sectors;
-       unsigned reads, writes;
-       unsigned read_merges, write_merges;
-       unsigned read_ticks, write_ticks;
+       unsigned sectors[2];            /* READs and WRITEs */
+       unsigned ios[2];
+       unsigned merges[2];
+       unsigned ticks[2];
        unsigned io_ticks;
        unsigned time_in_queue;
 };
@@ -118,7 +119,7 @@ struct gendisk {
        int policy;
 
        atomic_t sync_io;               /* RAID */
-       unsigned long stamp, stamp_idle;
+       unsigned long stamp;
        int in_flight;
 #ifdef CONFIG_SMP
        struct disk_stats *dkstats;
@@ -127,15 +128,23 @@ 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;                       \
@@ -159,7 +168,8 @@ static inline void disk_stat_set_all(struct gendisk *gendiskp, int value)   {
 }              
                                
 #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)      {
@@ -167,8 +177,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)
 
@@ -202,6 +225,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);
@@ -380,6 +404,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);