diff options
| -rw-r--r-- | net/iucv/af_iucv.c | 44 | ||||
| -rw-r--r-- | net/iucv/iucv.c | 49 |
2 files changed, 45 insertions, 48 deletions
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 026704a47296..2f1373855a8b 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
| @@ -45,7 +45,8 @@ static struct proto iucv_proto = { | |||
| 45 | static void iucv_callback_rx(struct iucv_path *, struct iucv_message *); | 45 | static void iucv_callback_rx(struct iucv_path *, struct iucv_message *); |
| 46 | static void iucv_callback_txdone(struct iucv_path *, struct iucv_message *); | 46 | static void iucv_callback_txdone(struct iucv_path *, struct iucv_message *); |
| 47 | static void iucv_callback_connack(struct iucv_path *, u8 ipuser[16]); | 47 | static void iucv_callback_connack(struct iucv_path *, u8 ipuser[16]); |
| 48 | static int iucv_callback_connreq(struct iucv_path *, u8 ipvmid[8], u8 ipuser[16]); | 48 | static int iucv_callback_connreq(struct iucv_path *, u8 ipvmid[8], |
| 49 | u8 ipuser[16]); | ||
| 49 | static void iucv_callback_connrej(struct iucv_path *, u8 ipuser[16]); | 50 | static void iucv_callback_connrej(struct iucv_path *, u8 ipuser[16]); |
| 50 | 51 | ||
| 51 | static struct iucv_sock_list iucv_sk_list = { | 52 | static struct iucv_sock_list iucv_sk_list = { |
| @@ -152,7 +153,7 @@ static void iucv_sock_close(struct sock *sk) | |||
| 152 | iucv_sock_clear_timer(sk); | 153 | iucv_sock_clear_timer(sk); |
| 153 | lock_sock(sk); | 154 | lock_sock(sk); |
| 154 | 155 | ||
| 155 | switch(sk->sk_state) { | 156 | switch (sk->sk_state) { |
| 156 | case IUCV_LISTEN: | 157 | case IUCV_LISTEN: |
| 157 | iucv_sock_cleanup_listen(sk); | 158 | iucv_sock_cleanup_listen(sk); |
| 158 | break; | 159 | break; |
| @@ -164,7 +165,7 @@ static void iucv_sock_close(struct sock *sk) | |||
| 164 | sk->sk_state = IUCV_CLOSING; | 165 | sk->sk_state = IUCV_CLOSING; |
| 165 | sk->sk_state_change(sk); | 166 | sk->sk_state_change(sk); |
| 166 | 167 | ||
| 167 | if(!skb_queue_empty(&iucv->send_skb_q)) { | 168 | if (!skb_queue_empty(&iucv->send_skb_q)) { |
| 168 | if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) | 169 | if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) |
| 169 | timeo = sk->sk_lingertime; | 170 | timeo = sk->sk_lingertime; |
| 170 | else | 171 | else |
| @@ -292,7 +293,7 @@ struct sock *iucv_accept_dequeue(struct sock *parent, struct socket *newsock) | |||
| 292 | struct iucv_sock *isk, *n; | 293 | struct iucv_sock *isk, *n; |
| 293 | struct sock *sk; | 294 | struct sock *sk; |
| 294 | 295 | ||
| 295 | list_for_each_entry_safe(isk, n, &iucv_sk(parent)->accept_q, accept_q){ | 296 | list_for_each_entry_safe(isk, n, &iucv_sk(parent)->accept_q, accept_q) { |
| 296 | sk = (struct sock *) isk; | 297 | sk = (struct sock *) isk; |
| 297 | lock_sock(sk); | 298 | lock_sock(sk); |
| 298 | 299 | ||
| @@ -537,7 +538,7 @@ static int iucv_sock_accept(struct socket *sock, struct socket *newsock, | |||
| 537 | 538 | ||
| 538 | /* Wait for an incoming connection */ | 539 | /* Wait for an incoming connection */ |
| 539 | add_wait_queue_exclusive(sk->sk_sleep, &wait); | 540 | add_wait_queue_exclusive(sk->sk_sleep, &wait); |
| 540 | while (!(nsk = iucv_accept_dequeue(sk, newsock))){ | 541 | while (!(nsk = iucv_accept_dequeue(sk, newsock))) { |
| 541 | set_current_state(TASK_INTERRUPTIBLE); | 542 | set_current_state(TASK_INTERRUPTIBLE); |
| 542 | if (!timeo) { | 543 | if (!timeo) { |
| 543 | err = -EAGAIN; | 544 | err = -EAGAIN; |
| @@ -618,13 +619,13 @@ static int iucv_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 618 | goto out; | 619 | goto out; |
| 619 | } | 620 | } |
| 620 | 621 | ||
| 621 | if (sk->sk_state == IUCV_CONNECTED){ | 622 | if (sk->sk_state == IUCV_CONNECTED) { |
| 622 | if(!(skb = sock_alloc_send_skb(sk, len, | 623 | if (!(skb = sock_alloc_send_skb(sk, len, |
| 623 | msg->msg_flags & MSG_DONTWAIT, | 624 | msg->msg_flags & MSG_DONTWAIT, |
| 624 | &err))) | 625 | &err))) |
| 625 | goto out; | 626 | goto out; |
| 626 | 627 | ||
| 627 | if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)){ | 628 | if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) { |
| 628 | err = -EFAULT; | 629 | err = -EFAULT; |
| 629 | goto fail; | 630 | goto fail; |
| 630 | } | 631 | } |
| @@ -710,7 +711,7 @@ static int iucv_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 710 | 711 | ||
| 711 | /* Queue backlog skbs */ | 712 | /* Queue backlog skbs */ |
| 712 | rskb = skb_dequeue(&iucv_sk(sk)->backlog_skb_q); | 713 | rskb = skb_dequeue(&iucv_sk(sk)->backlog_skb_q); |
| 713 | while(rskb) { | 714 | while (rskb) { |
| 714 | if (sock_queue_rcv_skb(sk, rskb)) { | 715 | if (sock_queue_rcv_skb(sk, rskb)) { |
| 715 | skb_queue_head(&iucv_sk(sk)->backlog_skb_q, | 716 | skb_queue_head(&iucv_sk(sk)->backlog_skb_q, |
| 716 | rskb); | 717 | rskb); |
| @@ -731,7 +732,7 @@ static inline unsigned int iucv_accept_poll(struct sock *parent) | |||
| 731 | struct iucv_sock *isk, *n; | 732 | struct iucv_sock *isk, *n; |
| 732 | struct sock *sk; | 733 | struct sock *sk; |
| 733 | 734 | ||
| 734 | list_for_each_entry_safe(isk, n, &iucv_sk(parent)->accept_q, accept_q){ | 735 | list_for_each_entry_safe(isk, n, &iucv_sk(parent)->accept_q, accept_q) { |
| 735 | sk = (struct sock *) isk; | 736 | sk = (struct sock *) isk; |
| 736 | 737 | ||
| 737 | if (sk->sk_state == IUCV_CONNECTED) | 738 | if (sk->sk_state == IUCV_CONNECTED) |
| @@ -762,7 +763,7 @@ unsigned int iucv_sock_poll(struct file *file, struct socket *sock, | |||
| 762 | mask |= POLLHUP; | 763 | mask |= POLLHUP; |
| 763 | 764 | ||
| 764 | if (!skb_queue_empty(&sk->sk_receive_queue) || | 765 | if (!skb_queue_empty(&sk->sk_receive_queue) || |
| 765 | (sk->sk_shutdown & RCV_SHUTDOWN)) | 766 | (sk->sk_shutdown & RCV_SHUTDOWN)) |
| 766 | mask |= POLLIN | POLLRDNORM; | 767 | mask |= POLLIN | POLLRDNORM; |
| 767 | 768 | ||
| 768 | if (sk->sk_state == IUCV_CLOSED) | 769 | if (sk->sk_state == IUCV_CLOSED) |
| @@ -793,7 +794,7 @@ static int iucv_sock_shutdown(struct socket *sock, int how) | |||
| 793 | return -EINVAL; | 794 | return -EINVAL; |
| 794 | 795 | ||
| 795 | lock_sock(sk); | 796 | lock_sock(sk); |
| 796 | switch(sk->sk_state) { | 797 | switch (sk->sk_state) { |
| 797 | case IUCV_CLOSED: | 798 | case IUCV_CLOSED: |
| 798 | err = -ENOTCONN; | 799 | err = -ENOTCONN; |
| 799 | goto fail; | 800 | goto fail; |
| @@ -809,7 +810,7 @@ static int iucv_sock_shutdown(struct socket *sock, int how) | |||
| 809 | err = iucv_message_send(iucv->path, &txmsg, IUCV_IPRMDATA, 0, | 810 | err = iucv_message_send(iucv->path, &txmsg, IUCV_IPRMDATA, 0, |
| 810 | (void *) prmmsg, 8); | 811 | (void *) prmmsg, 8); |
| 811 | if (err) { | 812 | if (err) { |
| 812 | switch(err) { | 813 | switch (err) { |
| 813 | case 1: | 814 | case 1: |
| 814 | err = -ENOTCONN; | 815 | err = -ENOTCONN; |
| 815 | break; | 816 | break; |
| @@ -912,7 +913,7 @@ static int iucv_callback_connreq(struct iucv_path *path, | |||
| 912 | 913 | ||
| 913 | /* Create the new socket */ | 914 | /* Create the new socket */ |
| 914 | nsk = iucv_sock_alloc(NULL, SOCK_STREAM, GFP_ATOMIC); | 915 | nsk = iucv_sock_alloc(NULL, SOCK_STREAM, GFP_ATOMIC); |
| 915 | if (!nsk){ | 916 | if (!nsk) { |
| 916 | err = iucv_path_sever(path, user_data); | 917 | err = iucv_path_sever(path, user_data); |
| 917 | goto fail; | 918 | goto fail; |
| 918 | } | 919 | } |
| @@ -935,7 +936,7 @@ static int iucv_callback_connreq(struct iucv_path *path, | |||
| 935 | 936 | ||
| 936 | path->msglim = IUCV_QUEUELEN_DEFAULT; | 937 | path->msglim = IUCV_QUEUELEN_DEFAULT; |
| 937 | err = iucv_path_accept(path, &af_iucv_handler, nuser_data, nsk); | 938 | err = iucv_path_accept(path, &af_iucv_handler, nuser_data, nsk); |
| 938 | if (err){ | 939 | if (err) { |
| 939 | err = iucv_path_sever(path, user_data); | 940 | err = iucv_path_sever(path, user_data); |
| 940 | goto fail; | 941 | goto fail; |
| 941 | } | 942 | } |
| @@ -966,7 +967,7 @@ static int iucv_fragment_skb(struct sock *sk, struct sk_buff *skb, int len, | |||
| 966 | struct sk_buff *nskb; | 967 | struct sk_buff *nskb; |
| 967 | 968 | ||
| 968 | dataleft = len; | 969 | dataleft = len; |
| 969 | while(dataleft) { | 970 | while (dataleft) { |
| 970 | if (dataleft >= sk->sk_rcvbuf / 4) | 971 | if (dataleft >= sk->sk_rcvbuf / 4) |
| 971 | size = sk->sk_rcvbuf / 4; | 972 | size = sk->sk_rcvbuf / 4; |
| 972 | else | 973 | else |
| @@ -989,6 +990,7 @@ static int iucv_fragment_skb(struct sock *sk, struct sk_buff *skb, int len, | |||
| 989 | 990 | ||
| 990 | return 0; | 991 | return 0; |
| 991 | } | 992 | } |
| 993 | |||
| 992 | static void iucv_callback_rx(struct iucv_path *path, struct iucv_message *msg) | 994 | static void iucv_callback_rx(struct iucv_path *path, struct iucv_message *msg) |
| 993 | { | 995 | { |
| 994 | struct sock *sk = path->private; | 996 | struct sock *sk = path->private; |
| @@ -1035,7 +1037,7 @@ static void iucv_callback_rx(struct iucv_path *path, struct iucv_message *msg) | |||
| 1035 | } | 1037 | } |
| 1036 | /* Queue the fragmented skb */ | 1038 | /* Queue the fragmented skb */ |
| 1037 | fskb = skb_dequeue(&fragmented_skb_q); | 1039 | fskb = skb_dequeue(&fragmented_skb_q); |
| 1038 | while(fskb) { | 1040 | while (fskb) { |
| 1039 | if (!skb_queue_empty(&iucv->backlog_skb_q)) | 1041 | if (!skb_queue_empty(&iucv->backlog_skb_q)) |
| 1040 | skb_queue_tail(&iucv->backlog_skb_q, fskb); | 1042 | skb_queue_tail(&iucv->backlog_skb_q, fskb); |
| 1041 | else if (sock_queue_rcv_skb(sk, fskb)) | 1043 | else if (sock_queue_rcv_skb(sk, fskb)) |
| @@ -1076,7 +1078,7 @@ static void iucv_callback_txdone(struct iucv_path *path, | |||
| 1076 | kfree_skb(this); | 1078 | kfree_skb(this); |
| 1077 | } | 1079 | } |
| 1078 | 1080 | ||
| 1079 | if (sk->sk_state == IUCV_CLOSING){ | 1081 | if (sk->sk_state == IUCV_CLOSING) { |
| 1080 | if (skb_queue_empty(&iucv_sk(sk)->send_skb_q)) { | 1082 | if (skb_queue_empty(&iucv_sk(sk)->send_skb_q)) { |
| 1081 | sk->sk_state = IUCV_CLOSED; | 1083 | sk->sk_state = IUCV_CLOSED; |
| 1082 | sk->sk_state_change(sk); | 1084 | sk->sk_state_change(sk); |
| @@ -1123,7 +1125,7 @@ static struct net_proto_family iucv_sock_family_ops = { | |||
| 1123 | .create = iucv_sock_create, | 1125 | .create = iucv_sock_create, |
| 1124 | }; | 1126 | }; |
| 1125 | 1127 | ||
| 1126 | static int afiucv_init(void) | 1128 | static int __init afiucv_init(void) |
| 1127 | { | 1129 | { |
| 1128 | int err; | 1130 | int err; |
| 1129 | 1131 | ||
diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index 903bdb6eaaa1..fb3faf72e850 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | 32 | ||
| 33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
| 34 | #include <linux/moduleparam.h> | 34 | #include <linux/moduleparam.h> |
| 35 | |||
| 36 | #include <linux/spinlock.h> | 35 | #include <linux/spinlock.h> |
| 37 | #include <linux/kernel.h> | 36 | #include <linux/kernel.h> |
| 38 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
| @@ -69,7 +68,7 @@ | |||
| 69 | #define IUCV_IPNORPY 0x10 | 68 | #define IUCV_IPNORPY 0x10 |
| 70 | #define IUCV_IPALL 0x80 | 69 | #define IUCV_IPALL 0x80 |
| 71 | 70 | ||
| 72 | static int iucv_bus_match (struct device *dev, struct device_driver *drv) | 71 | static int iucv_bus_match(struct device *dev, struct device_driver *drv) |
| 73 | { | 72 | { |
| 74 | return 0; | 73 | return 0; |
| 75 | } | 74 | } |
| @@ -78,8 +77,11 @@ struct bus_type iucv_bus = { | |||
| 78 | .name = "iucv", | 77 | .name = "iucv", |
| 79 | .match = iucv_bus_match, | 78 | .match = iucv_bus_match, |
| 80 | }; | 79 | }; |
| 80 | EXPORT_SYMBOL(iucv_bus); | ||
| 81 | 81 | ||
| 82 | struct device *iucv_root; | 82 | struct device *iucv_root; |
| 83 | EXPORT_SYMBOL(iucv_root); | ||
| 84 | |||
| 83 | static int iucv_available; | 85 | static int iucv_available; |
| 84 | 86 | ||
| 85 | /* General IUCV interrupt structure */ | 87 | /* General IUCV interrupt structure */ |
| @@ -405,7 +407,7 @@ static void iucv_declare_cpu(void *data) | |||
| 405 | rc = iucv_call_b2f0(IUCV_DECLARE_BUFFER, parm); | 407 | rc = iucv_call_b2f0(IUCV_DECLARE_BUFFER, parm); |
| 406 | if (rc) { | 408 | if (rc) { |
| 407 | char *err = "Unknown"; | 409 | char *err = "Unknown"; |
| 408 | switch(rc) { | 410 | switch (rc) { |
| 409 | case 0x03: | 411 | case 0x03: |
| 410 | err = "Directory error"; | 412 | err = "Directory error"; |
| 411 | break; | 413 | break; |
| @@ -588,7 +590,7 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self, | |||
| 588 | return NOTIFY_OK; | 590 | return NOTIFY_OK; |
| 589 | } | 591 | } |
| 590 | 592 | ||
| 591 | static struct notifier_block iucv_cpu_notifier = { | 593 | static struct notifier_block __cpuinitdata iucv_cpu_notifier = { |
| 592 | .notifier_call = iucv_cpu_notify, | 594 | .notifier_call = iucv_cpu_notify, |
| 593 | }; | 595 | }; |
| 594 | 596 | ||
| @@ -691,6 +693,7 @@ out_mutex: | |||
| 691 | mutex_unlock(&iucv_register_mutex); | 693 | mutex_unlock(&iucv_register_mutex); |
| 692 | return rc; | 694 | return rc; |
| 693 | } | 695 | } |
| 696 | EXPORT_SYMBOL(iucv_register); | ||
| 694 | 697 | ||
| 695 | /** | 698 | /** |
| 696 | * iucv_unregister | 699 | * iucv_unregister |
| @@ -723,6 +726,7 @@ void iucv_unregister(struct iucv_handler *handler, int smp) | |||
| 723 | iucv_setmask_mp(); | 726 | iucv_setmask_mp(); |
| 724 | mutex_unlock(&iucv_register_mutex); | 727 | mutex_unlock(&iucv_register_mutex); |
| 725 | } | 728 | } |
| 729 | EXPORT_SYMBOL(iucv_unregister); | ||
| 726 | 730 | ||
| 727 | /** | 731 | /** |
| 728 | * iucv_path_accept | 732 | * iucv_path_accept |
| @@ -761,6 +765,7 @@ int iucv_path_accept(struct iucv_path *path, struct iucv_handler *handler, | |||
| 761 | local_bh_enable(); | 765 | local_bh_enable(); |
| 762 | return rc; | 766 | return rc; |
| 763 | } | 767 | } |
| 768 | EXPORT_SYMBOL(iucv_path_accept); | ||
| 764 | 769 | ||
| 765 | /** | 770 | /** |
| 766 | * iucv_path_connect | 771 | * iucv_path_connect |
| @@ -824,6 +829,7 @@ int iucv_path_connect(struct iucv_path *path, struct iucv_handler *handler, | |||
| 824 | spin_unlock_bh(&iucv_table_lock); | 829 | spin_unlock_bh(&iucv_table_lock); |
| 825 | return rc; | 830 | return rc; |
| 826 | } | 831 | } |
| 832 | EXPORT_SYMBOL(iucv_path_connect); | ||
| 827 | 833 | ||
| 828 | /** | 834 | /** |
| 829 | * iucv_path_quiesce: | 835 | * iucv_path_quiesce: |
| @@ -850,6 +856,7 @@ int iucv_path_quiesce(struct iucv_path *path, u8 userdata[16]) | |||
| 850 | local_bh_enable(); | 856 | local_bh_enable(); |
| 851 | return rc; | 857 | return rc; |
| 852 | } | 858 | } |
| 859 | EXPORT_SYMBOL(iucv_path_quiesce); | ||
| 853 | 860 | ||
| 854 | /** | 861 | /** |
| 855 | * iucv_path_resume: | 862 | * iucv_path_resume: |
| @@ -890,7 +897,6 @@ int iucv_path_sever(struct iucv_path *path, u8 userdata[16]) | |||
| 890 | { | 897 | { |
| 891 | int rc; | 898 | int rc; |
| 892 | 899 | ||
| 893 | |||
| 894 | preempt_disable(); | 900 | preempt_disable(); |
| 895 | if (iucv_active_cpu != smp_processor_id()) | 901 | if (iucv_active_cpu != smp_processor_id()) |
| 896 | spin_lock_bh(&iucv_table_lock); | 902 | spin_lock_bh(&iucv_table_lock); |
| @@ -904,6 +910,7 @@ int iucv_path_sever(struct iucv_path *path, u8 userdata[16]) | |||
| 904 | preempt_enable(); | 910 | preempt_enable(); |
| 905 | return rc; | 911 | return rc; |
| 906 | } | 912 | } |
| 913 | EXPORT_SYMBOL(iucv_path_sever); | ||
| 907 | 914 | ||
| 908 | /** | 915 | /** |
| 909 | * iucv_message_purge | 916 | * iucv_message_purge |
| @@ -936,6 +943,7 @@ int iucv_message_purge(struct iucv_path *path, struct iucv_message *msg, | |||
| 936 | local_bh_enable(); | 943 | local_bh_enable(); |
| 937 | return rc; | 944 | return rc; |
| 938 | } | 945 | } |
| 946 | EXPORT_SYMBOL(iucv_message_purge); | ||
| 939 | 947 | ||
| 940 | /** | 948 | /** |
| 941 | * iucv_message_receive | 949 | * iucv_message_receive |
| @@ -1006,6 +1014,7 @@ int iucv_message_receive(struct iucv_path *path, struct iucv_message *msg, | |||
| 1006 | local_bh_enable(); | 1014 | local_bh_enable(); |
| 1007 | return rc; | 1015 | return rc; |
| 1008 | } | 1016 | } |
| 1017 | EXPORT_SYMBOL(iucv_message_receive); | ||
| 1009 | 1018 | ||
| 1010 | /** | 1019 | /** |
| 1011 | * iucv_message_reject | 1020 | * iucv_message_reject |
| @@ -1034,6 +1043,7 @@ int iucv_message_reject(struct iucv_path *path, struct iucv_message *msg) | |||
| 1034 | local_bh_enable(); | 1043 | local_bh_enable(); |
| 1035 | return rc; | 1044 | return rc; |
| 1036 | } | 1045 | } |
| 1046 | EXPORT_SYMBOL(iucv_message_reject); | ||
| 1037 | 1047 | ||
| 1038 | /** | 1048 | /** |
| 1039 | * iucv_message_reply | 1049 | * iucv_message_reply |
| @@ -1077,6 +1087,7 @@ int iucv_message_reply(struct iucv_path *path, struct iucv_message *msg, | |||
| 1077 | local_bh_enable(); | 1087 | local_bh_enable(); |
| 1078 | return rc; | 1088 | return rc; |
| 1079 | } | 1089 | } |
| 1090 | EXPORT_SYMBOL(iucv_message_reply); | ||
| 1080 | 1091 | ||
| 1081 | /** | 1092 | /** |
| 1082 | * iucv_message_send | 1093 | * iucv_message_send |
| @@ -1125,6 +1136,7 @@ int iucv_message_send(struct iucv_path *path, struct iucv_message *msg, | |||
| 1125 | local_bh_enable(); | 1136 | local_bh_enable(); |
| 1126 | return rc; | 1137 | return rc; |
| 1127 | } | 1138 | } |
| 1139 | EXPORT_SYMBOL(iucv_message_send); | ||
| 1128 | 1140 | ||
| 1129 | /** | 1141 | /** |
| 1130 | * iucv_message_send2way | 1142 | * iucv_message_send2way |
| @@ -1181,6 +1193,7 @@ int iucv_message_send2way(struct iucv_path *path, struct iucv_message *msg, | |||
| 1181 | local_bh_enable(); | 1193 | local_bh_enable(); |
| 1182 | return rc; | 1194 | return rc; |
| 1183 | } | 1195 | } |
| 1196 | EXPORT_SYMBOL(iucv_message_send2way); | ||
| 1184 | 1197 | ||
| 1185 | /** | 1198 | /** |
| 1186 | * iucv_path_pending | 1199 | * iucv_path_pending |
| @@ -1572,7 +1585,7 @@ static void iucv_external_interrupt(u16 code) | |||
| 1572 | * | 1585 | * |
| 1573 | * Allocates and initializes various data structures. | 1586 | * Allocates and initializes various data structures. |
| 1574 | */ | 1587 | */ |
| 1575 | static int iucv_init(void) | 1588 | static int __init iucv_init(void) |
| 1576 | { | 1589 | { |
| 1577 | int rc; | 1590 | int rc; |
| 1578 | 1591 | ||
| @@ -1583,7 +1596,7 @@ static int iucv_init(void) | |||
| 1583 | rc = iucv_query_maxconn(); | 1596 | rc = iucv_query_maxconn(); |
| 1584 | if (rc) | 1597 | if (rc) |
| 1585 | goto out; | 1598 | goto out; |
| 1586 | rc = register_external_interrupt (0x4000, iucv_external_interrupt); | 1599 | rc = register_external_interrupt(0x4000, iucv_external_interrupt); |
| 1587 | if (rc) | 1600 | if (rc) |
| 1588 | goto out; | 1601 | goto out; |
| 1589 | rc = bus_register(&iucv_bus); | 1602 | rc = bus_register(&iucv_bus); |
| @@ -1594,7 +1607,7 @@ static int iucv_init(void) | |||
| 1594 | rc = PTR_ERR(iucv_root); | 1607 | rc = PTR_ERR(iucv_root); |
| 1595 | goto out_bus; | 1608 | goto out_bus; |
| 1596 | } | 1609 | } |
| 1597 | /* Note: GFP_DMA used used to get memory below 2G */ | 1610 | /* Note: GFP_DMA used to get memory below 2G */ |
| 1598 | iucv_irq_data = percpu_alloc(sizeof(struct iucv_irq_data), | 1611 | iucv_irq_data = percpu_alloc(sizeof(struct iucv_irq_data), |
| 1599 | GFP_KERNEL|GFP_DMA); | 1612 | GFP_KERNEL|GFP_DMA); |
| 1600 | if (!iucv_irq_data) { | 1613 | if (!iucv_irq_data) { |
| @@ -1632,7 +1645,7 @@ out: | |||
| 1632 | * | 1645 | * |
| 1633 | * Frees everything allocated from iucv_init. | 1646 | * Frees everything allocated from iucv_init. |
| 1634 | */ | 1647 | */ |
| 1635 | static void iucv_exit(void) | 1648 | static void __exit iucv_exit(void) |
| 1636 | { | 1649 | { |
| 1637 | struct iucv_irq_list *p, *n; | 1650 | struct iucv_irq_list *p, *n; |
| 1638 | 1651 | ||
| @@ -1653,24 +1666,6 @@ static void iucv_exit(void) | |||
| 1653 | subsys_initcall(iucv_init); | 1666 | subsys_initcall(iucv_init); |
| 1654 | module_exit(iucv_exit); | 1667 | module_exit(iucv_exit); |
| 1655 | 1668 | ||
| 1656 | /** | ||
| 1657 | * Export all public stuff | ||
| 1658 | */ | ||
| 1659 | EXPORT_SYMBOL (iucv_bus); | ||
| 1660 | EXPORT_SYMBOL (iucv_root); | ||
| 1661 | EXPORT_SYMBOL (iucv_register); | ||
| 1662 | EXPORT_SYMBOL (iucv_unregister); | ||
| 1663 | EXPORT_SYMBOL (iucv_path_accept); | ||
| 1664 | EXPORT_SYMBOL (iucv_path_connect); | ||
| 1665 | EXPORT_SYMBOL (iucv_path_quiesce); | ||
| 1666 | EXPORT_SYMBOL (iucv_path_sever); | ||
| 1667 | EXPORT_SYMBOL (iucv_message_purge); | ||
| 1668 | EXPORT_SYMBOL (iucv_message_receive); | ||
| 1669 | EXPORT_SYMBOL (iucv_message_reject); | ||
| 1670 | EXPORT_SYMBOL (iucv_message_reply); | ||
| 1671 | EXPORT_SYMBOL (iucv_message_send); | ||
| 1672 | EXPORT_SYMBOL (iucv_message_send2way); | ||
| 1673 | |||
| 1674 | MODULE_AUTHOR("(C) 2001 IBM Corp. by Fritz Elfert (felfert@millenux.com)"); | 1669 | MODULE_AUTHOR("(C) 2001 IBM Corp. by Fritz Elfert (felfert@millenux.com)"); |
| 1675 | MODULE_DESCRIPTION("Linux for S/390 IUCV lowlevel driver"); | 1670 | MODULE_DESCRIPTION("Linux for S/390 IUCV lowlevel driver"); |
| 1676 | MODULE_LICENSE("GPL"); | 1671 | MODULE_LICENSE("GPL"); |
