Use blk_mq_alloc_disk and blk_cleanup_disk to simplify the gendisk and request_queue allocation.
Unified · Split
| @@ -825,7 +825,6 @@ static void ubd_device_release(struct device *dev) · 824 unmodified lines | |||
| 825 | { | 825 | { |
| 826 | struct ubd *ubd_dev = dev_get_drvdata(dev); | 826 | struct ubd *ubd_dev = dev_get_drvdata(dev); |
| 827 | 827 | ||
| 828 | blk_cleanup_queue(ubd_dev->queue); | ||
| 829 | blk_mq_free_tag_set(&ubd_dev->tag_set); | 828 | blk_mq_free_tag_set(&ubd_dev->tag_set); |
| 830 | *ubd_dev = ((struct ubd) DEFAULT_UBD); | 829 | *ubd_dev = ((struct ubd) DEFAULT_UBD); |
| 831 | } | 830 | } |
| @@ -865,17 +864,12 @@ static const struct attribute_group *ubd_attr_groups[] = { · 33 unmodified lines | |||
| 865 | NULL, | 864 | NULL, |
| 866 | }; | 865 | }; |
| 867 | 866 | ||
| 868 | static int ubd_disk_register(int major, u64 size, int unit, | 867 | static void ubd_disk_register(int major, u64 size, int unit, |
| 869 | struct gendisk **disk_out) | 868 | struct gendisk *disk) |
| 870 | { | 869 | { |
| 871 | struct gendisk *disk; | ||
| 872 | |||
| 873 | disk = alloc_disk(1 << UBD_SHIFT); | ||
| 874 | if(disk == NULL) | ||
| 875 | return -ENOMEM; | ||
| 876 | |||
| 877 | disk->major = major; | 870 | disk->major = major; |
| 878 | disk->first_minor = unit << UBD_SHIFT; | 871 | disk->first_minor = unit << UBD_SHIFT; |
| 872 | disk->minors = 1 << UBD_SHIFT; | ||
| 879 | disk->fops = &ubd_blops; | 873 | disk->fops = &ubd_blops; |
| 880 | set_capacity(disk, size / 512); | 874 | set_capacity(disk, size / 512); |
| 881 | sprintf(disk->disk_name, "ubd%c", 'a' + unit); | 875 | sprintf(disk->disk_name, "ubd%c", 'a' + unit); |
| @@ -889,9 +883,6 @@ static int ubd_disk_register(int major, u64 size, int unit, · 7 unmodified lines | |||
| 889 | disk->private_data = &ubd_devs[unit]; | 883 | disk->private_data = &ubd_devs[unit]; |
| 890 | disk->queue = ubd_devs[unit].queue; | 884 | disk->queue = ubd_devs[unit].queue; |
| 891 | device_add_disk(&ubd_devs[unit].pdev.dev, disk, ubd_attr_groups); | 885 | device_add_disk(&ubd_devs[unit].pdev.dev, disk, ubd_attr_groups); |
| 892 | |||
| 893 | *disk_out = disk; | ||
| 894 | return 0; | ||
| 895 | } | 886 | } |
| 896 | 887 | ||
| 897 | #define ROUND_BLOCK(n) ((n + (SECTOR_SIZE - 1)) & (-SECTOR_SIZE)) | 888 | #define ROUND_BLOCK(n) ((n + (SECTOR_SIZE - 1)) & (-SECTOR_SIZE)) |
| @@ -903,6 +894,7 @@ static const struct blk_mq_ops ubd_mq_ops = { · 5 unmodified lines | |||
| 903 | static int ubd_add(int n, char **error_out) | 894 | static int ubd_add(int n, char **error_out) |
| 904 | { | 895 | { |
| 905 | struct ubd *ubd_dev = &ubd_devs[n]; | 896 | struct ubd *ubd_dev = &ubd_devs[n]; |
| 897 | struct gendisk *disk; | ||
| 906 | int err = 0; | 898 | int err = 0; |
| 907 | 899 | ||
| 908 | if(ubd_dev->file == NULL) | 900 | if(ubd_dev->file == NULL) |
| @@ -927,32 +919,24 @@ static int ubd_add(int n, char **error_out) · 18 unmodified lines | |||
| 927 | if (err) | 919 | if (err) |
| 928 | goto out; | 920 | goto out; |
| 929 | 921 | ||
| 930 | ubd_dev->queue = blk_mq_init_queue(&ubd_dev->tag_set); | 922 | disk = blk_mq_alloc_disk(&ubd_dev->tag_set, ubd_dev); |
| 931 | if (IS_ERR(ubd_dev->queue)) { | 923 | if (IS_ERR(disk)) { |
| 932 | err = PTR_ERR(ubd_dev->queue); | 924 | err = PTR_ERR(disk); |
| 933 | goto out_cleanup_tags; | 925 | goto out_cleanup_tags; |
| 934 | } | 926 | } |
| 927 | ubd_dev->queue = disk->queue; | ||
| 935 | 928 | ||
| 936 | ubd_dev->queue->queuedata = ubd_dev; | ||
| 937 | blk_queue_write_cache(ubd_dev->queue, true, false); | 929 | blk_queue_write_cache(ubd_dev->queue, true, false); |
| 938 | |||
| 939 | blk_queue_max_segments(ubd_dev->queue, MAX_SG); | 930 | blk_queue_max_segments(ubd_dev->queue, MAX_SG); |
| 940 | blk_queue_segment_boundary(ubd_dev->queue, PAGE_SIZE - 1); | 931 | blk_queue_segment_boundary(ubd_dev->queue, PAGE_SIZE - 1); |
| 941 | err = ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, &ubd_gendisk[n]); | 932 | ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, disk); |
| 942 | if(err){ | 933 | ubd_gendisk[n] = disk; |
| 943 | *error_out = "Failed to register device"; | 934 | return 0; |
| 944 | goto out_cleanup_tags; | ||
| 945 | } | ||
| 946 | |||
| 947 | err = 0; | ||
| 948 | out: | ||
| 949 | return err; | ||
| 950 | 935 | ||
| 951 | out_cleanup_tags: | 936 | out_cleanup_tags: |
| 952 | blk_mq_free_tag_set(&ubd_dev->tag_set); | 937 | blk_mq_free_tag_set(&ubd_dev->tag_set); |
| 953 | if (!(IS_ERR(ubd_dev->queue))) | 938 | out: |
| 954 | blk_cleanup_queue(ubd_dev->queue); | 939 | return err; |
| 955 | goto out; | ||
| 956 | } | 940 | } |
| 957 | 941 | ||
| 958 | static int ubd_config(char *str, char **error_out) | 942 | static int ubd_config(char *str, char **error_out) |
| @@ -1055,7 +1039,7 @@ static int ubd_remove(int n, char **error_out) · 96 unmodified lines | |||
| 1055 | ubd_gendisk[n] = NULL; | 1039 | ubd_gendisk[n] = NULL; |
| 1056 | if(disk != NULL){ | 1040 | if(disk != NULL){ |
| 1057 | del_gendisk(disk); | 1041 | del_gendisk(disk); |
| 1058 | put_disk(disk); | 1042 | blk_cleanup_disk(disk); |
| 1059 | } | 1043 | } |
| 1060 | 1044 | ||
| 1061 | err = 0; | 1045 | err = 0; |