Lines Matching refs:nbd

82 static inline struct device *nbd_to_dev(struct nbd_device *nbd)  in nbd_to_dev()  argument
84 return disk_to_dev(nbd->disk); in nbd_to_dev()
99 static void nbd_end_request(struct nbd_device *nbd, struct request *req) in nbd_end_request() argument
105 dev_dbg(nbd_to_dev(nbd), "request %p: %s\n", req, in nbd_end_request()
116 static void sock_shutdown(struct nbd_device *nbd, int lock) in sock_shutdown() argument
119 mutex_lock(&nbd->tx_lock); in sock_shutdown()
120 if (nbd->sock) { in sock_shutdown()
121 dev_warn(disk_to_dev(nbd->disk), "shutting down socket\n"); in sock_shutdown()
122 kernel_sock_shutdown(nbd->sock, SHUT_RDWR); in sock_shutdown()
123 nbd->sock = NULL; in sock_shutdown()
126 mutex_unlock(&nbd->tx_lock); in sock_shutdown()
141 static int sock_xmit(struct nbd_device *nbd, int send, void *buf, int size, in sock_xmit() argument
144 struct socket *sock = nbd->sock; in sock_xmit()
152 dev_err(disk_to_dev(nbd->disk), in sock_xmit()
177 if (nbd->xmit_timeout) { in sock_xmit()
181 ti.expires = jiffies + nbd->xmit_timeout; in sock_xmit()
185 if (nbd->xmit_timeout) in sock_xmit()
197 sock_shutdown(nbd, !send); in sock_xmit()
216 static inline int sock_send_bvec(struct nbd_device *nbd, struct bio_vec *bvec, in sock_send_bvec() argument
221 result = sock_xmit(nbd, 1, kaddr + bvec->bv_offset, in sock_send_bvec()
228 static int nbd_send_req(struct nbd_device *nbd, struct request *req) in nbd_send_req() argument
244 dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n", in nbd_send_req()
247 result = sock_xmit(nbd, 1, &request, sizeof(request), in nbd_send_req()
250 dev_err(disk_to_dev(nbd->disk), in nbd_send_req()
266 dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n", in nbd_send_req()
268 result = sock_send_bvec(nbd, &bvec, flags); in nbd_send_req()
270 dev_err(disk_to_dev(nbd->disk), in nbd_send_req()
280 static struct request *nbd_find_request(struct nbd_device *nbd, in nbd_find_request() argument
286 err = wait_event_interruptible(nbd->active_wq, nbd->active_req != xreq); in nbd_find_request()
290 spin_lock(&nbd->queue_lock); in nbd_find_request()
291 list_for_each_entry_safe(req, tmp, &nbd->queue_head, queuelist) { in nbd_find_request()
295 spin_unlock(&nbd->queue_lock); in nbd_find_request()
298 spin_unlock(&nbd->queue_lock); in nbd_find_request()
303 static inline int sock_recv_bvec(struct nbd_device *nbd, struct bio_vec *bvec) in sock_recv_bvec() argument
307 result = sock_xmit(nbd, 0, kaddr + bvec->bv_offset, bvec->bv_len, in sock_recv_bvec()
314 static struct request *nbd_read_stat(struct nbd_device *nbd) in nbd_read_stat() argument
321 result = sock_xmit(nbd, 0, &reply, sizeof(reply), MSG_WAITALL); in nbd_read_stat()
323 dev_err(disk_to_dev(nbd->disk), in nbd_read_stat()
329 dev_err(disk_to_dev(nbd->disk), "Wrong magic (0x%lx)\n", in nbd_read_stat()
335 req = nbd_find_request(nbd, *(struct request **)reply.handle); in nbd_read_stat()
341 dev_err(disk_to_dev(nbd->disk), "Unexpected reply (%p)\n", in nbd_read_stat()
348 dev_err(disk_to_dev(nbd->disk), "Other side returned error (%d)\n", in nbd_read_stat()
354 dev_dbg(nbd_to_dev(nbd), "request %p: got reply\n", req); in nbd_read_stat()
360 result = sock_recv_bvec(nbd, &bvec); in nbd_read_stat()
362 dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", in nbd_read_stat()
367 dev_dbg(nbd_to_dev(nbd), "request %p: got %d bytes data\n", in nbd_read_stat()
373 nbd->harderror = result; in nbd_read_stat()
391 static int nbd_do_it(struct nbd_device *nbd) in nbd_do_it() argument
396 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_do_it()
398 sk_set_memalloc(nbd->sock->sk); in nbd_do_it()
399 nbd->pid = task_pid_nr(current); in nbd_do_it()
400 ret = device_create_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_do_it()
402 dev_err(disk_to_dev(nbd->disk), "device_create_file failed!\n"); in nbd_do_it()
403 nbd->pid = 0; in nbd_do_it()
407 while ((req = nbd_read_stat(nbd)) != NULL) in nbd_do_it()
408 nbd_end_request(nbd, req); in nbd_do_it()
410 device_remove_file(disk_to_dev(nbd->disk), &pid_attr); in nbd_do_it()
411 nbd->pid = 0; in nbd_do_it()
415 static void nbd_clear_que(struct nbd_device *nbd) in nbd_clear_que() argument
419 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_clear_que()
429 BUG_ON(nbd->sock); in nbd_clear_que()
430 BUG_ON(nbd->active_req); in nbd_clear_que()
432 while (!list_empty(&nbd->queue_head)) { in nbd_clear_que()
433 req = list_entry(nbd->queue_head.next, struct request, in nbd_clear_que()
437 nbd_end_request(nbd, req); in nbd_clear_que()
440 while (!list_empty(&nbd->waiting_queue)) { in nbd_clear_que()
441 req = list_entry(nbd->waiting_queue.next, struct request, in nbd_clear_que()
445 nbd_end_request(nbd, req); in nbd_clear_que()
450 static void nbd_handle_req(struct nbd_device *nbd, struct request *req) in nbd_handle_req() argument
458 WARN_ON(!(nbd->flags & NBD_FLAG_SEND_TRIM)); in nbd_handle_req()
462 if (nbd->flags & NBD_FLAG_READ_ONLY) { in nbd_handle_req()
463 dev_err(disk_to_dev(nbd->disk), in nbd_handle_req()
476 mutex_lock(&nbd->tx_lock); in nbd_handle_req()
477 if (unlikely(!nbd->sock)) { in nbd_handle_req()
478 mutex_unlock(&nbd->tx_lock); in nbd_handle_req()
479 dev_err(disk_to_dev(nbd->disk), in nbd_handle_req()
484 nbd->active_req = req; in nbd_handle_req()
486 if (nbd_send_req(nbd, req) != 0) { in nbd_handle_req()
487 dev_err(disk_to_dev(nbd->disk), "Request send failed\n"); in nbd_handle_req()
489 nbd_end_request(nbd, req); in nbd_handle_req()
491 spin_lock(&nbd->queue_lock); in nbd_handle_req()
492 list_add_tail(&req->queuelist, &nbd->queue_head); in nbd_handle_req()
493 spin_unlock(&nbd->queue_lock); in nbd_handle_req()
496 nbd->active_req = NULL; in nbd_handle_req()
497 mutex_unlock(&nbd->tx_lock); in nbd_handle_req()
498 wake_up_all(&nbd->active_wq); in nbd_handle_req()
504 nbd_end_request(nbd, req); in nbd_handle_req()
509 struct nbd_device *nbd = data; in nbd_thread() local
513 while (!kthread_should_stop() || !list_empty(&nbd->waiting_queue)) { in nbd_thread()
515 wait_event_interruptible(nbd->waiting_wq, in nbd_thread()
517 !list_empty(&nbd->waiting_queue)); in nbd_thread()
520 if (list_empty(&nbd->waiting_queue)) in nbd_thread()
523 spin_lock_irq(&nbd->queue_lock); in nbd_thread()
524 req = list_entry(nbd->waiting_queue.next, struct request, in nbd_thread()
527 spin_unlock_irq(&nbd->queue_lock); in nbd_thread()
530 nbd_handle_req(nbd, req); in nbd_thread()
548 struct nbd_device *nbd; in do_nbd_request() local
552 nbd = req->rq_disk->private_data; in do_nbd_request()
554 BUG_ON(nbd->magic != NBD_MAGIC); in do_nbd_request()
556 dev_dbg(nbd_to_dev(nbd), "request %p: dequeued (flags=%x)\n", in do_nbd_request()
559 if (unlikely(!nbd->sock)) { in do_nbd_request()
560 dev_err(disk_to_dev(nbd->disk), in do_nbd_request()
563 nbd_end_request(nbd, req); in do_nbd_request()
568 spin_lock_irq(&nbd->queue_lock); in do_nbd_request()
569 list_add_tail(&req->queuelist, &nbd->waiting_queue); in do_nbd_request()
570 spin_unlock_irq(&nbd->queue_lock); in do_nbd_request()
572 wake_up(&nbd->waiting_wq); in do_nbd_request()
580 static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, in __nbd_ioctl() argument
587 dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); in __nbd_ioctl()
588 if (!nbd->sock) in __nbd_ioctl()
591 mutex_unlock(&nbd->tx_lock); in __nbd_ioctl()
593 mutex_lock(&nbd->tx_lock); in __nbd_ioctl()
599 if (!nbd->sock) in __nbd_ioctl()
602 nbd->disconnect = 1; in __nbd_ioctl()
604 nbd_send_req(nbd, &sreq); in __nbd_ioctl()
609 struct socket *sock = nbd->sock; in __nbd_ioctl()
610 nbd->sock = NULL; in __nbd_ioctl()
611 nbd_clear_que(nbd); in __nbd_ioctl()
612 BUG_ON(!list_empty(&nbd->queue_head)); in __nbd_ioctl()
613 BUG_ON(!list_empty(&nbd->waiting_queue)); in __nbd_ioctl()
623 if (nbd->sock) in __nbd_ioctl()
627 nbd->sock = sock; in __nbd_ioctl()
630 nbd->disconnect = 0; /* we're connected now */ in __nbd_ioctl()
637 nbd->blksize = arg; in __nbd_ioctl()
638 nbd->bytesize &= ~(nbd->blksize-1); in __nbd_ioctl()
639 bdev->bd_inode->i_size = nbd->bytesize; in __nbd_ioctl()
640 set_blocksize(bdev, nbd->blksize); in __nbd_ioctl()
641 set_capacity(nbd->disk, nbd->bytesize >> 9); in __nbd_ioctl()
645 nbd->bytesize = arg & ~(nbd->blksize-1); in __nbd_ioctl()
646 bdev->bd_inode->i_size = nbd->bytesize; in __nbd_ioctl()
647 set_blocksize(bdev, nbd->blksize); in __nbd_ioctl()
648 set_capacity(nbd->disk, nbd->bytesize >> 9); in __nbd_ioctl()
652 nbd->xmit_timeout = arg * HZ; in __nbd_ioctl()
656 nbd->flags = arg; in __nbd_ioctl()
660 nbd->bytesize = ((u64) arg) * nbd->blksize; in __nbd_ioctl()
661 bdev->bd_inode->i_size = nbd->bytesize; in __nbd_ioctl()
662 set_blocksize(bdev, nbd->blksize); in __nbd_ioctl()
663 set_capacity(nbd->disk, nbd->bytesize >> 9); in __nbd_ioctl()
671 if (nbd->pid) in __nbd_ioctl()
673 if (!nbd->sock) in __nbd_ioctl()
676 mutex_unlock(&nbd->tx_lock); in __nbd_ioctl()
678 if (nbd->flags & NBD_FLAG_READ_ONLY) in __nbd_ioctl()
680 if (nbd->flags & NBD_FLAG_SEND_TRIM) in __nbd_ioctl()
682 nbd->disk->queue); in __nbd_ioctl()
683 if (nbd->flags & NBD_FLAG_SEND_FLUSH) in __nbd_ioctl()
684 blk_queue_flush(nbd->disk->queue, REQ_FLUSH); in __nbd_ioctl()
686 blk_queue_flush(nbd->disk->queue, 0); in __nbd_ioctl()
688 thread = kthread_run(nbd_thread, nbd, "%s", in __nbd_ioctl()
689 nbd->disk->disk_name); in __nbd_ioctl()
691 mutex_lock(&nbd->tx_lock); in __nbd_ioctl()
695 error = nbd_do_it(nbd); in __nbd_ioctl()
698 mutex_lock(&nbd->tx_lock); in __nbd_ioctl()
701 sock_shutdown(nbd, 0); in __nbd_ioctl()
702 sock = nbd->sock; in __nbd_ioctl()
703 nbd->sock = NULL; in __nbd_ioctl()
704 nbd_clear_que(nbd); in __nbd_ioctl()
705 dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); in __nbd_ioctl()
707 queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); in __nbd_ioctl()
711 nbd->flags = 0; in __nbd_ioctl()
712 nbd->bytesize = 0; in __nbd_ioctl()
714 set_capacity(nbd->disk, 0); in __nbd_ioctl()
717 if (nbd->disconnect) /* user requested, ignore socket errors */ in __nbd_ioctl()
719 return nbd->harderror; in __nbd_ioctl()
730 dev_info(disk_to_dev(nbd->disk), in __nbd_ioctl()
732 nbd->queue_head.next, nbd->queue_head.prev, in __nbd_ioctl()
733 &nbd->queue_head); in __nbd_ioctl()
742 struct nbd_device *nbd = bdev->bd_disk->private_data; in nbd_ioctl() local
748 BUG_ON(nbd->magic != NBD_MAGIC); in nbd_ioctl()
750 mutex_lock(&nbd->tx_lock); in nbd_ioctl()
751 error = __nbd_ioctl(bdev, nbd, cmd, arg); in nbd_ioctl()
752 mutex_unlock(&nbd->tx_lock); in nbd_ioctl()