struct list_head queuelist;
        struct list_head donelist;
 
+       request_queue_t *q;
+
        unsigned int cmd_flags;
        enum rq_cmd_type_bits cmd_type;
 
         */
 
        sector_t sector;                /* next sector to submit */
+       sector_t hard_sector;           /* next sector to complete */
        unsigned long nr_sectors;       /* no. of sectors left to submit */
+       unsigned long hard_nr_sectors;  /* no. of sectors left to complete */
        /* no. of sectors left to submit in the current segment */
        unsigned int current_nr_sectors;
 
-       sector_t hard_sector;           /* next sector to complete */
-       unsigned long hard_nr_sectors;  /* no. of sectors left to complete */
        /* no. of sectors left to complete in the current segment */
        unsigned int hard_cur_sectors;
 
        struct bio *biotail;
 
        struct hlist_node hash; /* merge hash */
-       struct rb_node rb_node; /* sort/lookup */
+       /*
+        * The rb_node is only used inside the io scheduler, requests
+        * are pruned when moved to the dispatch queue. So let the
+        * completion_data share space with the rb_node.
+        */
+       union {
+               struct rb_node rb_node; /* sort/lookup */
+               void *completion_data;
+       };
 
        /*
         * two pointers are available for the IO schedulers, if they need
        void *elevator_private;
        void *elevator_private2;
 
-       void *completion_data;
-
        struct gendisk *rq_disk;
        unsigned long start_time;
 
 
        unsigned short ioprio;
 
-       request_queue_t *q;
-
        void *special;
        char *buffer;