nfsd: track last inode only in use_wgather case
[safe/jmp/linux-2.6] / include / net / udp.h
index 93796be..90e6ce5 100644 (file)
@@ -50,8 +50,15 @@ struct udp_skb_cb {
 };
 #define UDP_SKB_CB(__skb)      ((struct udp_skb_cb *)((__skb)->cb))
 
-extern struct hlist_head udp_hash[UDP_HTABLE_SIZE];
-extern rwlock_t udp_hash_lock;
+struct udp_hslot {
+       struct hlist_nulls_head head;
+       spinlock_t              lock;
+} __attribute__((aligned(2 * sizeof(long))));
+struct udp_table {
+       struct udp_hslot        hash[UDP_HTABLE_SIZE];
+};
+extern struct udp_table udp_table;
+extern void udp_table_init(struct udp_table *);
 
 
 /* Note: this must match 'valbool' in sock_setsockopt */
@@ -110,21 +117,15 @@ static inline void udp_lib_hash(struct sock *sk)
        BUG();
 }
 
-static inline void udp_lib_unhash(struct sock *sk)
-{
-       write_lock_bh(&udp_hash_lock);
-       if (sk_del_node_init(sk)) {
-               inet_sk(sk)->num = 0;
-               sock_prot_dec_use(sk->sk_prot);
-       }
-       write_unlock_bh(&udp_hash_lock);
-}
+extern void udp_lib_unhash(struct sock *sk);
 
 static inline void udp_lib_close(struct sock *sk, long timeout)
 {
        sk_common_release(sk);
 }
 
+extern int     udp_lib_get_port(struct sock *sk, unsigned short snum,
+               int (*)(const struct sock*,const struct sock*));
 
 /* net/ipv4/udp.c */
 extern int     udp_get_port(struct sock *sk, unsigned short snum,
@@ -133,6 +134,7 @@ extern void udp_err(struct sk_buff *, u32);
 
 extern int     udp_sendmsg(struct kiocb *iocb, struct sock *sk,
                            struct msghdr *msg, size_t len);
+extern void    udp_flush_pending_frames(struct sock *sk);
 
 extern int     udp_rcv(struct sk_buff *skb);
 extern int     udp_ioctl(struct sock *sk, int cmd, unsigned long arg);
@@ -145,62 +147,60 @@ extern int        udp_lib_setsockopt(struct sock *sk, int level, int optname,
                                   char __user *optval, int optlen,
                                   int (*push_pending_frames)(struct sock *));
 
-DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
-DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
-
-/* UDP-Lite does not have a standardized MIB yet, so we inherit from UDP */
-DECLARE_SNMP_STAT(struct udp_mib, udplite_statistics);
-DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
+extern struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
+                                   __be32 daddr, __be16 dport,
+                                   int dif);
 
 /*
  *     SNMP statistics for UDP and UDP-Lite
  */
-#define UDP_INC_STATS_USER(field, is_udplite)                         do {   \
-       if (is_udplite) SNMP_INC_STATS_USER(udplite_statistics, field);       \
-       else            SNMP_INC_STATS_USER(udp_statistics, field);  }  while(0)
-#define UDP_INC_STATS_BH(field, is_udplite)                           do  {  \
-       if (is_udplite) SNMP_INC_STATS_BH(udplite_statistics, field);         \
-       else            SNMP_INC_STATS_BH(udp_statistics, field);    }  while(0)
-
-#define UDP6_INC_STATS_BH(field, is_udplite)                         do  {  \
-       if (is_udplite) SNMP_INC_STATS_BH(udplite_stats_in6, field);         \
-       else            SNMP_INC_STATS_BH(udp_stats_in6, field);    } while(0)
-#define UDP6_INC_STATS_USER(field, is_udplite)                        do {    \
-       if (is_udplite) SNMP_INC_STATS_USER(udplite_stats_in6, field);         \
-       else            SNMP_INC_STATS_USER(udp_stats_in6, field);    } while(0)
+#define UDP_INC_STATS_USER(net, field, is_udplite)           do { \
+       if (is_udplite) SNMP_INC_STATS_USER((net)->mib.udplite_statistics, field);       \
+       else            SNMP_INC_STATS_USER((net)->mib.udp_statistics, field);  }  while(0)
+#define UDP_INC_STATS_BH(net, field, is_udplite)             do { \
+       if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_statistics, field);         \
+       else            SNMP_INC_STATS_BH((net)->mib.udp_statistics, field);    }  while(0)
+
+#define UDP6_INC_STATS_BH(net, field, is_udplite)          do { \
+       if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_stats_in6, field);\
+       else            SNMP_INC_STATS_BH((net)->mib.udp_stats_in6, field);  \
+} while(0)
+#define UDP6_INC_STATS_USER(net, field, __lite)                    do { \
+       if (__lite) SNMP_INC_STATS_USER((net)->mib.udplite_stats_in6, field);  \
+       else        SNMP_INC_STATS_USER((net)->mib.udp_stats_in6, field);      \
+} while(0)
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 #define UDPX_INC_STATS_BH(sk, field) \
        do { \
                if ((sk)->sk_family == AF_INET) \
-                       UDP_INC_STATS_BH(field, 0); \
+                       UDP_INC_STATS_BH(sock_net(sk), field, 0); \
                else \
-                       UDP6_INC_STATS_BH(field, 0); \
+                       UDP6_INC_STATS_BH(sock_net(sk), field, 0); \
        } while (0);
 #else
-#define UDPX_INC_STATS_BH(sk, field) UDP_INC_STATS_BH(field, 0)
+#define UDPX_INC_STATS_BH(sk, field) UDP_INC_STATS_BH(sock_net(sk), field, 0)
 #endif
 
 /* /proc */
 struct udp_seq_afinfo {
-       struct module           *owner;
        char                    *name;
        sa_family_t             family;
-       struct hlist_head       *hashtable;
-       int                     (*seq_show) (struct seq_file *m, void *v);
-       struct file_operations  *seq_fops;
+       struct udp_table        *udp_table;
+       struct file_operations  seq_fops;
+       struct seq_operations   seq_ops;
 };
 
 struct udp_iter_state {
+       struct seq_net_private  p;
        sa_family_t             family;
-       struct hlist_head       *hashtable;
        int                     bucket;
-       struct seq_operations   seq_ops;
+       struct udp_table        *udp_table;
 };
 
 #ifdef CONFIG_PROC_FS
-extern int udp_proc_register(struct udp_seq_afinfo *afinfo);
-extern void udp_proc_unregister(struct udp_seq_afinfo *afinfo);
+extern int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo);
+extern void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo);
 
 extern int  udp4_proc_init(void);
 extern void udp4_proc_exit(void);