return -1;
 
                if (kobject_init_and_add(&bi->kobj, &integrity_ktype,
-                                        &disk->dev.kobj, "%s", "integrity")) {
+                                        &disk_to_dev(disk)->kobj,
+                                        "%s", "integrity")) {
                        kmem_cache_free(integrity_cachep, bi);
                        return -1;
                }
 
        kobject_uevent(&bi->kobj, KOBJ_REMOVE);
        kobject_del(&bi->kobj);
-       kobject_put(&disk->dev.kobj);
+       kobject_put(&disk_to_dev(disk)->kobj);
        kmem_cache_free(integrity_cachep, bi);
 }
 EXPORT_SYMBOL(blk_integrity_unregister);
 
        if (!q->request_fn)
                return 0;
 
-       ret = kobject_add(&q->kobj, kobject_get(&disk->dev.kobj),
+       ret = kobject_add(&q->kobj, kobject_get(&disk_to_dev(disk)->kobj),
                          "%s", "queue");
        if (ret < 0)
                return ret;
 
                kobject_uevent(&q->kobj, KOBJ_REMOVE);
                kobject_del(&q->kobj);
-               kobject_put(&disk->dev.kobj);
+               kobject_put(&disk_to_dev(disk)->kobj);
        }
 }
 
        rcu_read_lock();
        part = rcu_dereference(disk->__part[partno - 1]);
        if (part)
-               get_device(&part->dev);
+               get_device(part_to_dev(part));
        rcu_read_unlock();
 
        return part;
                if (!(piter->flags & DISK_PITER_INCL_EMPTY) && !part->nr_sects)
                        continue;
 
-               get_device(&part->dev);
+               get_device(part_to_dev(part));
                piter->part = part;
                piter->idx += inc;
                break;
 {
        struct gendisk *p = data;
 
-       return &p->dev.kobj;
+       return &disk_to_dev(p)->kobj;
 }
 
 static int exact_lock(dev_t devt, void *data)
        int retval;
 
        disk->flags |= GENHD_FL_UP;
-       disk->dev.devt = MKDEV(disk->major, disk->first_minor);
+       disk_to_dev(disk)->devt = MKDEV(disk->major, disk->first_minor);
        blk_register_region(disk_devt(disk), disk->minors, NULL,
                            exact_match, exact_lock, disk);
        register_disk(disk);
 
        bdi = &disk->queue->backing_dev_info;
        bdi_register_dev(bdi, disk_devt(disk));
-       retval = sysfs_create_link(&disk->dev.kobj, &bdi->dev->kobj, "bdi");
+       retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
+                                  "bdi");
        WARN_ON(retval);
 }
 
 
 void unlink_gendisk(struct gendisk *disk)
 {
-       sysfs_remove_link(&disk->dev.kobj, "bdi");
+       sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
        bdi_unregister(&disk->queue->backing_dev_info);
        blk_unregister_queue(disk);
        blk_unregister_region(disk_devt(disk), disk->minors);
        int cpu;
 
        /*
-       if (&gp->dev.kobj.entry == block_class.devices.next)
+       if (&disk_to_dev(gp)->kobj.entry == block_class.devices.next)
                seq_puts(seqf,  "major minor name"
                                "     rio rmerge rsect ruse wio wmerge "
                                "wsect wuse running use aveq"
         * set enviroment vars to indicate which event this is for
         * so that user space will know to go check the media status.
         */
-       kobject_uevent_env(&gd->dev.kobj, KOBJ_CHANGE, envp);
+       kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp);
        put_device(gd->driverfs_dev);
 }
 
                disk->minors = minors;
                disk->ext_minors = ext_minors;
                rand_initialize_disk(disk);
-               disk->dev.class = &block_class;
-               disk->dev.type = &disk_type;
-               device_initialize(&disk->dev);
+               disk_to_dev(disk)->class = &block_class;
+               disk_to_dev(disk)->type = &disk_type;
+               device_initialize(disk_to_dev(disk));
                INIT_WORK(&disk->async_notify,
                        media_change_notify_thread);
        }
        owner = disk->fops->owner;
        if (owner && !try_module_get(owner))
                return NULL;
-       kobj = kobject_get(&disk->dev.kobj);
+       kobj = kobject_get(&disk_to_dev(disk)->kobj);
        if (kobj == NULL) {
                module_put(owner);
                return NULL;
 void put_disk(struct gendisk *disk)
 {
        if (disk)
-               kobject_put(&disk->dev.kobj);
+               kobject_put(&disk_to_dev(disk)->kobj);
 }
 
 EXPORT_SYMBOL(put_disk);
 
 static int
 aoedisk_add_sysfs(struct aoedev *d)
 {
-       return sysfs_create_group(&d->gd->dev.kobj, &attr_group);
+       return sysfs_create_group(&disk_to_dev(d->gd)->kobj, &attr_group);
 }
 void
 aoedisk_rm_sysfs(struct aoedev *d)
 {
-       sysfs_remove_group(&d->gd->dev.kobj, &attr_group);
+       sysfs_remove_group(&disk_to_dev(d->gd)->kobj, &attr_group);
 }
 
 static int
 
        BUG_ON(lo->magic != LO_MAGIC);
 
        lo->pid = current->pid;
-       ret = sysfs_create_file(&lo->disk->dev.kobj, &pid_attr.attr);
+       ret = sysfs_create_file(&disk_to_dev(lo->disk)->kobj, &pid_attr.attr);
        if (ret) {
                printk(KERN_ERR "nbd: sysfs_create_file failed!");
                return ret;
        while ((req = nbd_read_stat(lo)) != NULL)
                nbd_end_request(req);
 
-       sysfs_remove_file(&lo->disk->dev.kobj, &pid_attr.attr);
+       sysfs_remove_file(&disk_to_dev(lo->disk)->kobj, &pid_attr.attr);
        return 0;
 }
 
 
 {
        struct gendisk *p = data;
        *part &= (1 << PARTN_BITS) - 1;
-       return &p->dev.kobj;
+       return &disk_to_dev(p)->kobj;
 }
 
 static int exact_lock(dev_t dev, void *data)
 
        list_splice_init(&md->uevent_list, &uevents);
        spin_unlock_irqrestore(&md->uevent_lock, flags);
 
-       dm_send_uevents(&uevents, &md->disk->dev.kobj);
+       dm_send_uevents(&uevents, &disk_to_dev(md->disk)->kobj);
 
        atomic_inc(&md->event_nr);
        wake_up(&md->eventq);
  *---------------------------------------------------------------*/
 void dm_kobject_uevent(struct mapped_device *md)
 {
-       kobject_uevent(&md->disk->dev.kobj, KOBJ_CHANGE);
+       kobject_uevent(&disk_to_dev(md->disk)->kobj, KOBJ_CHANGE);
 }
 
 uint32_t dm_next_uevent_seq(struct mapped_device *md)
 
                goto fail;
 
        if (rdev->bdev->bd_part)
-               ko = &rdev->bdev->bd_part->dev.kobj;
+               ko = &part_to_dev(rdev->bdev->bd_part)->kobj;
        else
-               ko = &rdev->bdev->bd_disk->dev.kobj;
+               ko = &disk_to_dev(rdev->bdev->bd_disk)->kobj;
        if ((err = sysfs_create_link(&rdev->kobj, ko, "block"))) {
                kobject_del(&rdev->kobj);
                goto fail;
        disk->queue = mddev->queue;
        add_disk(disk);
        mddev->gendisk = disk;
-       error = kobject_init_and_add(&mddev->kobj, &md_ktype, &disk->dev.kobj,
-                                    "%s", "md");
+       error = kobject_init_and_add(&mddev->kobj, &md_ktype,
+                                    &disk_to_dev(disk)->kobj, "%s", "md");
        mutex_unlock(&disks_mutex);
        if (error)
                printk(KERN_WARNING "md: cannot register %s/md - name in use\n",
        sysfs_notify(&mddev->kobj, NULL, "array_state");
        sysfs_notify(&mddev->kobj, NULL, "sync_action");
        sysfs_notify(&mddev->kobj, NULL, "degraded");
-       kobject_uevent(&mddev->gendisk->dev.kobj, KOBJ_CHANGE);
+       kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
        return 0;
 }
 
 
 static struct kobject *bdev_get_kobj(struct block_device *bdev)
 {
        if (bdev->bd_contains != bdev)
-               return kobject_get(&bdev->bd_part->dev.kobj);
+               return kobject_get(&part_to_dev(bdev->bd_part)->kobj);
        else
-               return kobject_get(&bdev->bd_disk->dev.kobj);
+               return kobject_get(&disk_to_dev(bdev->bd_disk)->kobj);
 }
 
 static struct kobject *bdev_get_holder(struct block_device *bdev)
 
 {
        struct kobject *k;
 
-       k = kobject_get(&disk->dev.kobj);
+       k = kobject_get(&disk_to_dev(disk)->kobj);
        disk->holder_dir = kobject_create_and_add("holders", k);
        disk->slave_dir = kobject_create_and_add("slaves", k);
        kobject_put(k);
        part->start_sect = 0;
        part->nr_sects = 0;
        part_stat_set_all(part, 0);
-       put_device(&part->dev);
+       put_device(part_to_dev(part));
 }
 
 void delete_partition(struct gendisk *disk, int partno)
        blk_free_devt(part_devt(part));
        rcu_assign_pointer(disk->__part[partno-1], NULL);
        kobject_put(part->holder_dir);
-       device_del(&part->dev);
+       device_del(part_to_dev(part));
 
        call_rcu(&part->rcu_head, delete_partition_rcu_cb);
 }
 {
        struct hd_struct *p;
        dev_t devt = MKDEV(0, 0);
+       struct device *ddev = disk_to_dev(disk);
+       struct device *pdev;
+       const char *dname;
        int err;
 
        if (disk->__part[partno - 1])
                err = -ENOMEM;
                goto out_free;
        }
+       pdev = part_to_dev(p);
+
        p->start_sect = start;
        p->nr_sects = len;
        p->partno = partno;
        p->policy = disk->policy;
 
-       if (isdigit(disk->dev.bus_id[strlen(disk->dev.bus_id)-1]))
-               snprintf(p->dev.bus_id, BUS_ID_SIZE,
-               "%sp%d", disk->dev.bus_id, partno);
+       dname = dev_name(ddev);
+       if (isdigit(dname[strlen(dname) - 1]))
+               snprintf(pdev->bus_id, BUS_ID_SIZE, "%sp%d", dname, partno);
        else
-               snprintf(p->dev.bus_id, BUS_ID_SIZE,
-                        "%s%d", disk->dev.bus_id, partno);
+               snprintf(pdev->bus_id, BUS_ID_SIZE, "%s%d", dname, partno);
 
-       device_initialize(&p->dev);
-       p->dev.class = &block_class;
-       p->dev.type = &part_type;
-       p->dev.parent = &disk->dev;
+       device_initialize(pdev);
+       pdev->class = &block_class;
+       pdev->type = &part_type;
+       pdev->parent = ddev;
 
        err = blk_alloc_devt(p, &devt);
        if (err)
-               goto out_put;
-       p->dev.devt = devt;
+               goto out_free;
+       pdev->devt = devt;
 
        /* delay uevent until 'holders' subdir is created */
-       p->dev.uevent_suppress = 1;
-       err = device_add(&p->dev);
+       pdev->uevent_suppress = 1;
+       err = device_add(pdev);
        if (err)
                goto out_put;
 
        err = -ENOMEM;
-       p->holder_dir = kobject_create_and_add("holders", &p->dev.kobj);
+       p->holder_dir = kobject_create_and_add("holders", &pdev->kobj);
        if (!p->holder_dir)
                goto out_del;
 
-       p->dev.uevent_suppress = 0;
+       pdev->uevent_suppress = 0;
        if (flags & ADDPART_FLAG_WHOLEDISK) {
-               err = device_create_file(&p->dev, &dev_attr_whole_disk);
+               err = device_create_file(pdev, &dev_attr_whole_disk);
                if (err)
                        goto out_del;
        }
        rcu_assign_pointer(disk->__part[partno - 1], p);
 
        /* suppress uevent if the disk supresses it */
-       if (!disk->dev.uevent_suppress)
-               kobject_uevent(&p->dev.kobj, KOBJ_ADD);
+       if (!ddev->uevent_suppress)
+               kobject_uevent(&pdev->kobj, KOBJ_ADD);
 
        return 0;
 
        return err;
 out_del:
        kobject_put(p->holder_dir);
-       device_del(&p->dev);
+       device_del(pdev);
 out_put:
-       put_device(&p->dev);
+       put_device(pdev);
        blk_free_devt(devt);
        return err;
 }
 /* Not exported, helper to add_disk(). */
 void register_disk(struct gendisk *disk)
 {
+       struct device *ddev = disk_to_dev(disk);
        struct block_device *bdev;
        struct disk_part_iter piter;
        struct hd_struct *part;
        char *s;
        int err;
 
-       disk->dev.parent = disk->driverfs_dev;
+       ddev->parent = disk->driverfs_dev;
 
-       strlcpy(disk->dev.bus_id, disk->disk_name, BUS_ID_SIZE);
+       strlcpy(ddev->bus_id, disk->disk_name, BUS_ID_SIZE);
        /* ewww... some of these buggers have / in the name... */
-       s = strchr(disk->dev.bus_id, '/');
+       s = strchr(ddev->bus_id, '/');
        if (s)
                *s = '!';
 
        /* delay uevents, until we scanned partition table */
-       disk->dev.uevent_suppress = 1;
+       ddev->uevent_suppress = 1;
 
-       if (device_add(&disk->dev))
+       if (device_add(ddev))
                return;
 #ifndef CONFIG_SYSFS_DEPRECATED
-       err = sysfs_create_link(block_depr, &disk->dev.kobj,
-                               kobject_name(&disk->dev.kobj));
+       err = sysfs_create_link(block_depr, &ddev->kobj,
+                               kobject_name(&ddev->kobj));
        if (err) {
-               device_del(&disk->dev);
+               device_del(ddev);
                return;
        }
 #endif
 
 exit:
        /* announce disk after possible partitions are created */
-       disk->dev.uevent_suppress = 0;
-       kobject_uevent(&disk->dev.kobj, KOBJ_ADD);
+       ddev->uevent_suppress = 0;
+       kobject_uevent(&ddev->kobj, KOBJ_ADD);
 
        /* announce possible partitions */
        disk_part_iter_init(&piter, disk, 0);
        while ((part = disk_part_iter_next(&piter)))
-               kobject_uevent(&part->dev.kobj, KOBJ_ADD);
+               kobject_uevent(&part_to_dev(part)->kobj, KOBJ_ADD);
        disk_part_iter_exit(&piter);
 }
 
                return -EIO;
 
        /* tell userspace that the media / partition table may have changed */
