Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

switch nbd to sockfd_lookup/sockfd_put

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro e2511578 09aaacf0

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