[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: