return true;
 }
 
-static ssize_t integrity_attr_show(struct kobject *kobj, struct attribute *attr,
-                                  char *page)
-{
-       struct gendisk *disk = container_of(kobj, struct gendisk, integrity_kobj);
-       struct device *dev = disk_to_dev(disk);
-       struct device_attribute *dev_attr =
-               container_of(attr, struct device_attribute, attr);
-
-       return dev_attr->show(dev, dev_attr, page);
-}
-
-static ssize_t integrity_attr_store(struct kobject *kobj,
-                                   struct attribute *attr, const char *page,
-                                   size_t count)
-{
-       struct gendisk *disk = container_of(kobj, struct gendisk, integrity_kobj);
-       struct device *dev = disk_to_dev(disk);
-       struct device_attribute *dev_attr =
-               container_of(attr, struct device_attribute, attr);
-
-       if (!dev_attr->store)
-               return 0;
-       return dev_attr->store(dev, dev_attr, page, count);
-}
-
 static inline struct blk_integrity *dev_to_bi(struct device *dev)
 {
        return &dev_to_disk(dev)->queue->integrity;
        &dev_attr_device_is_integrity_capable.attr,
        NULL
 };
-ATTRIBUTE_GROUPS(integrity);
 
-static const struct sysfs_ops integrity_ops = {
-       .show   = &integrity_attr_show,
-       .store  = &integrity_attr_store,
-};
-
-static const struct kobj_type integrity_ktype = {
-       .default_groups = integrity_groups,
-       .sysfs_ops      = &integrity_ops,
+const struct attribute_group blk_integrity_attr_group = {
+       .name = "integrity",
+       .attrs = integrity_attrs,
 };
 
 static blk_status_t blk_integrity_nop_fn(struct blk_integrity_iter *iter)
        memset(bi, 0, sizeof(*bi));
 }
 EXPORT_SYMBOL(blk_integrity_unregister);
-
-int blk_integrity_add(struct gendisk *disk)
-{
-       int ret;
-
-       ret = kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype,
-                                  &disk_to_dev(disk)->kobj, "%s", "integrity");
-       if (!ret)
-               kobject_uevent(&disk->integrity_kobj, KOBJ_ADD);
-       return ret;
-}
-
-void blk_integrity_del(struct gendisk *disk)
-{
-       kobject_uevent(&disk->integrity_kobj, KOBJ_REMOVE);
-       kobject_del(&disk->integrity_kobj);
-       kobject_put(&disk->integrity_kobj);
-}
 
                                bip_next->bip_vec[0].bv_offset);
 }
 
-int blk_integrity_add(struct gendisk *disk);
-void blk_integrity_del(struct gendisk *);
+extern const struct attribute_group blk_integrity_attr_group;
 #else /* CONFIG_BLK_DEV_INTEGRITY */
 static inline bool blk_integrity_merge_rq(struct request_queue *rq,
                struct request *r1, struct request *r2)
 static inline void bio_integrity_free(struct bio *bio)
 {
 }
-static inline int blk_integrity_add(struct gendisk *disk)
-{
-       return 0;
-}
-static inline void blk_integrity_del(struct gendisk *disk)
-{
-}
 #endif /* CONFIG_BLK_DEV_INTEGRITY */
 
 unsigned long blk_rq_timeout(unsigned long timeout);
 
         */
        pm_runtime_set_memalloc_noio(ddev, true);
 
-       ret = blk_integrity_add(disk);
-       if (ret)
-               goto out_del_block_link;
-
        disk->part0->bd_holder_dir =
                kobject_create_and_add("holders", &ddev->kobj);
        if (!disk->part0->bd_holder_dir) {
                ret = -ENOMEM;
-               goto out_del_integrity;
+               goto out_del_block_link;
        }
        disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj);
        if (!disk->slave_dir) {
        disk->slave_dir = NULL;
 out_put_holder_dir:
        kobject_put(disk->part0->bd_holder_dir);
-out_del_integrity:
-       blk_integrity_del(disk);
 out_del_block_link:
        if (!sysfs_deprecated)
                sysfs_remove_link(block_depr, dev_name(ddev));
        if (WARN_ON_ONCE(!disk_live(disk) && !(disk->flags & GENHD_FL_HIDDEN)))
                return;
 
-       blk_integrity_del(disk);
        disk_del_events(disk);
 
        mutex_lock(&disk->open_mutex);
        &disk_attr_group,
 #ifdef CONFIG_BLK_DEV_IO_TRACE
        &blk_trace_attr_group,
+#endif
+#ifdef CONFIG_BLK_DEV_INTEGRITY
+       &blk_integrity_attr_group,
 #endif
        NULL
 };