-       kobject_uevent(&disk->dev.kobj, KOBJ_CHANGE);
+       kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
 
        for (p = 1; p < state->limit; p++) {
                sector_t size = state->parts[p].size;
        kobject_put(disk->slave_dir);
        disk->driverfs_dev = NULL;
 #ifndef CONFIG_SYSFS_DEPRECATED
-       sysfs_remove_link(block_depr, disk->dev.bus_id);
+       sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
 #endif
-       device_del(&disk->dev);
+       device_del(disk_to_dev(disk));
 }
 
 
 #ifdef CONFIG_BLOCK
 
-#define kobj_to_dev(k) container_of(k, struct device, kobj)
-#define dev_to_disk(device) container_of(device, struct gendisk, dev)
-#define dev_to_part(device) container_of(device, struct hd_struct, dev)
+#define kobj_to_dev(k)         container_of((k), struct device, kobj)
+#define dev_to_disk(device)    container_of((device), struct gendisk, __dev)
+#define dev_to_part(device)    container_of((device), struct hd_struct, __dev)
+#define disk_to_dev(disk)      (&((disk)->__dev))
+#define part_to_dev(part)      (&((part)->__dev))
 
 extern struct device_type part_type;
 extern struct kobject *block_depr;
 struct hd_struct {
        sector_t start_sect;
        sector_t nr_sects;
-       struct device dev;
+       struct device __dev;
        struct kobject *holder_dir;
        int policy, partno;
 #ifdef CONFIG_FAIL_MAKE_REQUEST
 
        int flags;
        struct device *driverfs_dev;  // FIXME: remove
-       struct device dev;
+       struct device __dev;
        struct kobject *holder_dir;
        struct kobject *slave_dir;
 
 static inline struct gendisk *part_to_disk(struct hd_struct *part)
 {
        if (likely(part))
-               return dev_to_disk((part)->dev.parent);
+               return dev_to_disk(part_to_dev(part)->parent);
        return NULL;
 }
 
 
 static inline dev_t disk_devt(struct gendisk *disk)
 {
-       return disk->dev.devt;
+       return disk_to_dev(disk)->devt;
 }
 
 static inline dev_t part_devt(struct hd_struct *part)
 {
-       return part->dev.devt;
+       return part_to_dev(part)->devt;
 }
 
 extern struct hd_struct *disk_get_part(struct gendisk *disk, int partno);
 static inline void disk_put_part(struct hd_struct *part)
 {
        if (likely(part))
-               put_device(&part->dev);
+               put_device(part_to_dev(part));
 }
 
 /*