if (!blk_fs_request(rq) || !rq->rq_disk)
                return;
 
-       part = get_part(rq->rq_disk, rq->sector);
+       part = disk_map_sector(rq->rq_disk, rq->sector);
        if (!new_io)
                __all_stat_inc(rq->rq_disk, part, merges[rw], rq->sector);
        else {
        }
 
        if (blk_fs_request(req) && req->rq_disk) {
-               struct hd_struct *part = get_part(req->rq_disk, req->sector);
+               struct hd_struct *part =
+                       disk_map_sector(req->rq_disk, req->sector);
                const int rw = rq_data_dir(req);
 
                all_stat_add(req->rq_disk, part, sectors[rw],
        if (disk && blk_fs_request(req) && req != &req->q->bar_rq) {
                unsigned long duration = jiffies - req->start_time;
                const int rw = rq_data_dir(req);
-               struct hd_struct *part = get_part(disk, req->sector);
+               struct hd_struct *part = disk_map_sector(disk, req->sector);
 
                __all_stat_inc(disk, part, ios[rw], req->sector);
                __all_stat_add(disk, part, ticks[rw], duration, req->sector);
 
        elv_merge_requests(q, req, next);
 
        if (req->rq_disk) {
-               struct hd_struct *part
-                       = get_part(req->rq_disk, req->sector);
+               struct hd_struct *part =
+                       disk_map_sector(req->rq_disk, req->sector);
                disk_round_stats(req->rq_disk);
                req->rq_disk->in_flight--;
                if (part) {
 
 {
        struct gendisk *gp = v;
        char buf[BDEVNAME_SIZE];
-       int n = 0;
+       int n;
 
        /*
        if (&gp->dev.kobj.entry == block_class.devices.next)
        disk_round_stats(gp);
        preempt_enable();
        seq_printf(s, "%4d %4d %s %lu %lu %llu %u %lu %lu %llu %u %u %u %u\n",
-               gp->major, n + gp->first_minor, disk_name(gp, n, buf),
+               gp->major, gp->first_minor, disk_name(gp, 0, buf),
                disk_stat_read(gp, ios[0]), disk_stat_read(gp, merges[0]),
                (unsigned long long)disk_stat_read(gp, sectors[0]),
                jiffies_to_msecs(disk_stat_read(gp, ticks[0])),
 
        const int rw = bio_data_dir(bio);
        struct hd_struct *part;
 
-       part = get_part(disk, sector);
+       part = disk_map_sector(disk, sector);
        all_stat_inc(disk, part, ios[rw], sector);
        all_stat_add(disk, part, ticks[rw], duration, sector);
        all_stat_add(disk, part, sectors[rw], n_sect, sector);
 
        int minors;                     /* maximum number of minors, =1 for
                                          * disks that can't be partitioned. */
        char disk_name[32];             /* name of major driver */
-       struct hd_struct **part;        /* [indexed by minor] */
+       struct hd_struct **part;        /* [indexed by minor - 1] */
        struct block_device_operations *fops;
        struct request_queue *queue;
        void *private_data;
 #endif
 };
 
+static inline struct gendisk *part_to_disk(struct hd_struct *part)
+{
+       if (likely(part))
+               return dev_to_disk((part)->dev.parent);
+       return NULL;
+}
+
 /* 
  * Macros to operate on percpu disk statistics:
  *
  * The __ variants should only be called in critical sections. The full
  * variants disable/enable preemption.
  */
-static inline struct hd_struct *get_part(struct gendisk *gendiskp,
-                                        sector_t sector)
+static inline struct hd_struct *disk_map_sector(struct gendisk *gendiskp,
+                                               sector_t sector)
 {
        struct hd_struct *part;
        int i;