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 | 826 | struct ubd *ubd_dev = dev_get_drvdata(dev); |
| 827 | 827 | |
| 828 | − blk_cleanup_queue(ubd_dev->queue); | |
| 829 | 828 | blk_mq_free_tag_set(&ubd_dev->tag_set); |
| 830 | 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 | 864 | NULL, |
| 866 | 865 | }; |
| 867 | 866 | |
| 868 | −static int ubd_disk_register(int major, u64 size, int unit, | |
| 869 | − struct gendisk **disk_out) | |
| 867 | +static void ubd_disk_register(int major, u64 size, int unit, | |
| 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 | 870 | disk->major = major; |
| 878 | 871 | disk->first_minor = unit << UBD_SHIFT; |
| 872 | + disk->minors = 1 << UBD_SHIFT; | |
| 879 | 873 | disk->fops = &ubd_blops; |
| 880 | 874 | set_capacity(disk, size / 512); |
| 881 | 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 | 883 | disk->private_data = &ubd_devs[unit]; |
| 890 | 884 | disk->queue = ubd_devs[unit].queue; |
| 891 | 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 | 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 | 894 | static int ubd_add(int n, char **error_out) |
| 904 | 895 | { |
| 905 | 896 | struct ubd *ubd_dev = &ubd_devs[n]; |
| 897 | + struct gendisk *disk; | |
| 906 | 898 | int err = 0; |
| 907 | 899 | |
| 908 | 900 | if(ubd_dev->file == NULL) |
| @@ -927,32 +919,24 @@ static int ubd_add(int n, char **error_out) · 18 unmodified lines | ||
| 927 | 919 | if (err) |
| 928 | 920 | goto out; |
| 929 | 921 | |
| 930 | − ubd_dev->queue = blk_mq_init_queue(&ubd_dev->tag_set); | |
| 931 | − if (IS_ERR(ubd_dev->queue)) { | |
| 932 | − err = PTR_ERR(ubd_dev->queue); | |
| 922 | + disk = blk_mq_alloc_disk(&ubd_dev->tag_set, ubd_dev); | |
| 923 | + if (IS_ERR(disk)) { | |
| 924 | + err = PTR_ERR(disk); | |
| 933 | 925 | goto out_cleanup_tags; |
| 934 | 926 | } |
| 927 | + ubd_dev->queue = disk->queue; | |
| 935 | 928 | |
| 936 | − ubd_dev->queue->queuedata = ubd_dev; | |
| 937 | 929 | blk_queue_write_cache(ubd_dev->queue, true, false); |
| 938 | − | |
| 939 | 930 | blk_queue_max_segments(ubd_dev->queue, MAX_SG); |
| 940 | 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]); | |
| 942 | − if(err){ | |
| 943 | − *error_out = "Failed to register device"; | |
| 944 | − goto out_cleanup_tags; | |
| 945 | − } | |
| 946 | − | |
| 947 | − err = 0; | |
| 948 | −out: | |
| 949 | − return err; | |
| 932 | + ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, disk); | |
| 933 | + ubd_gendisk[n] = disk; | |
| 934 | + return 0; | |
| 950 | 935 | |
| 951 | 936 | out_cleanup_tags: |
| 952 | 937 | blk_mq_free_tag_set(&ubd_dev->tag_set); |
| 953 | − if (!(IS_ERR(ubd_dev->queue))) | |
| 954 | − blk_cleanup_queue(ubd_dev->queue); | |
| 955 | − goto out; | |
| 938 | +out: | |
| 939 | + return err; | |
| 956 | 940 | } |
| 957 | 941 | |
| 958 | 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 | 1039 | ubd_gendisk[n] = NULL; |
| 1056 | 1040 | if(disk != NULL){ |
| 1057 | 1041 | del_gendisk(disk); |
| 1058 | − put_disk(disk); | |
| 1042 | + blk_cleanup_disk(disk); | |
| 1059 | 1043 | } |
| 1060 | 1044 | |
| 1061 | 1045 | err = 0; |