diff options
-rw-r--r-- | drivers/block/nbd.c | 48 | ||||
-rw-r--r-- | include/linux/nbd.h | 3 |
2 files changed, 20 insertions, 31 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 55298db36b2d..3a70ea2f7cd6 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -630,37 +630,29 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
630 | } | 630 | } |
631 | 631 | ||
632 | case NBD_CLEAR_SOCK: { | 632 | case NBD_CLEAR_SOCK: { |
633 | struct file *file; | 633 | struct socket *sock = nbd->sock; |
634 | |||
635 | nbd->sock = NULL; | 634 | nbd->sock = NULL; |
636 | file = nbd->file; | ||
637 | nbd->file = NULL; | ||
638 | nbd_clear_que(nbd); | 635 | nbd_clear_que(nbd); |
639 | BUG_ON(!list_empty(&nbd->queue_head)); | 636 | BUG_ON(!list_empty(&nbd->queue_head)); |
640 | BUG_ON(!list_empty(&nbd->waiting_queue)); | 637 | BUG_ON(!list_empty(&nbd->waiting_queue)); |
641 | kill_bdev(bdev); | 638 | kill_bdev(bdev); |
642 | if (file) | 639 | if (sock) |
643 | fput(file); | 640 | sockfd_put(sock); |
644 | return 0; | 641 | return 0; |
645 | } | 642 | } |
646 | 643 | ||
647 | case NBD_SET_SOCK: { | 644 | case NBD_SET_SOCK: { |
648 | struct file *file; | 645 | struct socket *sock; |
649 | if (nbd->file) | 646 | int err; |
647 | if (nbd->sock) | ||
650 | return -EBUSY; | 648 | return -EBUSY; |
651 | file = fget(arg); | 649 | sock = sockfd_lookup(arg, &err); |
652 | if (file) { | 650 | if (sock) { |
653 | struct inode *inode = file_inode(file); | 651 | nbd->sock = sock; |
654 | if (S_ISSOCK(inode->i_mode)) { | 652 | if (max_part > 0) |
655 | nbd->file = file; | 653 | bdev->bd_invalidated = 1; |
656 | nbd->sock = SOCKET_I(inode); | 654 | nbd->disconnect = 0; /* we're connected now */ |
657 | if (max_part > 0) | 655 | return 0; |
658 | bdev->bd_invalidated = 1; | ||
659 | nbd->disconnect = 0; /* we're connected now */ | ||
660 | return 0; | ||
661 | } else { | ||
662 | fput(file); | ||
663 | } | ||
664 | } | 656 | } |
665 | return -EINVAL; | 657 | return -EINVAL; |
666 | } | 658 | } |
@@ -697,12 +689,12 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
697 | 689 | ||
698 | case NBD_DO_IT: { | 690 | case NBD_DO_IT: { |
699 | struct task_struct *thread; | 691 | struct task_struct *thread; |
700 | struct file *file; | 692 | struct socket *sock; |
701 | int error; | 693 | int error; |
702 | 694 | ||
703 | if (nbd->pid) | 695 | if (nbd->pid) |
704 | return -EBUSY; | 696 | return -EBUSY; |
705 | if (!nbd->file) | 697 | if (!nbd->sock) |
706 | return -EINVAL; | 698 | return -EINVAL; |
707 | 699 | ||
708 | mutex_unlock(&nbd->tx_lock); | 700 | mutex_unlock(&nbd->tx_lock); |
@@ -731,15 +723,15 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
731 | if (error) | 723 | if (error) |
732 | return error; | 724 | return error; |
733 | sock_shutdown(nbd, 0); | 725 | sock_shutdown(nbd, 0); |
734 | file = nbd->file; | 726 | sock = nbd->sock; |
735 | nbd->file = NULL; | 727 | nbd->sock = NULL; |
736 | nbd_clear_que(nbd); | 728 | nbd_clear_que(nbd); |
737 | dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); | 729 | dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); |
738 | kill_bdev(bdev); | 730 | kill_bdev(bdev); |
739 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); | 731 | queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); |
740 | set_device_ro(bdev, false); | 732 | set_device_ro(bdev, false); |
741 | if (file) | 733 | if (sock) |
742 | fput(file); | 734 | sockfd_put(sock); |
743 | nbd->flags = 0; | 735 | nbd->flags = 0; |
744 | nbd->bytesize = 0; | 736 | nbd->bytesize = 0; |
745 | bdev->bd_inode->i_size = 0; | 737 | bdev->bd_inode->i_size = 0; |
@@ -875,9 +867,7 @@ static int __init nbd_init(void) | |||
875 | 867 | ||
876 | for (i = 0; i < nbds_max; i++) { | 868 | for (i = 0; i < nbds_max; i++) { |
877 | struct gendisk *disk = nbd_dev[i].disk; | 869 | struct gendisk *disk = nbd_dev[i].disk; |
878 | nbd_dev[i].file = NULL; | ||
879 | nbd_dev[i].magic = NBD_MAGIC; | 870 | nbd_dev[i].magic = NBD_MAGIC; |
880 | nbd_dev[i].flags = 0; | ||
881 | INIT_LIST_HEAD(&nbd_dev[i].waiting_queue); | 871 | INIT_LIST_HEAD(&nbd_dev[i].waiting_queue); |
882 | spin_lock_init(&nbd_dev[i].queue_lock); | 872 | spin_lock_init(&nbd_dev[i].queue_lock); |
883 | INIT_LIST_HEAD(&nbd_dev[i].queue_head); | 873 | INIT_LIST_HEAD(&nbd_dev[i].queue_head); |
diff --git a/include/linux/nbd.h b/include/linux/nbd.h index ae4981ebd18e..f62f78aef4ac 100644 --- a/include/linux/nbd.h +++ b/include/linux/nbd.h | |||
@@ -24,8 +24,7 @@ struct request; | |||
24 | struct nbd_device { | 24 | struct nbd_device { |
25 | int flags; | 25 | int flags; |
26 | int harderror; /* Code of hard error */ | 26 | int harderror; /* Code of hard error */ |
27 | struct socket * sock; | 27 | struct socket * sock; /* If == NULL, device is not ready, yet */ |
28 | struct file * file; /* If == NULL, device is not ready, yet */ | ||
29 | int magic; | 28 | int magic; |
30 | 29 | ||
31 | spinlock_t queue_lock; | 30 | spinlock_t queue_lock; |