Lines Matching refs:nbd
63 struct nbd_device *nbd; member
118 struct nbd_device *nbd; member
131 #define nbd_name(nbd) ((nbd)->disk->disk_name) argument
140 static int nbd_dev_dbg_init(struct nbd_device *nbd);
141 static void nbd_dev_dbg_close(struct nbd_device *nbd);
142 static void nbd_config_put(struct nbd_device *nbd);
146 static void nbd_disconnect_and_put(struct nbd_device *nbd);
148 static inline struct device *nbd_to_dev(struct nbd_device *nbd) in nbd_to_dev() argument
150 return disk_to_dev(nbd->disk); in nbd_to_dev()
198 struct nbd_device *nbd = (struct nbd_device *)disk->private_data; in pid_show() local
200 return sprintf(buf, "%d\n", task_pid_nr(nbd->task_recv)); in pid_show()
208 static void nbd_dev_remove(struct nbd_device *nbd) in nbd_dev_remove() argument
210 struct gendisk *disk = nbd->disk; in nbd_dev_remove()
217 blk_mq_free_tag_set(&nbd->tag_set); in nbd_dev_remove()
221 kfree(nbd); in nbd_dev_remove()
224 static void nbd_put(struct nbd_device *nbd) in nbd_put() argument
226 if (refcount_dec_and_mutex_lock(&nbd->refs, in nbd_put()
228 idr_remove(&nbd_index_idr, nbd->index); in nbd_put()
230 nbd_dev_remove(nbd); in nbd_put()
240 static void nbd_mark_nsock_dead(struct nbd_device *nbd, struct nbd_sock *nsock, in nbd_mark_nsock_dead() argument
243 if (!nsock->dead && notify && !nbd_disconnected(nbd->config)) { in nbd_mark_nsock_dead()
248 args->index = nbd->index; in nbd_mark_nsock_dead()
254 if (atomic_dec_return(&nbd->config->live_connections) == 0) { in nbd_mark_nsock_dead()
256 &nbd->config->runtime_flags)) { in nbd_mark_nsock_dead()
258 &nbd->config->runtime_flags); in nbd_mark_nsock_dead()
259 dev_info(nbd_to_dev(nbd), in nbd_mark_nsock_dead()
269 static void nbd_size_clear(struct nbd_device *nbd) in nbd_size_clear() argument
271 if (nbd->config->bytesize) { in nbd_size_clear()
272 set_capacity(nbd->disk, 0); in nbd_size_clear()
273 kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); in nbd_size_clear()
277 static void nbd_size_update(struct nbd_device *nbd) in nbd_size_update() argument
279 struct nbd_config *config = nbd->config; in nbd_size_update()
280 struct block_device *bdev = bdget_disk(nbd->disk, 0); in nbd_size_update()
283 nbd->disk->queue->limits.discard_granularity = config->blksize; in nbd_size_update()
284 nbd->disk->queue->limits.discard_alignment = config->blksize; in nbd_size_update()
285 blk_queue_max_discard_sectors(nbd->disk->queue, UINT_MAX); in nbd_size_update()
287 blk_queue_logical_block_size(nbd->disk->queue, config->blksize); in nbd_size_update()
288 blk_queue_physical_block_size(nbd->disk->queue, config->blksize); in nbd_size_update()
289 set_capacity(nbd->disk, config->bytesize >> 9); in nbd_size_update()
297 kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); in nbd_size_update()
300 static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize, in nbd_size_set() argument
303 struct nbd_config *config = nbd->config; in nbd_size_set()
306 if (nbd->task_recv != NULL) in nbd_size_set()
307 nbd_size_update(nbd); in nbd_size_set()
314 dev_dbg(nbd_to_dev(cmd->nbd), "request %p: %s\n", req, in nbd_complete_rq()
323 static void sock_shutdown(struct nbd_device *nbd) in sock_shutdown() argument
325 struct nbd_config *config = nbd->config; in sock_shutdown()
336 nbd_mark_nsock_dead(nbd, nsock, 0); in sock_shutdown()
339 dev_warn(disk_to_dev(nbd->disk), "shutting down sockets\n"); in sock_shutdown()
346 struct nbd_device *nbd = cmd->nbd; in nbd_xmit_timeout() local
349 if (!refcount_inc_not_zero(&nbd->config_refs)) { in nbd_xmit_timeout()
353 config = nbd->config; in nbd_xmit_timeout()
359 dev_err_ratelimited(nbd_to_dev(nbd), in nbd_xmit_timeout()
379 nbd_mark_nsock_dead(nbd, nsock, 1); in nbd_xmit_timeout()
384 nbd_config_put(nbd); in nbd_xmit_timeout()
388 dev_err_ratelimited(nbd_to_dev(nbd), in nbd_xmit_timeout()
394 sock_shutdown(nbd); in nbd_xmit_timeout()
395 nbd_config_put(nbd); in nbd_xmit_timeout()
404 static int sock_xmit(struct nbd_device *nbd, int index, int send, in sock_xmit() argument
407 struct nbd_config *config = nbd->config; in sock_xmit()
414 dev_err_ratelimited(disk_to_dev(nbd->disk), in sock_xmit()
460 static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd, int index) in nbd_send_cmd() argument
463 struct nbd_config *config = nbd->config; in nbd_send_cmd()
497 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_send_cmd()
528 dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n", in nbd_send_cmd()
531 result = sock_xmit(nbd, index, 1, &from, in nbd_send_cmd()
547 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_send_cmd()
565 dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n", in nbd_send_cmd()
577 result = sock_xmit(nbd, index, 1, &from, flags, &sent); in nbd_send_cmd()
589 dev_err(disk_to_dev(nbd->disk), in nbd_send_cmd()
612 static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index) in nbd_read_stat() argument
614 struct nbd_config *config = nbd->config; in nbd_read_stat()
628 result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL); in nbd_read_stat()
631 dev_err(disk_to_dev(nbd->disk), in nbd_read_stat()
637 dev_err(disk_to_dev(nbd->disk), "Wrong magic (0x%lx)\n", in nbd_read_stat()
645 if (hwq < nbd->tag_set.nr_hw_queues) in nbd_read_stat()
646 req = blk_mq_tag_to_rq(nbd->tag_set.tags[hwq], in nbd_read_stat()
649 dev_err(disk_to_dev(nbd->disk), "Unexpected reply (%d) %p\n", in nbd_read_stat()
657 dev_err(disk_to_dev(nbd->disk), "Double reply on req %p, cmd_cookie %u, handle cookie %u\n", in nbd_read_stat()
663 dev_err(disk_to_dev(nbd->disk), "Raced with timeout on req %p\n", in nbd_read_stat()
669 dev_err(disk_to_dev(nbd->disk), "Other side returned error (%d)\n", in nbd_read_stat()
675 dev_dbg(nbd_to_dev(nbd), "request %p: got reply\n", req); in nbd_read_stat()
683 result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL, NULL); in nbd_read_stat()
685 dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", in nbd_read_stat()
702 dev_dbg(nbd_to_dev(nbd), "request %p: got %d bytes data\n", in nbd_read_stat()
716 struct nbd_device *nbd = args->nbd; in recv_work() local
717 struct nbd_config *config = nbd->config; in recv_work()
721 cmd = nbd_read_stat(nbd, args->index); in recv_work()
726 nbd_mark_nsock_dead(nbd, nsock, 1); in recv_work()
735 nbd_config_put(nbd); in recv_work()
747 static void nbd_clear_que(struct nbd_device *nbd) in nbd_clear_que() argument
749 blk_mq_quiesce_queue(nbd->disk->queue); in nbd_clear_que()
750 blk_mq_tagset_busy_iter(&nbd->tag_set, nbd_clear_req, NULL); in nbd_clear_que()
751 blk_mq_unquiesce_queue(nbd->disk->queue); in nbd_clear_que()
752 dev_dbg(disk_to_dev(nbd->disk), "queue cleared\n"); in nbd_clear_que()
755 static int find_fallback(struct nbd_device *nbd, int index) in find_fallback() argument
757 struct nbd_config *config = nbd->config; in find_fallback()
766 dev_err_ratelimited(disk_to_dev(nbd->disk), in find_fallback()
789 dev_err_ratelimited(disk_to_dev(nbd->disk), in find_fallback()
798 static int wait_for_reconnect(struct nbd_device *nbd) in wait_for_reconnect() argument
800 struct nbd_config *config = nbd->config; in wait_for_reconnect()
813 struct nbd_device *nbd = cmd->nbd; in nbd_handle_cmd() local
818 if (!refcount_inc_not_zero(&nbd->config_refs)) { in nbd_handle_cmd()
819 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_handle_cmd()
824 config = nbd->config; in nbd_handle_cmd()
827 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_handle_cmd()
829 nbd_config_put(nbd); in nbd_handle_cmd()
839 index = find_fallback(nbd, index); in nbd_handle_cmd()
842 if (wait_for_reconnect(nbd)) { in nbd_handle_cmd()
852 sock_shutdown(nbd); in nbd_handle_cmd()
853 nbd_config_put(nbd); in nbd_handle_cmd()
875 ret = nbd_send_cmd(nbd, cmd, index); in nbd_handle_cmd()
877 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_handle_cmd()
879 nbd_mark_nsock_dead(nbd, nsock, 1); in nbd_handle_cmd()
885 nbd_config_put(nbd); in nbd_handle_cmd()
922 static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg, in nbd_add_socket() argument
925 struct nbd_config *config = nbd->config; in nbd_add_socket()
935 if (!netlink && !nbd->task_setup && in nbd_add_socket()
937 nbd->task_setup = current; in nbd_add_socket()
940 (nbd->task_setup != current || in nbd_add_socket()
942 dev_err(disk_to_dev(nbd->disk), in nbd_add_socket()
975 static int nbd_reconnect_socket(struct nbd_device *nbd, unsigned long arg) in nbd_reconnect_socket() argument
977 struct nbd_config *config = nbd->config; in nbd_reconnect_socket()
1005 if (nbd->tag_set.timeout) in nbd_reconnect_socket()
1006 sock->sk->sk_sndtimeo = nbd->tag_set.timeout; in nbd_reconnect_socket()
1008 refcount_inc(&nbd->config_refs); in nbd_reconnect_socket()
1015 args->nbd = nbd; in nbd_reconnect_socket()
1043 static void nbd_parse_flags(struct nbd_device *nbd) in nbd_parse_flags() argument
1045 struct nbd_config *config = nbd->config; in nbd_parse_flags()
1047 set_disk_ro(nbd->disk, true); in nbd_parse_flags()
1049 set_disk_ro(nbd->disk, false); in nbd_parse_flags()
1051 blk_queue_flag_set(QUEUE_FLAG_DISCARD, nbd->disk->queue); in nbd_parse_flags()
1054 blk_queue_write_cache(nbd->disk->queue, true, true); in nbd_parse_flags()
1056 blk_queue_write_cache(nbd->disk->queue, true, false); in nbd_parse_flags()
1059 blk_queue_write_cache(nbd->disk->queue, false, false); in nbd_parse_flags()
1062 static void send_disconnects(struct nbd_device *nbd) in send_disconnects() argument
1064 struct nbd_config *config = nbd->config; in send_disconnects()
1078 ret = sock_xmit(nbd, i, 1, &from, 0, NULL); in send_disconnects()
1080 dev_err(disk_to_dev(nbd->disk), in send_disconnects()
1086 static int nbd_disconnect(struct nbd_device *nbd) in nbd_disconnect() argument
1088 struct nbd_config *config = nbd->config; in nbd_disconnect()
1090 dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); in nbd_disconnect()
1092 send_disconnects(nbd); in nbd_disconnect()
1096 static void nbd_clear_sock(struct nbd_device *nbd) in nbd_clear_sock() argument
1098 sock_shutdown(nbd); in nbd_clear_sock()
1099 nbd_clear_que(nbd); in nbd_clear_sock()
1100 nbd->task_setup = NULL; in nbd_clear_sock()
1103 static void nbd_config_put(struct nbd_device *nbd) in nbd_config_put() argument
1105 if (refcount_dec_and_mutex_lock(&nbd->config_refs, in nbd_config_put()
1106 &nbd->config_lock)) { in nbd_config_put()
1107 struct nbd_config *config = nbd->config; in nbd_config_put()
1108 nbd_dev_dbg_close(nbd); in nbd_config_put()
1109 nbd_size_clear(nbd); in nbd_config_put()
1112 device_remove_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_config_put()
1113 nbd->task_recv = NULL; in nbd_config_put()
1114 nbd_clear_sock(nbd); in nbd_config_put()
1123 kfree(nbd->config); in nbd_config_put()
1124 nbd->config = NULL; in nbd_config_put()
1126 nbd->tag_set.timeout = 0; in nbd_config_put()
1127 nbd->disk->queue->limits.discard_granularity = 0; in nbd_config_put()
1128 nbd->disk->queue->limits.discard_alignment = 0; in nbd_config_put()
1129 blk_queue_max_discard_sectors(nbd->disk->queue, UINT_MAX); in nbd_config_put()
1130 blk_queue_flag_clear(QUEUE_FLAG_DISCARD, nbd->disk->queue); in nbd_config_put()
1132 mutex_unlock(&nbd->config_lock); in nbd_config_put()
1133 nbd_put(nbd); in nbd_config_put()
1138 static int nbd_start_device(struct nbd_device *nbd) in nbd_start_device() argument
1140 struct nbd_config *config = nbd->config; in nbd_start_device()
1144 if (nbd->task_recv) in nbd_start_device()
1150 dev_err(disk_to_dev(nbd->disk), "server does not support multiple connections per device.\n"); in nbd_start_device()
1154 blk_mq_update_nr_hw_queues(&nbd->tag_set, config->num_connections); in nbd_start_device()
1155 nbd->task_recv = current; in nbd_start_device()
1157 nbd_parse_flags(nbd); in nbd_start_device()
1159 error = device_create_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_start_device()
1161 dev_err(disk_to_dev(nbd->disk), "device_create_file failed!\n"); in nbd_start_device()
1166 nbd_dev_dbg_init(nbd); in nbd_start_device()
1172 sock_shutdown(nbd); in nbd_start_device()
1176 if (nbd->tag_set.timeout) in nbd_start_device()
1178 nbd->tag_set.timeout; in nbd_start_device()
1180 refcount_inc(&nbd->config_refs); in nbd_start_device()
1182 args->nbd = nbd; in nbd_start_device()
1186 nbd_size_update(nbd); in nbd_start_device()
1190 static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *bdev) in nbd_start_device_ioctl() argument
1192 struct nbd_config *config = nbd->config; in nbd_start_device_ioctl()
1195 ret = nbd_start_device(nbd); in nbd_start_device_ioctl()
1201 mutex_unlock(&nbd->config_lock); in nbd_start_device_ioctl()
1205 sock_shutdown(nbd); in nbd_start_device_ioctl()
1206 mutex_lock(&nbd->config_lock); in nbd_start_device_ioctl()
1216 static void nbd_clear_sock_ioctl(struct nbd_device *nbd, in nbd_clear_sock_ioctl() argument
1219 sock_shutdown(nbd); in nbd_clear_sock_ioctl()
1223 &nbd->config->runtime_flags)) in nbd_clear_sock_ioctl()
1224 nbd_config_put(nbd); in nbd_clear_sock_ioctl()
1228 static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, in __nbd_ioctl() argument
1231 struct nbd_config *config = nbd->config; in __nbd_ioctl()
1235 return nbd_disconnect(nbd); in __nbd_ioctl()
1237 nbd_clear_sock_ioctl(nbd, bdev); in __nbd_ioctl()
1240 return nbd_add_socket(nbd, arg, false); in __nbd_ioctl()
1245 nbd_size_set(nbd, arg, in __nbd_ioctl()
1249 nbd_size_set(nbd, config->blksize, in __nbd_ioctl()
1253 nbd_size_set(nbd, config->blksize, arg); in __nbd_ioctl()
1257 nbd->tag_set.timeout = arg * HZ; in __nbd_ioctl()
1258 blk_queue_rq_timeout(nbd->disk->queue, arg * HZ); in __nbd_ioctl()
1266 return nbd_start_device_ioctl(nbd, bdev); in __nbd_ioctl()
1286 struct nbd_device *nbd = bdev->bd_disk->private_data; in nbd_ioctl() local
1287 struct nbd_config *config = nbd->config; in nbd_ioctl()
1299 mutex_lock(&nbd->config_lock); in nbd_ioctl()
1306 error = __nbd_ioctl(bdev, nbd, cmd, arg); in nbd_ioctl()
1308 dev_err(nbd_to_dev(nbd), "Cannot use ioctl interface on a netlink controlled device.\n"); in nbd_ioctl()
1309 mutex_unlock(&nbd->config_lock); in nbd_ioctl()
1331 struct nbd_device *nbd; in nbd_open() local
1335 nbd = bdev->bd_disk->private_data; in nbd_open()
1336 if (!nbd) { in nbd_open()
1340 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_open()
1344 if (!refcount_inc_not_zero(&nbd->config_refs)) { in nbd_open()
1347 mutex_lock(&nbd->config_lock); in nbd_open()
1348 if (refcount_inc_not_zero(&nbd->config_refs)) { in nbd_open()
1349 mutex_unlock(&nbd->config_lock); in nbd_open()
1352 config = nbd->config = nbd_alloc_config(); in nbd_open()
1355 mutex_unlock(&nbd->config_lock); in nbd_open()
1358 refcount_set(&nbd->config_refs, 1); in nbd_open()
1359 refcount_inc(&nbd->refs); in nbd_open()
1360 mutex_unlock(&nbd->config_lock); in nbd_open()
1362 } else if (nbd_disconnected(nbd->config)) { in nbd_open()
1372 struct nbd_device *nbd = disk->private_data; in nbd_release() local
1375 if (test_bit(NBD_DISCONNECT_ON_CLOSE, &nbd->config->runtime_flags) && in nbd_release()
1377 nbd_disconnect_and_put(nbd); in nbd_release()
1379 nbd_config_put(nbd); in nbd_release()
1380 nbd_put(nbd); in nbd_release()
1396 struct nbd_device *nbd = s->private; in nbd_dbg_tasks_show() local
1398 if (nbd->task_recv) in nbd_dbg_tasks_show()
1399 seq_printf(s, "recv: %d\n", task_pid_nr(nbd->task_recv)); in nbd_dbg_tasks_show()
1418 struct nbd_device *nbd = s->private; in nbd_dbg_flags_show() local
1419 u32 flags = nbd->config->flags; in nbd_dbg_flags_show()
1451 static int nbd_dev_dbg_init(struct nbd_device *nbd) in nbd_dev_dbg_init() argument
1454 struct nbd_config *config = nbd->config; in nbd_dev_dbg_init()
1459 dir = debugfs_create_dir(nbd_name(nbd), nbd_dbg_dir); in nbd_dev_dbg_init()
1461 dev_err(nbd_to_dev(nbd), "Failed to create debugfs dir for '%s'\n", in nbd_dev_dbg_init()
1462 nbd_name(nbd)); in nbd_dev_dbg_init()
1467 debugfs_create_file("tasks", 0444, dir, nbd, &nbd_dbg_tasks_ops); in nbd_dev_dbg_init()
1469 debugfs_create_u32("timeout", 0444, dir, &nbd->tag_set.timeout); in nbd_dev_dbg_init()
1471 debugfs_create_file("flags", 0444, dir, nbd, &nbd_dbg_flags_ops); in nbd_dev_dbg_init()
1476 static void nbd_dev_dbg_close(struct nbd_device *nbd) in nbd_dev_dbg_close() argument
1478 debugfs_remove_recursive(nbd->config->dbg_dir); in nbd_dev_dbg_close()
1501 static int nbd_dev_dbg_init(struct nbd_device *nbd) in nbd_dev_dbg_init() argument
1506 static void nbd_dev_dbg_close(struct nbd_device *nbd) in nbd_dev_dbg_close() argument
1525 cmd->nbd = set->driver_data; in nbd_init_request()
1540 struct nbd_device *nbd; in nbd_dev_add() local
1545 nbd = kzalloc(sizeof(struct nbd_device), GFP_KERNEL); in nbd_dev_add()
1546 if (!nbd) in nbd_dev_add()
1554 err = idr_alloc(&nbd_index_idr, nbd, index, index + 1, in nbd_dev_add()
1559 err = idr_alloc(&nbd_index_idr, nbd, 0, 0, GFP_KERNEL); in nbd_dev_add()
1566 nbd->index = index; in nbd_dev_add()
1567 nbd->disk = disk; in nbd_dev_add()
1568 nbd->tag_set.ops = &nbd_mq_ops; in nbd_dev_add()
1569 nbd->tag_set.nr_hw_queues = 1; in nbd_dev_add()
1570 nbd->tag_set.queue_depth = 128; in nbd_dev_add()
1571 nbd->tag_set.numa_node = NUMA_NO_NODE; in nbd_dev_add()
1572 nbd->tag_set.cmd_size = sizeof(struct nbd_cmd); in nbd_dev_add()
1573 nbd->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | in nbd_dev_add()
1575 nbd->tag_set.driver_data = nbd; in nbd_dev_add()
1577 err = blk_mq_alloc_tag_set(&nbd->tag_set); in nbd_dev_add()
1581 q = blk_mq_init_queue(&nbd->tag_set); in nbd_dev_add()
1601 mutex_init(&nbd->config_lock); in nbd_dev_add()
1602 refcount_set(&nbd->config_refs, 0); in nbd_dev_add()
1603 refcount_set(&nbd->refs, 1); in nbd_dev_add()
1604 INIT_LIST_HEAD(&nbd->list); in nbd_dev_add()
1608 disk->private_data = nbd; in nbd_dev_add()
1615 blk_mq_free_tag_set(&nbd->tag_set); in nbd_dev_add()
1621 kfree(nbd); in nbd_dev_add()
1628 struct nbd_device *nbd = ptr; in find_free_cb() local
1631 if (!refcount_read(&nbd->config_refs)) { in find_free_cb()
1632 *found = nbd; in find_free_cb()
1666 struct nbd_device *nbd = NULL; in nbd_genl_connect() local
1688 ret = idr_for_each(&nbd_index_idr, &find_free_cb, &nbd); in nbd_genl_connect()
1697 nbd = idr_find(&nbd_index_idr, new_index); in nbd_genl_connect()
1700 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_connect()
1701 if (!nbd) { in nbd_genl_connect()
1708 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_connect()
1711 if (!nbd) { in nbd_genl_connect()
1717 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_genl_connect()
1727 mutex_lock(&nbd->config_lock); in nbd_genl_connect()
1728 if (refcount_read(&nbd->config_refs)) { in nbd_genl_connect()
1729 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
1730 nbd_put(nbd); in nbd_genl_connect()
1736 if (WARN_ON(nbd->config)) { in nbd_genl_connect()
1737 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
1738 nbd_put(nbd); in nbd_genl_connect()
1741 config = nbd->config = nbd_alloc_config(); in nbd_genl_connect()
1742 if (!nbd->config) { in nbd_genl_connect()
1743 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
1744 nbd_put(nbd); in nbd_genl_connect()
1748 refcount_set(&nbd->config_refs, 1); in nbd_genl_connect()
1753 nbd_size_set(nbd, config->blksize, in nbd_genl_connect()
1759 nbd_size_set(nbd, bsize, div64_u64(config->bytesize, bsize)); in nbd_genl_connect()
1763 nbd->tag_set.timeout = timeout * HZ; in nbd_genl_connect()
1764 blk_queue_rq_timeout(nbd->disk->queue, timeout * HZ); in nbd_genl_connect()
1810 ret = nbd_add_socket(nbd, fd, true); in nbd_genl_connect()
1815 ret = nbd_start_device(nbd); in nbd_genl_connect()
1817 mutex_unlock(&nbd->config_lock); in nbd_genl_connect()
1820 refcount_inc(&nbd->config_refs); in nbd_genl_connect()
1821 nbd_connect_reply(info, nbd->index); in nbd_genl_connect()
1823 nbd_config_put(nbd); in nbd_genl_connect()
1825 nbd_put(nbd); in nbd_genl_connect()
1829 static void nbd_disconnect_and_put(struct nbd_device *nbd) in nbd_disconnect_and_put() argument
1831 mutex_lock(&nbd->config_lock); in nbd_disconnect_and_put()
1832 nbd_disconnect(nbd); in nbd_disconnect_and_put()
1833 nbd_clear_sock(nbd); in nbd_disconnect_and_put()
1834 mutex_unlock(&nbd->config_lock); in nbd_disconnect_and_put()
1836 &nbd->config->runtime_flags)) in nbd_disconnect_and_put()
1837 nbd_config_put(nbd); in nbd_disconnect_and_put()
1842 struct nbd_device *nbd; in nbd_genl_disconnect() local
1854 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_disconnect()
1855 if (!nbd) { in nbd_genl_disconnect()
1861 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_genl_disconnect()
1868 if (!refcount_inc_not_zero(&nbd->config_refs)) { in nbd_genl_disconnect()
1869 nbd_put(nbd); in nbd_genl_disconnect()
1872 nbd_disconnect_and_put(nbd); in nbd_genl_disconnect()
1873 nbd_config_put(nbd); in nbd_genl_disconnect()
1874 nbd_put(nbd); in nbd_genl_disconnect()
1880 struct nbd_device *nbd = NULL; in nbd_genl_reconfigure() local
1895 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_reconfigure()
1896 if (!nbd) { in nbd_genl_reconfigure()
1902 if (!refcount_inc_not_zero(&nbd->refs)) { in nbd_genl_reconfigure()
1910 if (!refcount_inc_not_zero(&nbd->config_refs)) { in nbd_genl_reconfigure()
1911 dev_err(nbd_to_dev(nbd), in nbd_genl_reconfigure()
1913 nbd_put(nbd); in nbd_genl_reconfigure()
1917 mutex_lock(&nbd->config_lock); in nbd_genl_reconfigure()
1918 config = nbd->config; in nbd_genl_reconfigure()
1920 !nbd->task_recv) { in nbd_genl_reconfigure()
1921 dev_err(nbd_to_dev(nbd), in nbd_genl_reconfigure()
1929 nbd->tag_set.timeout = timeout * HZ; in nbd_genl_reconfigure()
1930 blk_queue_rq_timeout(nbd->disk->queue, timeout * HZ); in nbd_genl_reconfigure()
1946 refcount_inc(&nbd->refs); in nbd_genl_reconfigure()
1981 ret = nbd_reconnect_socket(nbd, fd); in nbd_genl_reconfigure()
1987 dev_info(nbd_to_dev(nbd), "reconnected socket\n"); in nbd_genl_reconfigure()
1991 mutex_unlock(&nbd->config_lock); in nbd_genl_reconfigure()
1992 nbd_config_put(nbd); in nbd_genl_reconfigure()
1993 nbd_put(nbd); in nbd_genl_reconfigure()
1995 nbd_put(nbd); in nbd_genl_reconfigure()
2038 static int populate_nbd_status(struct nbd_device *nbd, struct sk_buff *reply) in populate_nbd_status() argument
2051 if (refcount_read(&nbd->config_refs)) in populate_nbd_status()
2056 ret = nla_put_u32(reply, NBD_DEVICE_INDEX, nbd->index); in populate_nbd_status()
2069 struct nbd_device *nbd = ptr; in status_cb() local
2070 return populate_nbd_status(nbd, (struct sk_buff *)data); in status_cb()
2109 struct nbd_device *nbd; in nbd_genl_status() local
2110 nbd = idr_find(&nbd_index_idr, index); in nbd_genl_status()
2111 if (nbd) { in nbd_genl_status()
2112 ret = populate_nbd_status(nbd, reply); in nbd_genl_status()
2243 struct nbd_device *nbd = ptr; in nbd_exit_cb() local
2245 list_add_tail(&nbd->list, list); in nbd_exit_cb()
2251 struct nbd_device *nbd; in nbd_cleanup() local
2261 nbd = list_first_entry(&del_list, struct nbd_device, list); in nbd_cleanup()
2262 list_del_init(&nbd->list); in nbd_cleanup()
2263 if (refcount_read(&nbd->refs) != 1) in nbd_cleanup()
2265 nbd_put(nbd); in nbd_cleanup()