Lines Matching refs:nbd

70 	struct nbd_device *nbd;  member
149 struct nbd_device *nbd; member
163 #define nbd_name(nbd) ((nbd)->disk->disk_name) argument
172 static int nbd_dev_dbg_init(struct nbd_device *nbd);
173 static void nbd_dev_dbg_close(struct nbd_device *nbd);
174 static void nbd_config_put(struct nbd_device *nbd);
178 static void nbd_disconnect_and_put(struct nbd_device *nbd);
180 static inline struct device *nbd_to_dev(struct nbd_device *nbd) in nbd_to_dev() argument
182 return disk_to_dev(nbd->disk); in nbd_to_dev()
241 struct nbd_device *nbd = disk->private_data; in pid_show() local
243 return sprintf(buf, "%d\n", nbd->pid); in pid_show()
255 struct nbd_device *nbd = disk->private_data; in backend_show() local
257 return sprintf(buf, "%s\n", nbd->backend ?: ""); in backend_show()
265 static void nbd_dev_remove(struct nbd_device *nbd) in nbd_dev_remove() argument
267 struct gendisk *disk = nbd->disk; in nbd_dev_remove()
270 blk_mq_free_tag_set(&nbd->tag_set); in nbd_dev_remove()
277 idr_remove(&nbd_index_idr, nbd->index); in nbd_dev_remove()
279 destroy_workqueue(nbd->recv_workq); in nbd_dev_remove()
288 static void nbd_put(struct nbd_device *nbd) in nbd_put() argument
290 if (!refcount_dec_and_test(&nbd->refs)) in nbd_put()
294 if (test_bit(NBD_DESTROY_ON_DISCONNECT, &nbd->flags)) in nbd_put()
295 queue_work(nbd_del_wq, &nbd->remove_work); in nbd_put()
297 nbd_dev_remove(nbd); in nbd_put()
306 static void nbd_mark_nsock_dead(struct nbd_device *nbd, struct nbd_sock *nsock, in nbd_mark_nsock_dead() argument
309 if (!nsock->dead && notify && !nbd_disconnected(nbd->config)) { in nbd_mark_nsock_dead()
314 args->index = nbd->index; in nbd_mark_nsock_dead()
320 if (atomic_dec_return(&nbd->config->live_connections) == 0) { in nbd_mark_nsock_dead()
322 &nbd->config->runtime_flags)) { in nbd_mark_nsock_dead()
324 &nbd->config->runtime_flags); in nbd_mark_nsock_dead()
325 dev_info(nbd_to_dev(nbd), in nbd_mark_nsock_dead()
355 static int nbd_set_size(struct nbd_device *nbd, loff_t bytesize, loff_t blksize) in nbd_set_size() argument
369 nbd->config->bytesize = bytesize; in nbd_set_size()
370 nbd->config->blksize_bits = __ffs(blksize); in nbd_set_size()
372 if (!nbd->pid) in nbd_set_size()
375 lim = queue_limits_start_update(nbd->disk->queue); in nbd_set_size()
376 nbd_apply_limits(&lim, nbd->config->flags); in nbd_set_size()
380 if (!get_capacity(nbd->disk) && !blk_queue_write_cache(nbd->disk->queue)) in nbd_set_size()
381 error = queue_limits_commit_update(nbd->disk->queue, &lim); in nbd_set_size()
383 error = queue_limits_commit_update_frozen(nbd->disk->queue, &lim); in nbd_set_size()
388 set_bit(GD_NEED_PART_SCAN, &nbd->disk->state); in nbd_set_size()
389 if (!set_capacity_and_notify(nbd->disk, bytesize >> 9)) in nbd_set_size()
390 kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); in nbd_set_size()
398 dev_dbg(nbd_to_dev(cmd->nbd), "request %p: %s\n", req, in nbd_complete_rq()
407 static void sock_shutdown(struct nbd_device *nbd) in sock_shutdown() argument
409 struct nbd_config *config = nbd->config; in sock_shutdown()
420 nbd_mark_nsock_dead(nbd, nsock, 0); in sock_shutdown()
423 dev_warn(disk_to_dev(nbd->disk), "shutting down sockets\n"); in sock_shutdown()
444 static struct nbd_config *nbd_get_config_unlocked(struct nbd_device *nbd) in nbd_get_config_unlocked() argument
446 if (refcount_inc_not_zero(&nbd->config_refs)) { in nbd_get_config_unlocked()
454 return nbd->config; in nbd_get_config_unlocked()
463 struct nbd_device *nbd = cmd->nbd; in nbd_xmit_timeout() local
480 config = nbd_get_config_unlocked(nbd); in nbd_xmit_timeout()
489 (config->num_connections == 1 && nbd->tag_set.timeout)) { in nbd_xmit_timeout()
490 dev_err_ratelimited(nbd_to_dev(nbd), in nbd_xmit_timeout()
512 nbd_mark_nsock_dead(nbd, nsock, 1); in nbd_xmit_timeout()
517 nbd_config_put(nbd); in nbd_xmit_timeout()
522 if (!nbd->tag_set.timeout) { in nbd_xmit_timeout()
529 …dev_info(nbd_to_dev(nbd), "Possible stuck request %p: control (%s@%llu,%uB). Runtime %u seconds\n", in nbd_xmit_timeout()
539 nbd_config_put(nbd); in nbd_xmit_timeout()
544 nbd_config_put(nbd); in nbd_xmit_timeout()
548 dev_err_ratelimited(nbd_to_dev(nbd), "Connection timed out\n"); in nbd_xmit_timeout()
553 sock_shutdown(nbd); in nbd_xmit_timeout()
554 nbd_config_put(nbd); in nbd_xmit_timeout()
560 static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send, in __sock_xmit() argument
568 dev_err_ratelimited(disk_to_dev(nbd->disk), in __sock_xmit()
608 static int sock_xmit(struct nbd_device *nbd, int index, int send, in sock_xmit() argument
611 struct nbd_config *config = nbd->config; in sock_xmit()
614 return __sock_xmit(nbd, sock, send, iter, msg_flags, sent); in sock_xmit()
634 static void nbd_sched_pending_work(struct nbd_device *nbd, in nbd_sched_pending_work() argument
646 refcount_inc(&nbd->config_refs); in nbd_sched_pending_work()
654 static blk_status_t nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, in nbd_send_cmd() argument
658 struct nbd_config *config = nbd->config; in nbd_send_cmd()
681 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_send_cmd()
719 trace_nbd_send_request(&request, nbd->index, blk_mq_rq_from_pdu(cmd)); in nbd_send_cmd()
721 dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n", in nbd_send_cmd()
724 result = sock_xmit(nbd, index, 1, &from, in nbd_send_cmd()
735 nbd_sched_pending_work(nbd, nsock, cmd, sent); in nbd_send_cmd()
741 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_send_cmd()
759 dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n", in nbd_send_cmd()
770 result = sock_xmit(nbd, index, 1, &from, flags, &sent); in nbd_send_cmd()
773 nbd_sched_pending_work(nbd, nsock, cmd, sent); in nbd_send_cmd()
776 dev_err(disk_to_dev(nbd->disk), in nbd_send_cmd()
809 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_send_cmd()
811 nbd_mark_nsock_dead(nbd, nsock, 1); in nbd_send_cmd()
822 struct nbd_device *nbd = cmd->nbd; in nbd_pending_cmd_work() local
834 nbd_send_cmd(nbd, cmd, cmd->index); in nbd_pending_cmd_work()
851 nbd_config_put(nbd); in nbd_pending_cmd_work()
854 static int nbd_read_reply(struct nbd_device *nbd, struct socket *sock, in nbd_read_reply() argument
863 result = __sock_xmit(nbd, sock, 0, &to, MSG_WAITALL, NULL); in nbd_read_reply()
865 if (!nbd_disconnected(nbd->config)) in nbd_read_reply()
866 dev_err(disk_to_dev(nbd->disk), in nbd_read_reply()
872 dev_err(disk_to_dev(nbd->disk), "Wrong magic (0x%lx)\n", in nbd_read_reply()
881 static struct nbd_cmd *nbd_handle_reply(struct nbd_device *nbd, int index, in nbd_handle_reply() argument
895 if (hwq < nbd->tag_set.nr_hw_queues) in nbd_handle_reply()
896 req = blk_mq_tag_to_rq(nbd->tag_set.tags[hwq], in nbd_handle_reply()
899 dev_err(disk_to_dev(nbd->disk), "Unexpected reply (%d) %p\n", in nbd_handle_reply()
908 dev_err(disk_to_dev(nbd->disk), "Suspicious reply %d (status %u flags %lu)", in nbd_handle_reply()
914 dev_err(disk_to_dev(nbd->disk), "Unexpected reply %d from different sock %d (expected %d)", in nbd_handle_reply()
920 dev_err(disk_to_dev(nbd->disk), "Double reply on req %p, cmd_cookie %u, handle cookie %u\n", in nbd_handle_reply()
926 dev_err(disk_to_dev(nbd->disk), "Command already handled %p\n", in nbd_handle_reply()
932 dev_err(disk_to_dev(nbd->disk), "Raced with timeout on req %p\n", in nbd_handle_reply()
938 dev_err(disk_to_dev(nbd->disk), "Other side returned error (%d)\n", in nbd_handle_reply()
944 dev_dbg(nbd_to_dev(nbd), "request %p: got reply\n", req); in nbd_handle_reply()
952 result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL); in nbd_handle_reply()
954 dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", in nbd_handle_reply()
962 if (nbd_disconnected(nbd->config)) { in nbd_handle_reply()
969 dev_dbg(nbd_to_dev(nbd), "request %p: got %d bytes data\n", in nbd_handle_reply()
984 struct nbd_device *nbd = args->nbd; in recv_work() local
985 struct nbd_config *config = nbd->config; in recv_work()
986 struct request_queue *q = nbd->disk->queue; in recv_work()
994 if (nbd_read_reply(nbd, nsock->sock, &reply)) in recv_work()
1004 dev_err(disk_to_dev(nbd->disk), "%s: no io inflight\n", in recv_work()
1009 cmd = nbd_handle_reply(nbd, args->index, &reply); in recv_work()
1030 nbd_mark_nsock_dead(nbd, nsock, 1); in recv_work()
1035 nbd_config_put(nbd); in recv_work()
1059 static void nbd_clear_que(struct nbd_device *nbd) in nbd_clear_que() argument
1061 blk_mq_quiesce_queue(nbd->disk->queue); in nbd_clear_que()
1062 blk_mq_tagset_busy_iter(&nbd->tag_set, nbd_clear_req, NULL); in nbd_clear_que()
1063 blk_mq_unquiesce_queue(nbd->disk->queue); in nbd_clear_que()
1064 dev_dbg(disk_to_dev(nbd->disk), "queue cleared\n"); in nbd_clear_que()
1067 static int find_fallback(struct nbd_device *nbd, int index) in find_fallback() argument
1069 struct nbd_config *config = nbd->config; in find_fallback()
1096 dev_err_ratelimited(disk_to_dev(nbd->disk), in find_fallback()
1101 static int wait_for_reconnect(struct nbd_device *nbd) in wait_for_reconnect() argument
1103 struct nbd_config *config = nbd->config; in wait_for_reconnect()
1120 struct nbd_device *nbd = cmd->nbd; in nbd_handle_cmd() local
1127 config = nbd_get_config_unlocked(nbd); in nbd_handle_cmd()
1129 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_handle_cmd()
1135 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_handle_cmd()
1137 nbd_config_put(nbd); in nbd_handle_cmd()
1146 index = find_fallback(nbd, index); in nbd_handle_cmd()
1149 if (wait_for_reconnect(nbd)) { in nbd_handle_cmd()
1159 sock_shutdown(nbd); in nbd_handle_cmd()
1160 nbd_config_put(nbd); in nbd_handle_cmd()
1177 ret = nbd_send_cmd(nbd, cmd, index); in nbd_handle_cmd()
1180 nbd_config_put(nbd); in nbd_handle_cmd()
1213 static struct socket *nbd_get_socket(struct nbd_device *nbd, unsigned long fd, in nbd_get_socket() argument
1225 dev_err(disk_to_dev(nbd->disk), "Unsupported socket: should be TCP or UNIX.\n"); in nbd_get_socket()
1232 dev_err(disk_to_dev(nbd->disk), "Unsupported socket: shutdown callout must be supported.\n"); in nbd_get_socket()
1277 static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg, in nbd_add_socket() argument
1280 struct nbd_config *config = nbd->config; in nbd_add_socket()
1290 if (nbd->pid) { in nbd_add_socket()
1291 dev_err(disk_to_dev(nbd->disk), in nbd_add_socket()
1296 sock = nbd_get_socket(nbd, arg, &err); in nbd_add_socket()
1301 if (!netlink && !nbd->task_setup && in nbd_add_socket()
1303 nbd->task_setup = current; in nbd_add_socket()
1306 (nbd->task_setup != current || in nbd_add_socket()
1308 dev_err(disk_to_dev(nbd->disk), in nbd_add_socket()
1348 static int nbd_genl_reconnect_sock_cb(struct nbd_device *nbd, unsigned long arg) in nbd_genl_reconnect_sock_cb() argument
1350 struct nbd_config *config = nbd->config; in nbd_genl_reconnect_sock_cb()
1356 sock = nbd_get_socket(nbd, arg, &err); in nbd_genl_reconnect_sock_cb()
1378 if (nbd->tag_set.timeout) in nbd_genl_reconnect_sock_cb()
1379 sock->sk->sk_sndtimeo = nbd->tag_set.timeout; in nbd_genl_reconnect_sock_cb()
1381 refcount_inc(&nbd->config_refs); in nbd_genl_reconnect_sock_cb()
1388 args->nbd = nbd; in nbd_genl_reconnect_sock_cb()
1399 queue_work(nbd->recv_workq, &args->work); in nbd_genl_reconnect_sock_cb()
1403 dev_info(nbd_to_dev(nbd), "reconnected socket\n"); in nbd_genl_reconnect_sock_cb()
1411 static void nbd_bdev_reset(struct nbd_device *nbd) in nbd_bdev_reset() argument
1413 if (disk_openers(nbd->disk) > 1) in nbd_bdev_reset()
1415 set_capacity(nbd->disk, 0); in nbd_bdev_reset()
1418 static void nbd_parse_flags(struct nbd_device *nbd) in nbd_parse_flags() argument
1420 if (nbd->config->flags & NBD_FLAG_READ_ONLY) in nbd_parse_flags()
1421 set_disk_ro(nbd->disk, true); in nbd_parse_flags()
1423 set_disk_ro(nbd->disk, false); in nbd_parse_flags()
1426 static void send_disconnects(struct nbd_device *nbd) in send_disconnects() argument
1428 struct nbd_config *config = nbd->config; in send_disconnects()
1442 ret = sock_xmit(nbd, i, 1, &from, 0, NULL); in send_disconnects()
1444 dev_err(disk_to_dev(nbd->disk), in send_disconnects()
1450 static int nbd_disconnect(struct nbd_device *nbd) in nbd_disconnect() argument
1452 struct nbd_config *config = nbd->config; in nbd_disconnect()
1454 dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); in nbd_disconnect()
1456 set_bit(NBD_DISCONNECT_REQUESTED, &nbd->flags); in nbd_disconnect()
1457 send_disconnects(nbd); in nbd_disconnect()
1461 static void nbd_clear_sock(struct nbd_device *nbd) in nbd_clear_sock() argument
1463 sock_shutdown(nbd); in nbd_clear_sock()
1464 nbd_clear_que(nbd); in nbd_clear_sock()
1465 nbd->task_setup = NULL; in nbd_clear_sock()
1468 static void nbd_config_put(struct nbd_device *nbd) in nbd_config_put() argument
1470 if (refcount_dec_and_mutex_lock(&nbd->config_refs, in nbd_config_put()
1471 &nbd->config_lock)) { in nbd_config_put()
1472 struct nbd_config *config = nbd->config; in nbd_config_put()
1474 nbd_dev_dbg_close(nbd); in nbd_config_put()
1475 invalidate_disk(nbd->disk); in nbd_config_put()
1477 lim = queue_limits_start_update(nbd->disk->queue); in nbd_config_put()
1479 queue_limits_commit_update(nbd->disk->queue, &lim); in nbd_config_put()
1480 if (nbd->config->bytesize) in nbd_config_put()
1481 kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); in nbd_config_put()
1484 device_remove_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_config_put()
1485 nbd->pid = 0; in nbd_config_put()
1488 device_remove_file(disk_to_dev(nbd->disk), &backend_attr); in nbd_config_put()
1489 kfree(nbd->backend); in nbd_config_put()
1490 nbd->backend = NULL; in nbd_config_put()
1492 nbd_clear_sock(nbd); in nbd_config_put()
1501 kfree(nbd->config); in nbd_config_put()
1502 nbd->config = NULL; in nbd_config_put()
1504 nbd->tag_set.timeout = 0; in nbd_config_put()
1506 mutex_unlock(&nbd->config_lock); in nbd_config_put()
1507 nbd_put(nbd); in nbd_config_put()
1512 static int nbd_start_device(struct nbd_device *nbd) in nbd_start_device() argument
1514 struct nbd_config *config = nbd->config; in nbd_start_device()
1518 if (nbd->pid) in nbd_start_device()
1524 dev_err(disk_to_dev(nbd->disk), "server does not support multiple connections per device.\n"); in nbd_start_device()
1529 mutex_unlock(&nbd->config_lock); in nbd_start_device()
1530 blk_mq_update_nr_hw_queues(&nbd->tag_set, num_connections); in nbd_start_device()
1531 mutex_lock(&nbd->config_lock); in nbd_start_device()
1539 nbd->pid = task_pid_nr(current); in nbd_start_device()
1541 nbd_parse_flags(nbd); in nbd_start_device()
1543 error = device_create_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_start_device()
1545 dev_err(disk_to_dev(nbd->disk), "device_create_file failed for pid!\n"); in nbd_start_device()
1550 nbd_dev_dbg_init(nbd); in nbd_start_device()
1556 sock_shutdown(nbd); in nbd_start_device()
1566 flush_workqueue(nbd->recv_workq); in nbd_start_device()
1570 if (nbd->tag_set.timeout) in nbd_start_device()
1572 nbd->tag_set.timeout; in nbd_start_device()
1574 refcount_inc(&nbd->config_refs); in nbd_start_device()
1576 args->nbd = nbd; in nbd_start_device()
1579 queue_work(nbd->recv_workq, &args->work); in nbd_start_device()
1581 return nbd_set_size(nbd, config->bytesize, nbd_blksize(config)); in nbd_start_device()
1584 static int nbd_start_device_ioctl(struct nbd_device *nbd) in nbd_start_device_ioctl() argument
1586 struct nbd_config *config = nbd->config; in nbd_start_device_ioctl()
1589 ret = nbd_start_device(nbd); in nbd_start_device_ioctl()
1594 set_bit(GD_NEED_PART_SCAN, &nbd->disk->state); in nbd_start_device_ioctl()
1595 mutex_unlock(&nbd->config_lock); in nbd_start_device_ioctl()
1599 sock_shutdown(nbd); in nbd_start_device_ioctl()
1600 nbd_clear_que(nbd); in nbd_start_device_ioctl()
1603 flush_workqueue(nbd->recv_workq); in nbd_start_device_ioctl()
1604 mutex_lock(&nbd->config_lock); in nbd_start_device_ioctl()
1605 nbd_bdev_reset(nbd); in nbd_start_device_ioctl()
1614 static void nbd_clear_sock_ioctl(struct nbd_device *nbd) in nbd_clear_sock_ioctl() argument
1616 nbd_clear_sock(nbd); in nbd_clear_sock_ioctl()
1617 disk_force_media_change(nbd->disk); in nbd_clear_sock_ioctl()
1618 nbd_bdev_reset(nbd); in nbd_clear_sock_ioctl()
1620 &nbd->config->runtime_flags)) in nbd_clear_sock_ioctl()
1621 nbd_config_put(nbd); in nbd_clear_sock_ioctl()
1624 static void nbd_set_cmd_timeout(struct nbd_device *nbd, u64 timeout) in nbd_set_cmd_timeout() argument
1626 nbd->tag_set.timeout = timeout * HZ; in nbd_set_cmd_timeout()
1628 blk_queue_rq_timeout(nbd->disk->queue, timeout * HZ); in nbd_set_cmd_timeout()
1630 blk_queue_rq_timeout(nbd->disk->queue, 30 * HZ); in nbd_set_cmd_timeout()
1634 static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, in __nbd_ioctl() argument
1637 struct nbd_config *config = nbd->config; in __nbd_ioctl()
1642 return nbd_disconnect(nbd); in __nbd_ioctl()
1644 nbd_clear_sock_ioctl(nbd); in __nbd_ioctl()
1647 return nbd_add_socket(nbd, arg, false); in __nbd_ioctl()
1649 return nbd_set_size(nbd, config->bytesize, arg); in __nbd_ioctl()
1651 return nbd_set_size(nbd, arg, nbd_blksize(config)); in __nbd_ioctl()
1655 return nbd_set_size(nbd, bytesize, nbd_blksize(config)); in __nbd_ioctl()
1657 nbd_set_cmd_timeout(nbd, arg); in __nbd_ioctl()
1664 return nbd_start_device_ioctl(nbd); in __nbd_ioctl()
1684 struct nbd_device *nbd = bdev->bd_disk->private_data; in nbd_ioctl() local
1685 struct nbd_config *config = nbd->config; in nbd_ioctl()
1697 mutex_lock(&nbd->config_lock); in nbd_ioctl()
1704 error = __nbd_ioctl(bdev, nbd, cmd, arg); in nbd_ioctl()
1706 dev_err(nbd_to_dev(nbd), "Cannot use ioctl interface on a netlink controlled device.\n"); in nbd_ioctl()
1707 mutex_unlock(&nbd->config_lock); in nbd_ioctl()
1711 static int nbd_alloc_and_init_config(struct nbd_device *nbd) in nbd_alloc_and_init_config() argument
1715 if (WARN_ON(nbd->config)) in nbd_alloc_and_init_config()
1733 nbd->config = config; in nbd_alloc_and_init_config()
1741 refcount_set(&nbd->config_refs, 1); in nbd_alloc_and_init_config()
1748 struct nbd_device *nbd; in nbd_open() local
1753 nbd = disk->private_data; in nbd_open()
1754 if (!nbd) { in nbd_open()
1758 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_open()
1763 config = nbd_get_config_unlocked(nbd); in nbd_open()
1765 mutex_lock(&nbd->config_lock); in nbd_open()
1766 if (refcount_inc_not_zero(&nbd->config_refs)) { in nbd_open()
1767 mutex_unlock(&nbd->config_lock); in nbd_open()
1770 ret = nbd_alloc_and_init_config(nbd); in nbd_open()
1772 mutex_unlock(&nbd->config_lock); in nbd_open()
1776 refcount_inc(&nbd->refs); in nbd_open()
1777 mutex_unlock(&nbd->config_lock); in nbd_open()
1791 struct nbd_device *nbd = disk->private_data; in nbd_release() local
1793 if (test_bit(NBD_RT_DISCONNECT_ON_CLOSE, &nbd->config->runtime_flags) && in nbd_release()
1795 nbd_disconnect_and_put(nbd); in nbd_release()
1797 nbd_config_put(nbd); in nbd_release()
1798 nbd_put(nbd); in nbd_release()
1803 struct nbd_device *nbd = disk->private_data; in nbd_free_disk() local
1805 kfree(nbd); in nbd_free_disk()
1822 struct nbd_device *nbd = s->private; in nbd_dbg_tasks_show() local
1824 if (nbd->pid) in nbd_dbg_tasks_show()
1825 seq_printf(s, "recv: %d\n", nbd->pid); in nbd_dbg_tasks_show()
1834 struct nbd_device *nbd = s->private; in nbd_dbg_flags_show() local
1835 u32 flags = nbd->config->flags; in nbd_dbg_flags_show()
1861 static int nbd_dev_dbg_init(struct nbd_device *nbd) in nbd_dev_dbg_init() argument
1864 struct nbd_config *config = nbd->config; in nbd_dev_dbg_init()
1869 dir = debugfs_create_dir(nbd_name(nbd), nbd_dbg_dir); in nbd_dev_dbg_init()
1871 dev_err(nbd_to_dev(nbd), "Failed to create debugfs dir for '%s'\n", in nbd_dev_dbg_init()
1872 nbd_name(nbd)); in nbd_dev_dbg_init()
1877 debugfs_create_file("tasks", 0444, dir, nbd, &nbd_dbg_tasks_fops); in nbd_dev_dbg_init()
1879 debugfs_create_u32("timeout", 0444, dir, &nbd->tag_set.timeout); in nbd_dev_dbg_init()
1881 debugfs_create_file("flags", 0444, dir, nbd, &nbd_dbg_flags_fops); in nbd_dev_dbg_init()
1886 static void nbd_dev_dbg_close(struct nbd_device *nbd) in nbd_dev_dbg_close() argument
1888 debugfs_remove_recursive(nbd->config->dbg_dir); in nbd_dev_dbg_close()
1911 static int nbd_dev_dbg_init(struct nbd_device *nbd) in nbd_dev_dbg_init() argument
1916 static void nbd_dev_dbg_close(struct nbd_device *nbd) in nbd_dev_dbg_close() argument
1935 cmd->nbd = set->driver_data; in nbd_init_request()
1957 struct nbd_device *nbd; in nbd_dev_add() local
1961 nbd = kzalloc_obj(struct nbd_device); in nbd_dev_add()
1962 if (!nbd) in nbd_dev_add()
1965 nbd->tag_set.ops = &nbd_mq_ops; in nbd_dev_add()
1966 nbd->tag_set.nr_hw_queues = nr_hw_queues; in nbd_dev_add()
1967 nbd->tag_set.queue_depth = 128; in nbd_dev_add()
1968 nbd->tag_set.numa_node = NUMA_NO_NODE; in nbd_dev_add()
1969 nbd->tag_set.cmd_size = sizeof(struct nbd_cmd); in nbd_dev_add()
1970 nbd->tag_set.flags = BLK_MQ_F_BLOCKING; in nbd_dev_add()
1971 nbd->tag_set.driver_data = nbd; in nbd_dev_add()
1972 INIT_WORK(&nbd->remove_work, nbd_dev_remove_work); in nbd_dev_add()
1973 nbd->backend = NULL; in nbd_dev_add()
1975 err = blk_mq_alloc_tag_set(&nbd->tag_set); in nbd_dev_add()
1981 err = idr_alloc(&nbd_index_idr, nbd, index, index + 1, in nbd_dev_add()
1986 err = idr_alloc(&nbd_index_idr, nbd, 0, in nbd_dev_add()
1991 nbd->index = index; in nbd_dev_add()
1996 disk = blk_mq_alloc_disk(&nbd->tag_set, &lim, NULL); in nbd_dev_add()
2001 nbd->disk = disk; in nbd_dev_add()
2003 nbd->recv_workq = alloc_workqueue("nbd%d-recv", in nbd_dev_add()
2005 WQ_UNBOUND, 0, nbd->index); in nbd_dev_add()
2006 if (!nbd->recv_workq) { in nbd_dev_add()
2007 dev_err(disk_to_dev(nbd->disk), "Could not allocate knbd recv work queue.\n"); in nbd_dev_add()
2012 mutex_init(&nbd->config_lock); in nbd_dev_add()
2013 refcount_set(&nbd->config_refs, 0); in nbd_dev_add()
2018 refcount_set(&nbd->refs, 0); in nbd_dev_add()
2019 INIT_LIST_HEAD(&nbd->list); in nbd_dev_add()
2024 disk->private_data = nbd; in nbd_dev_add()
2033 refcount_set(&nbd->refs, refs); in nbd_dev_add()
2035 return nbd; in nbd_dev_add()
2038 destroy_workqueue(nbd->recv_workq); in nbd_dev_add()
2046 blk_mq_free_tag_set(&nbd->tag_set); in nbd_dev_add()
2048 kfree(nbd); in nbd_dev_add()
2055 struct nbd_device *nbd; in nbd_find_get_unused() local
2060 idr_for_each_entry(&nbd_index_idr, nbd, id) { in nbd_find_get_unused()
2061 if (refcount_read(&nbd->config_refs) || in nbd_find_get_unused()
2062 test_bit(NBD_DESTROY_ON_DISCONNECT, &nbd->flags)) in nbd_find_get_unused()
2064 if (refcount_inc_not_zero(&nbd->refs)) in nbd_find_get_unused()
2065 return nbd; in nbd_find_get_unused()
2098 static int nbd_genl_size_set(struct genl_info *info, struct nbd_device *nbd) in nbd_genl_size_set() argument
2100 struct nbd_config *config = nbd->config; in nbd_genl_size_set()
2111 return nbd_set_size(nbd, bytes, bsize); in nbd_genl_size_set()
2121 int (*cb)(struct nbd_device *nbd, unsigned long fd), in nbd_genl_foreach_sock() argument
2122 struct nbd_device *nbd) in nbd_genl_foreach_sock()
2152 ret = cb(nbd, (int)nla_get_u32(socks[NBD_SOCK_FD])); in nbd_genl_foreach_sock()
2162 static int nbd_genl_connect_sock_cb(struct nbd_device *nbd, unsigned long fd) in nbd_genl_connect_sock_cb() argument
2164 return nbd_add_socket(nbd, fd, true); in nbd_genl_connect_sock_cb()
2169 struct nbd_device *nbd; in nbd_genl_connect() local
2202 nbd = nbd_find_get_unused(); in nbd_genl_connect()
2204 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_connect()
2205 if (nbd) { in nbd_genl_connect()
2206 if ((test_bit(NBD_DESTROY_ON_DISCONNECT, &nbd->flags) && in nbd_genl_connect()
2207 test_bit(NBD_DISCONNECT_REQUESTED, &nbd->flags)) || in nbd_genl_connect()
2208 !refcount_inc_not_zero(&nbd->refs)) { in nbd_genl_connect()
2218 if (!nbd) { in nbd_genl_connect()
2223 nbd = nbd_dev_add(index, 2, ret > 0 ? ret : 1); in nbd_genl_connect()
2224 if (IS_ERR(nbd)) { in nbd_genl_connect()
2226 return PTR_ERR(nbd); in nbd_genl_connect()
2230 mutex_lock(&nbd->config_lock); in nbd_genl_connect()
2231 if (refcount_read(&nbd->config_refs)) { in nbd_genl_connect()
2232 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
2233 nbd_put(nbd); in nbd_genl_connect()
2240 ret = nbd_alloc_and_init_config(nbd); in nbd_genl_connect()
2242 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
2243 nbd_put(nbd); in nbd_genl_connect()
2248 config = nbd->config; in nbd_genl_connect()
2250 ret = nbd_genl_size_set(info, nbd); in nbd_genl_connect()
2255 nbd_set_cmd_timeout(nbd, in nbd_genl_connect()
2277 &nbd->flags)) in nbd_genl_connect()
2281 &nbd->flags)) in nbd_genl_connect()
2282 refcount_inc(&nbd->refs); in nbd_genl_connect()
2290 ret = nbd_genl_foreach_sock(info, nbd_genl_connect_sock_cb, nbd); in nbd_genl_connect()
2295 nbd->backend = nla_strdup(info->attrs[NBD_ATTR_BACKEND_IDENTIFIER], in nbd_genl_connect()
2297 if (!nbd->backend) { in nbd_genl_connect()
2302 ret = device_create_file(disk_to_dev(nbd->disk), &backend_attr); in nbd_genl_connect()
2304 dev_err(disk_to_dev(nbd->disk), in nbd_genl_connect()
2310 ret = nbd_start_device(nbd); in nbd_genl_connect()
2314 refcount_inc(&nbd->config_refs); in nbd_genl_connect()
2315 nbd_connect_reply(info, nbd->index); in nbd_genl_connect()
2317 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
2319 nbd_config_put(nbd); in nbd_genl_connect()
2321 nbd_put(nbd); in nbd_genl_connect()
2325 static void nbd_disconnect_and_put(struct nbd_device *nbd) in nbd_disconnect_and_put() argument
2327 mutex_lock(&nbd->config_lock); in nbd_disconnect_and_put()
2328 nbd_disconnect(nbd); in nbd_disconnect_and_put()
2329 sock_shutdown(nbd); in nbd_disconnect_and_put()
2330 wake_up(&nbd->config->conn_wait); in nbd_disconnect_and_put()
2335 flush_workqueue(nbd->recv_workq); in nbd_disconnect_and_put()
2336 nbd_clear_que(nbd); in nbd_disconnect_and_put()
2337 nbd->task_setup = NULL; in nbd_disconnect_and_put()
2338 clear_bit(NBD_RT_BOUND, &nbd->config->runtime_flags); in nbd_disconnect_and_put()
2339 mutex_unlock(&nbd->config_lock); in nbd_disconnect_and_put()
2342 &nbd->config->runtime_flags)) in nbd_disconnect_and_put()
2343 nbd_config_put(nbd); in nbd_disconnect_and_put()
2348 struct nbd_device *nbd; in nbd_genl_disconnect() local
2360 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_disconnect()
2361 if (!nbd) { in nbd_genl_disconnect()
2366 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_genl_disconnect()
2372 if (!refcount_inc_not_zero(&nbd->config_refs)) in nbd_genl_disconnect()
2374 nbd_disconnect_and_put(nbd); in nbd_genl_disconnect()
2375 nbd_config_put(nbd); in nbd_genl_disconnect()
2377 nbd_put(nbd); in nbd_genl_disconnect()
2383 struct nbd_device *nbd = NULL; in nbd_genl_reconfigure() local
2398 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_reconfigure()
2399 if (!nbd) { in nbd_genl_reconfigure()
2404 if (nbd->backend) { in nbd_genl_reconfigure()
2407 nbd->backend)) { in nbd_genl_reconfigure()
2409 dev_err(nbd_to_dev(nbd), in nbd_genl_reconfigure()
2411 nbd->backend); in nbd_genl_reconfigure()
2416 dev_err(nbd_to_dev(nbd), "must specify backend\n"); in nbd_genl_reconfigure()
2420 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_genl_reconfigure()
2427 config = nbd_get_config_unlocked(nbd); in nbd_genl_reconfigure()
2429 dev_err(nbd_to_dev(nbd), in nbd_genl_reconfigure()
2431 nbd_put(nbd); in nbd_genl_reconfigure()
2435 mutex_lock(&nbd->config_lock); in nbd_genl_reconfigure()
2437 !nbd->pid) { in nbd_genl_reconfigure()
2438 dev_err(nbd_to_dev(nbd), in nbd_genl_reconfigure()
2444 ret = nbd_genl_size_set(info, nbd); in nbd_genl_reconfigure()
2449 nbd_set_cmd_timeout(nbd, in nbd_genl_reconfigure()
2460 &nbd->flags)) in nbd_genl_reconfigure()
2464 &nbd->flags)) in nbd_genl_reconfigure()
2465 refcount_inc(&nbd->refs); in nbd_genl_reconfigure()
2477 ret = nbd_genl_foreach_sock(info, nbd_genl_reconnect_sock_cb, nbd); in nbd_genl_reconfigure()
2482 mutex_unlock(&nbd->config_lock); in nbd_genl_reconfigure()
2483 nbd_config_put(nbd); in nbd_genl_reconfigure()
2484 nbd_put(nbd); in nbd_genl_reconfigure()
2486 nbd_put(nbd); in nbd_genl_reconfigure()
2533 static int populate_nbd_status(struct nbd_device *nbd, struct sk_buff *reply) in populate_nbd_status() argument
2546 if (refcount_read(&nbd->config_refs)) in populate_nbd_status()
2551 ret = nla_put_u32(reply, NBD_DEVICE_INDEX, nbd->index); in populate_nbd_status()
2564 struct nbd_device *nbd = ptr; in status_cb() local
2565 return populate_nbd_status(nbd, (struct sk_buff *)data); in status_cb()
2610 struct nbd_device *nbd; in nbd_genl_status() local
2611 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_status()
2612 if (nbd) { in nbd_genl_status()
2613 ret = populate_nbd_status(nbd, reply); in nbd_genl_status()
2750 struct nbd_device *nbd = ptr; in nbd_exit_cb() local
2753 if (refcount_read(&nbd->refs)) in nbd_exit_cb()
2754 list_add_tail(&nbd->list, list); in nbd_exit_cb()
2761 struct nbd_device *nbd; in nbd_cleanup() local
2777 nbd = list_first_entry(&del_list, struct nbd_device, list); in nbd_cleanup()
2778 list_del_init(&nbd->list); in nbd_cleanup()
2779 if (refcount_read(&nbd->config_refs)) in nbd_cleanup()
2781 refcount_read(&nbd->config_refs)); in nbd_cleanup()
2782 if (refcount_read(&nbd->refs) != 1) in nbd_cleanup()
2784 nbd_put(nbd); in nbd_cleanup()