Skip to contentSkip to conversation

um: Convert ubd driver to blk-mq

bug report Dan Carpenter 2 participants 2 messages Feb 22, 2019 User-mode Linux (UML)

lore
Share & tools
lore
#0 lore raw

Hello Richard Weinberger,

The patch 4e6da0fe8058: "um: Convert ubd driver to blk-mq" from Nov 26, 2017, leads to the following static checker warning:

	arch/um/drivers/ubd_kern.c:972 ubd_add()
	error: 'ubd_dev->queue' dereferencing possible ERR_PTR()

arch/um/drivers/ubd_kern.c

    911 static int ubd_add(int n, char **error_out)
    912 {
    913 	struct ubd *ubd_dev = &ubd_devs[n];
    914 	int err = 0;
    915 
    916 	if(ubd_dev->file == NULL)
    917 		goto out;
    918 
    919 	err = ubd_file_size(ubd_dev, &ubd_dev->size);
    920 	if(err < 0){
    921 		*error_out = "Couldn't determine size of device's file";
    922 		goto out;
    923 	}
    924 
    925 	ubd_dev->size = ROUND_BLOCK(ubd_dev->size);
    926 
    927 	ubd_dev->tag_set.ops = &ubd_mq_ops;
    928 	ubd_dev->tag_set.queue_depth = 64;
    929 	ubd_dev->tag_set.numa_node = NUMA_NO_NODE;
    930 	ubd_dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
    931 	ubd_dev->tag_set.driver_data = ubd_dev;
    932 	ubd_dev->tag_set.nr_hw_queues = 1;
    933 
    934 	err = blk_mq_alloc_tag_set(&ubd_dev->tag_set);
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We do want to clean up this allocation.

    935 	if (err)
    936 		goto out;
    937 
    938 	ubd_dev->queue = blk_mq_init_queue(&ubd_dev->tag_set);
    939 	if (IS_ERR(ubd_dev->queue)) {
    940 		err = PTR_ERR(ubd_dev->queue);
    941 		goto out_cleanup;
                        ^^^^^^^^^^^^^^^^

But this goto will Oops.

    942 	}
    943 
    944 	ubd_dev->queue->queuedata = ubd_dev;
    945 	blk_queue_write_cache(ubd_dev->queue, true, false);
    946 
    947 	blk_queue_max_segments(ubd_dev->queue, MAX_SG);
    948 	err = ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, &ubd_gendisk[n]);
    949 	if(err){
    950 		*error_out = "Failed to register device";
    951 		goto out_cleanup_tags;
    952 	}
    953 
    954 	if (fake_major != UBD_MAJOR)
    955 		ubd_disk_register(fake_major, ubd_dev->size, n,
    956 				  &fake_gendisk[n]);
    957 
    958 	/*
    959 	 * Perhaps this should also be under the "if (fake_major)" above
    960 	 * using the fake_disk->disk_name
    961 	 */
    962 	if (fake_ide)
    963 		make_ide_entries(ubd_gendisk[n]->disk_name);
    964 
    965 	err = 0;
    966 out:
    967 	return err;
    968 
    969 out_cleanup_tags:
    970 	blk_mq_free_tag_set(&ubd_dev->tag_set);
    971 out_cleanup:
--> 972 	blk_cleanup_queue(ubd_dev->queue);
                                  ^^^^^^^^^^^^^^

    973 	goto out;
    974 }

regards,
dan carpenter

_______________________________________________
linux-um mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-um

maintainer
#1 lore raw
Quoted 82 lines · Dan Carpenter

Hello Richard Weinberger,

The patch 4e6da0fe8058: "um: Convert ubd driver to blk-mq" from Nov 26, 2017, leads to the following static checker warning:

	arch/um/drivers/ubd_kern.c:972 ubd_add()
	error: 'ubd_dev->queue' dereferencing possible ERR_PTR()

arch/um/drivers/ubd_kern.c

     911 static int ubd_add(int n, char **error_out)
     912 {
     913 	struct ubd *ubd_dev = &ubd_devs[n];
     914 	int err = 0;
     915
     916 	if(ubd_dev->file == NULL)
     917 		goto out;
     918
     919 	err = ubd_file_size(ubd_dev, &ubd_dev->size);
     920 	if(err < 0){
     921 		*error_out = "Couldn't determine size of device's file";
     922 		goto out;
     923 	}
     924
     925 	ubd_dev->size = ROUND_BLOCK(ubd_dev->size);
     926
     927 	ubd_dev->tag_set.ops = &ubd_mq_ops;
     928 	ubd_dev->tag_set.queue_depth = 64;
     929 	ubd_dev->tag_set.numa_node = NUMA_NO_NODE;
     930 	ubd_dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
     931 	ubd_dev->tag_set.driver_data = ubd_dev;
     932 	ubd_dev->tag_set.nr_hw_queues = 1;
     933
     934 	err = blk_mq_alloc_tag_set(&ubd_dev->tag_set);
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We do want to clean up this allocation.

     935 	if (err)
     936 		goto out;
     937
     938 	ubd_dev->queue = blk_mq_init_queue(&ubd_dev->tag_set);
     939 	if (IS_ERR(ubd_dev->queue)) {
     940 		err = PTR_ERR(ubd_dev->queue);
     941 		goto out_cleanup;
                         ^^^^^^^^^^^^^^^^

But this goto will Oops.

     942 	}
     943
     944 	ubd_dev->queue->queuedata = ubd_dev;
     945 	blk_queue_write_cache(ubd_dev->queue, true, false);
     946
     947 	blk_queue_max_segments(ubd_dev->queue, MAX_SG);
     948 	err = ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, &ubd_gendisk[n]);
     949 	if(err){
     950 		*error_out = "Failed to register device";
     951 		goto out_cleanup_tags;
     952 	}
     953
     954 	if (fake_major != UBD_MAJOR)
     955 		ubd_disk_register(fake_major, ubd_dev->size, n,
     956 				  &fake_gendisk[n]);
     957
     958 	/*
     959 	 * Perhaps this should also be under the "if (fake_major)" above
     960 	 * using the fake_disk->disk_name
     961 	 */
     962 	if (fake_ide)
     963 		make_ide_entries(ubd_gendisk[n]->disk_name);
     964
     965 	err = 0;
     966 out:
     967 	return err;
     968
     969 out_cleanup_tags:
     970 	blk_mq_free_tag_set(&ubd_dev->tag_set);
     971 out_cleanup:
--> 972 	blk_cleanup_queue(ubd_dev->queue);
                                   ^^^^^^^^^^^^^^

     973 	goto out;
     974 }
Quoted 8 lines

regards,
dan carpenter

_______________________________________________
linux-um mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-um

Thanks Dan, will look into it today.

Signature · 9 lines
Anton R. Ivanov
Cambridgegreys Limited. Registered in England. Company Number 10273661
https://www.cambridgegreys.com/


_______________________________________________
linux-um mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-um