e->type->ops.sq.elevator_deactivate_req_fn(q, rq);
 }
 
+struct hd_struct *__disk_get_part(struct gendisk *disk, int partno);
+
 #ifdef CONFIG_FAIL_IO_TIMEOUT
 int blk_should_fake_timeout(struct request_queue *);
 ssize_t part_timeout_show(struct device *, struct device_attribute *, char *);
 
        }
 }
 
+struct hd_struct *__disk_get_part(struct gendisk *disk, int partno)
+{
+       struct disk_part_tbl *ptbl = rcu_dereference(disk->part_tbl);
+
+       if (unlikely(partno < 0 || partno >= ptbl->len))
+               return NULL;
+       return rcu_dereference(ptbl->part[partno]);
+}
+
 /**
  * disk_get_part - get partition
  * @disk: disk to look partition from
  */
 struct hd_struct *disk_get_part(struct gendisk *disk, int partno)
 {
-       struct hd_struct *part = NULL;
-       struct disk_part_tbl *ptbl;
-
-       if (unlikely(partno < 0))
-               return NULL;
+       struct hd_struct *part;
 
        rcu_read_lock();
-
-       ptbl = rcu_dereference(disk->part_tbl);
-       if (likely(partno < ptbl->len)) {
-               part = rcu_dereference(ptbl->part[partno]);
-               if (part)
-                       get_device(part_to_dev(part));
-       }
-
+       part = __disk_get_part(disk, partno);
+       if (part)
+               get_device(part_to_dev(part));
        rcu_read_unlock();
 
        return part;