Lines Matching refs:nbd
76 #define nbd_name(nbd) ((nbd)->disk->disk_name) argument
96 static inline struct device *nbd_to_dev(struct nbd_device *nbd) in nbd_to_dev() argument
98 return disk_to_dev(nbd->disk); in nbd_to_dev()
113 static void nbd_end_request(struct nbd_device *nbd, struct request *req) in nbd_end_request() argument
119 dev_dbg(nbd_to_dev(nbd), "request %p: %s\n", req, in nbd_end_request()
130 static void sock_shutdown(struct nbd_device *nbd) in sock_shutdown() argument
132 if (!nbd->sock) in sock_shutdown()
135 dev_warn(disk_to_dev(nbd->disk), "shutting down socket\n"); in sock_shutdown()
136 kernel_sock_shutdown(nbd->sock, SHUT_RDWR); in sock_shutdown()
137 nbd->sock = NULL; in sock_shutdown()
138 del_timer_sync(&nbd->timeout_timer); in sock_shutdown()
143 struct nbd_device *nbd = (struct nbd_device *)arg; in nbd_xmit_timeout() local
146 if (list_empty(&nbd->queue_head)) in nbd_xmit_timeout()
149 nbd->disconnect = true; in nbd_xmit_timeout()
151 spin_lock_irqsave(&nbd->tasks_lock, flags); in nbd_xmit_timeout()
153 if (nbd->task_recv) in nbd_xmit_timeout()
154 force_sig(SIGKILL, nbd->task_recv); in nbd_xmit_timeout()
156 if (nbd->task_send) in nbd_xmit_timeout()
157 force_sig(SIGKILL, nbd->task_send); in nbd_xmit_timeout()
159 spin_unlock_irqrestore(&nbd->tasks_lock, flags); in nbd_xmit_timeout()
161 …dev_err(nbd_to_dev(nbd), "Connection timed out, killed receiver and sender, shutting down connecti… in nbd_xmit_timeout()
167 static int sock_xmit(struct nbd_device *nbd, int send, void *buf, int size, in sock_xmit() argument
170 struct socket *sock = nbd->sock; in sock_xmit()
178 dev_err(disk_to_dev(nbd->disk), in sock_xmit()
218 if (!send && nbd->xmit_timeout) in sock_xmit()
219 mod_timer(&nbd->timeout_timer, jiffies + nbd->xmit_timeout); in sock_xmit()
224 static inline int sock_send_bvec(struct nbd_device *nbd, struct bio_vec *bvec, in sock_send_bvec() argument
229 result = sock_xmit(nbd, 1, kaddr + bvec->bv_offset, in sock_send_bvec()
236 static int nbd_send_req(struct nbd_device *nbd, struct request *req) in nbd_send_req() argument
263 dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n", in nbd_send_req()
266 result = sock_xmit(nbd, 1, &request, sizeof(request), in nbd_send_req()
269 dev_err(disk_to_dev(nbd->disk), in nbd_send_req()
285 dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n", in nbd_send_req()
287 result = sock_send_bvec(nbd, &bvec, flags); in nbd_send_req()
289 dev_err(disk_to_dev(nbd->disk), in nbd_send_req()
299 static struct request *nbd_find_request(struct nbd_device *nbd, in nbd_find_request() argument
305 err = wait_event_interruptible(nbd->active_wq, nbd->active_req != xreq); in nbd_find_request()
309 spin_lock(&nbd->queue_lock); in nbd_find_request()
310 list_for_each_entry_safe(req, tmp, &nbd->queue_head, queuelist) { in nbd_find_request()
314 spin_unlock(&nbd->queue_lock); in nbd_find_request()
317 spin_unlock(&nbd->queue_lock); in nbd_find_request()
322 static inline int sock_recv_bvec(struct nbd_device *nbd, struct bio_vec *bvec) in sock_recv_bvec() argument
326 result = sock_xmit(nbd, 0, kaddr + bvec->bv_offset, bvec->bv_len, in sock_recv_bvec()
333 static struct request *nbd_read_stat(struct nbd_device *nbd) in nbd_read_stat() argument
340 result = sock_xmit(nbd, 0, &reply, sizeof(reply), MSG_WAITALL); in nbd_read_stat()
342 dev_err(disk_to_dev(nbd->disk), in nbd_read_stat()
348 dev_err(disk_to_dev(nbd->disk), "Wrong magic (0x%lx)\n", in nbd_read_stat()
353 req = nbd_find_request(nbd, *(struct request **)reply.handle); in nbd_read_stat()
359 dev_err(disk_to_dev(nbd->disk), "Unexpected reply (%p)\n", in nbd_read_stat()
365 dev_err(disk_to_dev(nbd->disk), "Other side returned error (%d)\n", in nbd_read_stat()
371 dev_dbg(nbd_to_dev(nbd), "request %p: got reply\n", req); in nbd_read_stat()
377 result = sock_recv_bvec(nbd, &bvec); in nbd_read_stat()
379 dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", in nbd_read_stat()
384 dev_dbg(nbd_to_dev(nbd), "request %p: got %d bytes data\n", in nbd_read_stat()
395 struct nbd_device *nbd = (struct nbd_device *)disk->private_data; in pid_show() local
397 return sprintf(buf, "%d\n", task_pid_nr(nbd->task_recv)); in pid_show()
405 static int nbd_thread_recv(struct nbd_device *nbd) in nbd_thread_recv() argument
411 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_thread_recv()
413 sk_set_memalloc(nbd->sock->sk); in nbd_thread_recv()
415 spin_lock_irqsave(&nbd->tasks_lock, flags); in nbd_thread_recv()
416 nbd->task_recv = current; in nbd_thread_recv()
417 spin_unlock_irqrestore(&nbd->tasks_lock, flags); in nbd_thread_recv()
419 ret = device_create_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_thread_recv()
421 dev_err(disk_to_dev(nbd->disk), "device_create_file failed!\n"); in nbd_thread_recv()
423 spin_lock_irqsave(&nbd->tasks_lock, flags); in nbd_thread_recv()
424 nbd->task_recv = NULL; in nbd_thread_recv()
425 spin_unlock_irqrestore(&nbd->tasks_lock, flags); in nbd_thread_recv()
431 req = nbd_read_stat(nbd); in nbd_thread_recv()
437 nbd_end_request(nbd, req); in nbd_thread_recv()
440 device_remove_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_thread_recv()
442 spin_lock_irqsave(&nbd->tasks_lock, flags); in nbd_thread_recv()
443 nbd->task_recv = NULL; in nbd_thread_recv()
444 spin_unlock_irqrestore(&nbd->tasks_lock, flags); in nbd_thread_recv()
448 dev_warn(nbd_to_dev(nbd), "pid %d, %s, got signal %d\n", in nbd_thread_recv()
450 mutex_lock(&nbd->tx_lock); in nbd_thread_recv()
451 sock_shutdown(nbd); in nbd_thread_recv()
452 mutex_unlock(&nbd->tx_lock); in nbd_thread_recv()
459 static void nbd_clear_que(struct nbd_device *nbd) in nbd_clear_que() argument
463 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_clear_que()
473 BUG_ON(nbd->sock); in nbd_clear_que()
474 BUG_ON(nbd->active_req); in nbd_clear_que()
476 while (!list_empty(&nbd->queue_head)) { in nbd_clear_que()
477 req = list_entry(nbd->queue_head.next, struct request, in nbd_clear_que()
481 nbd_end_request(nbd, req); in nbd_clear_que()
484 while (!list_empty(&nbd->waiting_queue)) { in nbd_clear_que()
485 req = list_entry(nbd->waiting_queue.next, struct request, in nbd_clear_que()
489 nbd_end_request(nbd, req); in nbd_clear_que()
491 dev_dbg(disk_to_dev(nbd->disk), "queue cleared\n"); in nbd_clear_que()
495 static void nbd_handle_req(struct nbd_device *nbd, struct request *req) in nbd_handle_req() argument
501 (nbd->flags & NBD_FLAG_READ_ONLY)) { in nbd_handle_req()
502 dev_err(disk_to_dev(nbd->disk), in nbd_handle_req()
509 mutex_lock(&nbd->tx_lock); in nbd_handle_req()
510 if (unlikely(!nbd->sock)) { in nbd_handle_req()
511 mutex_unlock(&nbd->tx_lock); in nbd_handle_req()
512 dev_err(disk_to_dev(nbd->disk), in nbd_handle_req()
517 nbd->active_req = req; in nbd_handle_req()
519 if (nbd->xmit_timeout && list_empty_careful(&nbd->queue_head)) in nbd_handle_req()
520 mod_timer(&nbd->timeout_timer, jiffies + nbd->xmit_timeout); in nbd_handle_req()
522 if (nbd_send_req(nbd, req) != 0) { in nbd_handle_req()
523 dev_err(disk_to_dev(nbd->disk), "Request send failed\n"); in nbd_handle_req()
525 nbd_end_request(nbd, req); in nbd_handle_req()
527 spin_lock(&nbd->queue_lock); in nbd_handle_req()
528 list_add_tail(&req->queuelist, &nbd->queue_head); in nbd_handle_req()
529 spin_unlock(&nbd->queue_lock); in nbd_handle_req()
532 nbd->active_req = NULL; in nbd_handle_req()
533 mutex_unlock(&nbd->tx_lock); in nbd_handle_req()
534 wake_up_all(&nbd->active_wq); in nbd_handle_req()
540 nbd_end_request(nbd, req); in nbd_handle_req()
545 struct nbd_device *nbd = data; in nbd_thread_send() local
549 spin_lock_irqsave(&nbd->tasks_lock, flags); in nbd_thread_send()
550 nbd->task_send = current; in nbd_thread_send()
551 spin_unlock_irqrestore(&nbd->tasks_lock, flags); in nbd_thread_send()
554 while (!kthread_should_stop() || !list_empty(&nbd->waiting_queue)) { in nbd_thread_send()
556 wait_event_interruptible(nbd->waiting_wq, in nbd_thread_send()
558 !list_empty(&nbd->waiting_queue)); in nbd_thread_send()
563 dev_warn(nbd_to_dev(nbd), "pid %d, %s, got signal %d\n", in nbd_thread_send()
565 mutex_lock(&nbd->tx_lock); in nbd_thread_send()
566 sock_shutdown(nbd); in nbd_thread_send()
567 mutex_unlock(&nbd->tx_lock); in nbd_thread_send()
572 if (list_empty(&nbd->waiting_queue)) in nbd_thread_send()
575 spin_lock_irq(&nbd->queue_lock); in nbd_thread_send()
576 req = list_entry(nbd->waiting_queue.next, struct request, in nbd_thread_send()
579 spin_unlock_irq(&nbd->queue_lock); in nbd_thread_send()
582 nbd_handle_req(nbd, req); in nbd_thread_send()
585 spin_lock_irqsave(&nbd->tasks_lock, flags); in nbd_thread_send()
586 nbd->task_send = NULL; in nbd_thread_send()
587 spin_unlock_irqrestore(&nbd->tasks_lock, flags); in nbd_thread_send()
609 struct nbd_device *nbd; in nbd_request_handler() local
613 nbd = req->rq_disk->private_data; in nbd_request_handler()
615 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_request_handler()
617 dev_dbg(nbd_to_dev(nbd), "request %p: dequeued (flags=%x)\n", in nbd_request_handler()
620 if (unlikely(!nbd->sock)) { in nbd_request_handler()
621 dev_err_ratelimited(disk_to_dev(nbd->disk), in nbd_request_handler()
624 nbd_end_request(nbd, req); in nbd_request_handler()
629 spin_lock_irq(&nbd->queue_lock); in nbd_request_handler()
630 list_add_tail(&req->queuelist, &nbd->waiting_queue); in nbd_request_handler()
631 spin_unlock_irq(&nbd->queue_lock); in nbd_request_handler()
633 wake_up(&nbd->waiting_wq); in nbd_request_handler()
639 static int nbd_dev_dbg_init(struct nbd_device *nbd);
640 static void nbd_dev_dbg_close(struct nbd_device *nbd);
644 static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, in __nbd_ioctl() argument
651 dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); in __nbd_ioctl()
652 if (!nbd->sock) in __nbd_ioctl()
655 mutex_unlock(&nbd->tx_lock); in __nbd_ioctl()
657 mutex_lock(&nbd->tx_lock); in __nbd_ioctl()
662 if (!nbd->sock) in __nbd_ioctl()
665 nbd->disconnect = true; in __nbd_ioctl()
667 nbd_send_req(nbd, &sreq); in __nbd_ioctl()
672 struct socket *sock = nbd->sock; in __nbd_ioctl()
673 nbd->sock = NULL; in __nbd_ioctl()
674 nbd_clear_que(nbd); in __nbd_ioctl()
675 BUG_ON(!list_empty(&nbd->queue_head)); in __nbd_ioctl()
676 BUG_ON(!list_empty(&nbd->waiting_queue)); in __nbd_ioctl()
686 if (nbd->sock) in __nbd_ioctl()
690 nbd->sock = sock; in __nbd_ioctl()
693 nbd->disconnect = false; /* we're connected now */ in __nbd_ioctl()
700 nbd->blksize = arg; in __nbd_ioctl()
701 nbd->bytesize &= ~(nbd->blksize-1); in __nbd_ioctl()
702 bdev->bd_inode->i_size = nbd->bytesize; in __nbd_ioctl()
703 set_blocksize(bdev, nbd->blksize); in __nbd_ioctl()
704 set_capacity(nbd->disk, nbd->bytesize >> 9); in __nbd_ioctl()
708 nbd->bytesize = arg & ~(nbd->blksize-1); in __nbd_ioctl()
709 bdev->bd_inode->i_size = nbd->bytesize; in __nbd_ioctl()
710 set_blocksize(bdev, nbd->blksize); in __nbd_ioctl()
711 set_capacity(nbd->disk, nbd->bytesize >> 9); in __nbd_ioctl()
715 nbd->xmit_timeout = arg * HZ; in __nbd_ioctl()
717 mod_timer(&nbd->timeout_timer, in __nbd_ioctl()
718 jiffies + nbd->xmit_timeout); in __nbd_ioctl()
720 del_timer_sync(&nbd->timeout_timer); in __nbd_ioctl()
725 nbd->flags = arg; in __nbd_ioctl()
729 nbd->bytesize = ((u64) arg) * nbd->blksize; in __nbd_ioctl()
730 bdev->bd_inode->i_size = nbd->bytesize; in __nbd_ioctl()
731 set_blocksize(bdev, nbd->blksize); in __nbd_ioctl()
732 set_capacity(nbd->disk, nbd->bytesize >> 9); in __nbd_ioctl()
740 if (nbd->task_recv) in __nbd_ioctl()
742 if (!nbd->sock) in __nbd_ioctl()
745 mutex_unlock(&nbd->tx_lock); in __nbd_ioctl()
747 if (nbd->flags & NBD_FLAG_READ_ONLY) in __nbd_ioctl()
749 if (nbd->flags & NBD_FLAG_SEND_TRIM) in __nbd_ioctl()
751 nbd->disk->queue); in __nbd_ioctl()
752 if (nbd->flags & NBD_FLAG_SEND_FLUSH) in __nbd_ioctl()
753 blk_queue_flush(nbd->disk->queue, REQ_FLUSH); in __nbd_ioctl()
755 blk_queue_flush(nbd->disk->queue, 0); in __nbd_ioctl()
757 thread = kthread_run(nbd_thread_send, nbd, "%s", in __nbd_ioctl()
758 nbd_name(nbd)); in __nbd_ioctl()
760 mutex_lock(&nbd->tx_lock); in __nbd_ioctl()
764 nbd_dev_dbg_init(nbd); in __nbd_ioctl()
765 error = nbd_thread_recv(nbd); in __nbd_ioctl()
766 nbd_dev_dbg_close(nbd); in __nbd_ioctl()
769 mutex_lock(&nbd->tx_lock); in __nbd_ioctl()
771 sock_shutdown(nbd); in __nbd_ioctl()
772 sock = nbd->sock; in __nbd_ioctl()
773 nbd->sock = NULL; in __nbd_ioctl()
774 nbd_clear_que(nbd); in __nbd_ioctl()
776 queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); in __nbd_ioctl()
780 nbd->flags = 0; in __nbd_ioctl()
781 nbd->bytesize = 0; in __nbd_ioctl()
783 set_capacity(nbd->disk, 0); in __nbd_ioctl()
786 if (nbd->disconnect) /* user requested, ignore socket errors */ in __nbd_ioctl()
799 dev_info(disk_to_dev(nbd->disk), in __nbd_ioctl()
801 nbd->queue_head.next, nbd->queue_head.prev, in __nbd_ioctl()
802 &nbd->queue_head); in __nbd_ioctl()
811 struct nbd_device *nbd = bdev->bd_disk->private_data; in nbd_ioctl() local
817 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_ioctl()
819 mutex_lock(&nbd->tx_lock); in nbd_ioctl()
820 error = __nbd_ioctl(bdev, nbd, cmd, arg); in nbd_ioctl()
821 mutex_unlock(&nbd->tx_lock); in nbd_ioctl()
836 struct nbd_device *nbd = s->private; in nbd_dbg_tasks_show() local
838 if (nbd->task_recv) in nbd_dbg_tasks_show()
839 seq_printf(s, "recv: %d\n", task_pid_nr(nbd->task_recv)); in nbd_dbg_tasks_show()
840 if (nbd->task_send) in nbd_dbg_tasks_show()
841 seq_printf(s, "send: %d\n", task_pid_nr(nbd->task_send)); in nbd_dbg_tasks_show()
860 struct nbd_device *nbd = s->private; in nbd_dbg_flags_show() local
861 u32 flags = nbd->flags; in nbd_dbg_flags_show()
891 static int nbd_dev_dbg_init(struct nbd_device *nbd) in nbd_dev_dbg_init() argument
896 dir = debugfs_create_dir(nbd_name(nbd), nbd_dbg_dir); in nbd_dev_dbg_init()
898 dev_err(nbd_to_dev(nbd), "Failed to create debugfs dir for '%s' (%ld)\n", in nbd_dev_dbg_init()
899 nbd_name(nbd), PTR_ERR(dir)); in nbd_dev_dbg_init()
902 nbd->dbg_dir = dir; in nbd_dev_dbg_init()
904 f = debugfs_create_file("tasks", 0444, dir, nbd, &nbd_dbg_tasks_ops); in nbd_dev_dbg_init()
906 dev_err(nbd_to_dev(nbd), "Failed to create debugfs file 'tasks', %ld\n", in nbd_dev_dbg_init()
911 f = debugfs_create_u64("size_bytes", 0444, dir, &nbd->bytesize); in nbd_dev_dbg_init()
913 dev_err(nbd_to_dev(nbd), "Failed to create debugfs file 'size_bytes', %ld\n", in nbd_dev_dbg_init()
918 f = debugfs_create_u32("timeout", 0444, dir, &nbd->xmit_timeout); in nbd_dev_dbg_init()
920 dev_err(nbd_to_dev(nbd), "Failed to create debugfs file 'timeout', %ld\n", in nbd_dev_dbg_init()
925 f = debugfs_create_u32("blocksize", 0444, dir, &nbd->blksize); in nbd_dev_dbg_init()
927 dev_err(nbd_to_dev(nbd), "Failed to create debugfs file 'blocksize', %ld\n", in nbd_dev_dbg_init()
932 f = debugfs_create_file("flags", 0444, dir, &nbd, &nbd_dbg_flags_ops); in nbd_dev_dbg_init()
934 dev_err(nbd_to_dev(nbd), "Failed to create debugfs file 'flags', %ld\n", in nbd_dev_dbg_init()
942 static void nbd_dev_dbg_close(struct nbd_device *nbd) in nbd_dev_dbg_close() argument
944 debugfs_remove_recursive(nbd->dbg_dir); in nbd_dev_dbg_close()
967 static int nbd_dev_dbg_init(struct nbd_device *nbd) in nbd_dev_dbg_init() argument
972 static void nbd_dev_dbg_close(struct nbd_device *nbd) in nbd_dev_dbg_close() argument