diff options
| author | Samuel Ortiz <samuel@sortiz.org> | 2010-10-04 19:24:20 -0400 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-10-10 20:11:34 -0400 |
| commit | f8cba16cad68c9b9ee7fecae48a1b91708e8e482 (patch) | |
| tree | eda3b276c3d5ff8a380b2553f6e8551e7f9a7075 | |
| parent | 5b40964eadea40509d353318d2c82e8b7bf5e8a5 (diff) | |
irda: Remove BKL instances from irnet
The code intends to lock the irnet_socket, so adding a mutex to it allows
for a complet BKL removal.
Signed-off-by: Samuel Ortiz <samuel@sortiz.org>
| -rw-r--r-- | net/irda/irnet/irnet.h | 2 | ||||
| -rw-r--r-- | net/irda/irnet/irnet_ppp.c | 61 |
2 files changed, 44 insertions, 19 deletions
diff --git a/net/irda/irnet/irnet.h b/net/irda/irnet/irnet.h index 4300df35d37d..0d82ff5aeff1 100644 --- a/net/irda/irnet/irnet.h +++ b/net/irda/irnet/irnet.h | |||
| @@ -458,6 +458,8 @@ typedef struct irnet_socket | |||
| 458 | int disco_index; /* Last read in the discovery log */ | 458 | int disco_index; /* Last read in the discovery log */ |
| 459 | int disco_number; /* Size of the discovery log */ | 459 | int disco_number; /* Size of the discovery log */ |
| 460 | 460 | ||
| 461 | struct mutex lock; | ||
| 462 | |||
| 461 | } irnet_socket; | 463 | } irnet_socket; |
| 462 | 464 | ||
| 463 | /* | 465 | /* |
diff --git a/net/irda/irnet/irnet_ppp.c b/net/irda/irnet/irnet_ppp.c index 69f1fa64994e..0993bd454ea5 100644 --- a/net/irda/irnet/irnet_ppp.c +++ b/net/irda/irnet/irnet_ppp.c | |||
| @@ -480,7 +480,6 @@ dev_irnet_open(struct inode * inode, | |||
| 480 | ap = kzalloc(sizeof(*ap), GFP_KERNEL); | 480 | ap = kzalloc(sizeof(*ap), GFP_KERNEL); |
| 481 | DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n"); | 481 | DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n"); |
| 482 | 482 | ||
| 483 | lock_kernel(); | ||
| 484 | /* initialize the irnet structure */ | 483 | /* initialize the irnet structure */ |
| 485 | ap->file = file; | 484 | ap->file = file; |
| 486 | 485 | ||
| @@ -502,18 +501,20 @@ dev_irnet_open(struct inode * inode, | |||
| 502 | { | 501 | { |
| 503 | DERROR(FS_ERROR, "Can't setup IrDA link...\n"); | 502 | DERROR(FS_ERROR, "Can't setup IrDA link...\n"); |
| 504 | kfree(ap); | 503 | kfree(ap); |
| 505 | unlock_kernel(); | 504 | |
| 506 | return err; | 505 | return err; |
| 507 | } | 506 | } |
| 508 | 507 | ||
| 509 | /* For the control channel */ | 508 | /* For the control channel */ |
| 510 | ap->event_index = irnet_events.index; /* Cancel all past events */ | 509 | ap->event_index = irnet_events.index; /* Cancel all past events */ |
| 511 | 510 | ||
| 511 | mutex_init(&ap->lock); | ||
| 512 | |||
| 512 | /* Put our stuff where we will be able to find it later */ | 513 | /* Put our stuff where we will be able to find it later */ |
| 513 | file->private_data = ap; | 514 | file->private_data = ap; |
| 514 | 515 | ||
| 515 | DEXIT(FS_TRACE, " - ap=0x%p\n", ap); | 516 | DEXIT(FS_TRACE, " - ap=0x%p\n", ap); |
| 516 | unlock_kernel(); | 517 | |
| 517 | return 0; | 518 | return 0; |
| 518 | } | 519 | } |
| 519 | 520 | ||
| @@ -664,7 +665,9 @@ dev_irnet_ioctl( | |||
| 664 | { | 665 | { |
| 665 | DEBUG(FS_INFO, "Entering PPP discipline.\n"); | 666 | DEBUG(FS_INFO, "Entering PPP discipline.\n"); |
| 666 | /* PPP channel setup (ap->chan in configued in dev_irnet_open())*/ | 667 | /* PPP channel setup (ap->chan in configued in dev_irnet_open())*/ |
| 667 | lock_kernel(); | 668 | if (mutex_lock_interruptible(&ap->lock)) |
| 669 | return -EINTR; | ||
| 670 | |||
| 668 | err = ppp_register_channel(&ap->chan); | 671 | err = ppp_register_channel(&ap->chan); |
| 669 | if(err == 0) | 672 | if(err == 0) |
| 670 | { | 673 | { |
| @@ -677,14 +680,17 @@ dev_irnet_ioctl( | |||
| 677 | } | 680 | } |
| 678 | else | 681 | else |
| 679 | DERROR(FS_ERROR, "Can't setup PPP channel...\n"); | 682 | DERROR(FS_ERROR, "Can't setup PPP channel...\n"); |
| 680 | unlock_kernel(); | 683 | |
| 684 | mutex_unlock(&ap->lock); | ||
| 681 | } | 685 | } |
| 682 | else | 686 | else |
| 683 | { | 687 | { |
| 684 | /* In theory, should be N_TTY */ | 688 | /* In theory, should be N_TTY */ |
| 685 | DEBUG(FS_INFO, "Exiting PPP discipline.\n"); | 689 | DEBUG(FS_INFO, "Exiting PPP discipline.\n"); |
| 686 | /* Disconnect from the generic PPP layer */ | 690 | /* Disconnect from the generic PPP layer */ |
| 687 | lock_kernel(); | 691 | if (mutex_lock_interruptible(&ap->lock)) |
| 692 | return -EINTR; | ||
| 693 | |||
| 688 | if(ap->ppp_open) | 694 | if(ap->ppp_open) |
| 689 | { | 695 | { |
| 690 | ap->ppp_open = 0; | 696 | ap->ppp_open = 0; |
| @@ -693,24 +699,31 @@ dev_irnet_ioctl( | |||
| 693 | else | 699 | else |
| 694 | DERROR(FS_ERROR, "Channel not registered !\n"); | 700 | DERROR(FS_ERROR, "Channel not registered !\n"); |
| 695 | err = 0; | 701 | err = 0; |
| 696 | unlock_kernel(); | 702 | |
| 703 | mutex_unlock(&ap->lock); | ||
| 697 | } | 704 | } |
| 698 | break; | 705 | break; |
| 699 | 706 | ||
| 700 | /* Query PPP channel and unit number */ | 707 | /* Query PPP channel and unit number */ |
| 701 | case PPPIOCGCHAN: | 708 | case PPPIOCGCHAN: |
| 702 | lock_kernel(); | 709 | if (mutex_lock_interruptible(&ap->lock)) |
| 710 | return -EINTR; | ||
| 711 | |||
| 703 | if(ap->ppp_open && !put_user(ppp_channel_index(&ap->chan), | 712 | if(ap->ppp_open && !put_user(ppp_channel_index(&ap->chan), |
| 704 | (int __user *)argp)) | 713 | (int __user *)argp)) |
| 705 | err = 0; | 714 | err = 0; |
| 706 | unlock_kernel(); | 715 | |
| 716 | mutex_unlock(&ap->lock); | ||
| 707 | break; | 717 | break; |
| 708 | case PPPIOCGUNIT: | 718 | case PPPIOCGUNIT: |
| 709 | lock_kernel(); | 719 | if (mutex_lock_interruptible(&ap->lock)) |
| 720 | return -EINTR; | ||
| 721 | |||
| 710 | if(ap->ppp_open && !put_user(ppp_unit_number(&ap->chan), | 722 | if(ap->ppp_open && !put_user(ppp_unit_number(&ap->chan), |
| 711 | (int __user *)argp)) | 723 | (int __user *)argp)) |
| 712 | err = 0; | 724 | err = 0; |
| 713 | unlock_kernel(); | 725 | |
| 726 | mutex_unlock(&ap->lock); | ||
| 714 | break; | 727 | break; |
| 715 | 728 | ||
| 716 | /* All these ioctls can be passed both directly and from ppp_generic, | 729 | /* All these ioctls can be passed both directly and from ppp_generic, |
| @@ -730,9 +743,12 @@ dev_irnet_ioctl( | |||
| 730 | if(!capable(CAP_NET_ADMIN)) | 743 | if(!capable(CAP_NET_ADMIN)) |
| 731 | err = -EPERM; | 744 | err = -EPERM; |
| 732 | else { | 745 | else { |
| 733 | lock_kernel(); | 746 | if (mutex_lock_interruptible(&ap->lock)) |
| 747 | return -EINTR; | ||
| 748 | |||
| 734 | err = ppp_irnet_ioctl(&ap->chan, cmd, arg); | 749 | err = ppp_irnet_ioctl(&ap->chan, cmd, arg); |
| 735 | unlock_kernel(); | 750 | |
| 751 | mutex_unlock(&ap->lock); | ||
| 736 | } | 752 | } |
| 737 | break; | 753 | break; |
| 738 | 754 | ||
| @@ -740,7 +756,9 @@ dev_irnet_ioctl( | |||
| 740 | /* Get termios */ | 756 | /* Get termios */ |
| 741 | case TCGETS: | 757 | case TCGETS: |
| 742 | DEBUG(FS_INFO, "Get termios.\n"); | 758 | DEBUG(FS_INFO, "Get termios.\n"); |
| 743 | lock_kernel(); | 759 | if (mutex_lock_interruptible(&ap->lock)) |
| 760 | return -EINTR; | ||
| 761 | |||
| 744 | #ifndef TCGETS2 | 762 | #ifndef TCGETS2 |
| 745 | if(!kernel_termios_to_user_termios((struct termios __user *)argp, &ap->termios)) | 763 | if(!kernel_termios_to_user_termios((struct termios __user *)argp, &ap->termios)) |
| 746 | err = 0; | 764 | err = 0; |
| @@ -748,12 +766,15 @@ dev_irnet_ioctl( | |||
| 748 | if(kernel_termios_to_user_termios_1((struct termios __user *)argp, &ap->termios)) | 766 | if(kernel_termios_to_user_termios_1((struct termios __user *)argp, &ap->termios)) |
| 749 | err = 0; | 767 | err = 0; |
| 750 | #endif | 768 | #endif |
| 751 | unlock_kernel(); | 769 | |
| 770 | mutex_unlock(&ap->lock); | ||
| 752 | break; | 771 | break; |
| 753 | /* Set termios */ | 772 | /* Set termios */ |
| 754 | case TCSETSF: | 773 | case TCSETSF: |
| 755 | DEBUG(FS_INFO, "Set termios.\n"); | 774 | DEBUG(FS_INFO, "Set termios.\n"); |
| 756 | lock_kernel(); | 775 | if (mutex_lock_interruptible(&ap->lock)) |
| 776 | return -EINTR; | ||
| 777 | |||
| 757 | #ifndef TCGETS2 | 778 | #ifndef TCGETS2 |
| 758 | if(!user_termios_to_kernel_termios(&ap->termios, (struct termios __user *)argp)) | 779 | if(!user_termios_to_kernel_termios(&ap->termios, (struct termios __user *)argp)) |
| 759 | err = 0; | 780 | err = 0; |
| @@ -761,7 +782,8 @@ dev_irnet_ioctl( | |||
| 761 | if(!user_termios_to_kernel_termios_1(&ap->termios, (struct termios __user *)argp)) | 782 | if(!user_termios_to_kernel_termios_1(&ap->termios, (struct termios __user *)argp)) |
| 762 | err = 0; | 783 | err = 0; |
| 763 | #endif | 784 | #endif |
| 764 | unlock_kernel(); | 785 | |
| 786 | mutex_unlock(&ap->lock); | ||
| 765 | break; | 787 | break; |
| 766 | 788 | ||
| 767 | /* Set DTR/RTS */ | 789 | /* Set DTR/RTS */ |
| @@ -784,9 +806,10 @@ dev_irnet_ioctl( | |||
| 784 | * We should also worry that we don't accept junk here and that | 806 | * We should also worry that we don't accept junk here and that |
| 785 | * we get rid of our own buffers */ | 807 | * we get rid of our own buffers */ |
| 786 | #ifdef FLUSH_TO_PPP | 808 | #ifdef FLUSH_TO_PPP |
| 787 | lock_kernel(); | 809 | if (mutex_lock_interruptible(&ap->lock)) |
| 810 | return -EINTR; | ||
| 788 | ppp_output_wakeup(&ap->chan); | 811 | ppp_output_wakeup(&ap->chan); |
| 789 | unlock_kernel(); | 812 | mutex_unlock(&ap->lock); |
| 790 | #endif /* FLUSH_TO_PPP */ | 813 | #endif /* FLUSH_TO_PPP */ |
| 791 | err = 0; | 814 | err = 0; |
| 792 | break; | 815 | break; |
