[Nbd] [bug report] nbd: add multi-connection support
Hello Josef Bacik,
The patch 9561a7ade0c2: "nbd: add multi-connection support" from Nov
22, 2016, leads to the following static checker warning:
drivers/block/nbd.c:810 __nbd_ioctl()
error: uninitialized symbol 'error'.
drivers/block/nbd.c
745 case NBD_DO_IT: {
746 struct recv_thread_args *args;
747 int num_connections = nbd->num_connections;
748 int error, i;
^^^^^
749
750 if (nbd->task_recv)
751 return -EBUSY;
752 if (!nbd->socks)
753 return -EINVAL;
754 if (num_connections > 1 &&
755 !(nbd->flags & NBD_FLAG_CAN_MULTI_CONN)) {
756 dev_err(disk_to_dev(nbd->disk), "server does not support multiple connections per device.\n");
757 goto out_err;
^^^^^^^^^^^^
758 }
759
760 set_bit(NBD_RUNNING, &nbd->runtime_flags);
761 blk_mq_update_nr_hw_queues(&nbd->tag_set, nbd->num_connections);
762 args = kcalloc(num_connections, sizeof(*args), GFP_KERNEL);
763 if (!args)
764 goto out_err;
^^^^^^^^^^^^
Assume we hit one of these gotos.
765 nbd->task_recv = current;
766 mutex_unlock(&nbd->config_lock);
767
768 nbd_parse_flags(nbd, bdev);
769
770 error = device_create_file(disk_to_dev(nbd->disk), &pid_attr);
771 if (error) {
772 dev_err(disk_to_dev(nbd->disk), "device_create_file failed!\n");
773 goto out_recv;
774 }
775
776 nbd_size_update(nbd, bdev);
777
778 nbd_dev_dbg_init(nbd);
779 for (i = 0; i < num_connections; i++) {
780 sk_set_memalloc(nbd->socks[i]->sock->sk);
781 atomic_inc(&nbd->recv_threads);
782 INIT_WORK(&args[i].work, recv_work);
783 args[i].nbd = nbd;
784 args[i].index = i;
785 queue_work(system_long_wq, &args[i].work);
786 }
787 wait_event_interruptible(nbd->recv_wq,
788 atomic_read(&nbd->recv_threads) == 0);
789 for (i = 0; i < num_connections; i++)
790 flush_work(&args[i].work);
791 nbd_dev_dbg_close(nbd);
792 nbd_size_clear(nbd, bdev);
793 device_remove_file(disk_to_dev(nbd->disk), &pid_attr);
794 out_recv:
795 mutex_lock(&nbd->config_lock);
796 nbd->task_recv = NULL;
797 out_err:
798 sock_shutdown(nbd);
799 nbd_clear_que(nbd);
800 kill_bdev(bdev);
801 nbd_bdev_reset(bdev);
802
803 /* user requested, ignore socket errors */
804 if (test_bit(NBD_DISCONNECT_REQUESTED, &nbd->runtime_flags))
805 error = 0;
806 if (test_bit(NBD_TIMEDOUT, &nbd->runtime_flags))
807 error = -ETIMEDOUT;
Do we know that we will hit this -ETIMEOUT?
808
809 nbd_reset(nbd);
810 return error;
811 }
812
813 case NBD_CLEAR_QUE:
814 /*
815 * This is for compatibility only. The queue is always cleared
816 * by NBD_DO_IT or NBD_CLEAR_SOCK.
817 */
818 return 0;
819
820 case NBD_PRINT_DEBUG:
821 /*
822 * For compatibility only, we no longer keep a list of
823 * outstanding requests.
824 */
825 return 0;
826 }
827 return -ENOTTY;
828 }
regards,
dan carpenter
Reply to: