diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/namei.h | 8 | ||||
-rw-r--r-- | include/linux/nfs_fs.h | 4 | ||||
-rw-r--r-- | include/linux/nfs_xdr.h | 36 | ||||
-rw-r--r-- | include/linux/sunrpc/debug.h | 3 | ||||
-rw-r--r-- | include/linux/sunrpc/msg_prot.h | 25 | ||||
-rw-r--r-- | include/linux/sunrpc/xdr.h | 6 | ||||
-rw-r--r-- | include/linux/sunrpc/xprt.h | 222 |
7 files changed, 198 insertions, 106 deletions
diff --git a/include/linux/namei.h b/include/linux/namei.h index 7db67b008cac..1c975d0d9e94 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
@@ -8,6 +8,7 @@ struct vfsmount; | |||
8 | struct open_intent { | 8 | struct open_intent { |
9 | int flags; | 9 | int flags; |
10 | int create_mode; | 10 | int create_mode; |
11 | struct file *file; | ||
11 | }; | 12 | }; |
12 | 13 | ||
13 | enum { MAX_NESTED_LINKS = 5 }; | 14 | enum { MAX_NESTED_LINKS = 5 }; |
@@ -65,6 +66,13 @@ extern int FASTCALL(link_path_walk(const char *, struct nameidata *)); | |||
65 | extern void path_release(struct nameidata *); | 66 | extern void path_release(struct nameidata *); |
66 | extern void path_release_on_umount(struct nameidata *); | 67 | extern void path_release_on_umount(struct nameidata *); |
67 | 68 | ||
69 | extern int __user_path_lookup_open(const char __user *, unsigned lookup_flags, struct nameidata *nd, int open_flags); | ||
70 | extern int path_lookup_open(const char *, unsigned lookup_flags, struct nameidata *, int open_flags); | ||
71 | extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry, | ||
72 | int (*open)(struct inode *, struct file *)); | ||
73 | extern struct file *nameidata_to_filp(struct nameidata *nd, int flags); | ||
74 | extern void release_open_intent(struct nameidata *); | ||
75 | |||
68 | extern struct dentry * lookup_one_len(const char *, struct dentry *, int); | 76 | extern struct dentry * lookup_one_len(const char *, struct dentry *, int); |
69 | extern struct dentry * lookup_hash(struct qstr *, struct dentry *); | 77 | extern struct dentry * lookup_hash(struct qstr *, struct dentry *); |
70 | 78 | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 9a6047ff1b25..7bac2785c6e4 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -41,6 +41,10 @@ | |||
41 | #define NFS_MAX_FILE_IO_BUFFER_SIZE 32768 | 41 | #define NFS_MAX_FILE_IO_BUFFER_SIZE 32768 |
42 | #define NFS_DEF_FILE_IO_BUFFER_SIZE 4096 | 42 | #define NFS_DEF_FILE_IO_BUFFER_SIZE 4096 |
43 | 43 | ||
44 | /* Default timeout values */ | ||
45 | #define NFS_MAX_UDP_TIMEOUT (60*HZ) | ||
46 | #define NFS_MAX_TCP_TIMEOUT (600*HZ) | ||
47 | |||
44 | /* | 48 | /* |
45 | * superblock magic number for NFS | 49 | * superblock magic number for NFS |
46 | */ | 50 | */ |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index a2bf6914ff1b..60086dac11d5 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -96,12 +96,13 @@ struct nfs4_change_info { | |||
96 | u64 after; | 96 | u64 after; |
97 | }; | 97 | }; |
98 | 98 | ||
99 | struct nfs_seqid; | ||
99 | /* | 100 | /* |
100 | * Arguments to the open call. | 101 | * Arguments to the open call. |
101 | */ | 102 | */ |
102 | struct nfs_openargs { | 103 | struct nfs_openargs { |
103 | const struct nfs_fh * fh; | 104 | const struct nfs_fh * fh; |
104 | __u32 seqid; | 105 | struct nfs_seqid * seqid; |
105 | int open_flags; | 106 | int open_flags; |
106 | __u64 clientid; | 107 | __u64 clientid; |
107 | __u32 id; | 108 | __u32 id; |
@@ -136,7 +137,7 @@ struct nfs_openres { | |||
136 | struct nfs_open_confirmargs { | 137 | struct nfs_open_confirmargs { |
137 | const struct nfs_fh * fh; | 138 | const struct nfs_fh * fh; |
138 | nfs4_stateid stateid; | 139 | nfs4_stateid stateid; |
139 | __u32 seqid; | 140 | struct nfs_seqid * seqid; |
140 | }; | 141 | }; |
141 | 142 | ||
142 | struct nfs_open_confirmres { | 143 | struct nfs_open_confirmres { |
@@ -148,8 +149,8 @@ struct nfs_open_confirmres { | |||
148 | */ | 149 | */ |
149 | struct nfs_closeargs { | 150 | struct nfs_closeargs { |
150 | struct nfs_fh * fh; | 151 | struct nfs_fh * fh; |
151 | nfs4_stateid stateid; | 152 | nfs4_stateid * stateid; |
152 | __u32 seqid; | 153 | struct nfs_seqid * seqid; |
153 | int open_flags; | 154 | int open_flags; |
154 | }; | 155 | }; |
155 | 156 | ||
@@ -164,30 +165,19 @@ struct nfs_lowner { | |||
164 | u32 id; | 165 | u32 id; |
165 | }; | 166 | }; |
166 | 167 | ||
167 | struct nfs_open_to_lock { | ||
168 | __u32 open_seqid; | ||
169 | nfs4_stateid open_stateid; | ||
170 | __u32 lock_seqid; | ||
171 | struct nfs_lowner lock_owner; | ||
172 | }; | ||
173 | |||
174 | struct nfs_exist_lock { | ||
175 | nfs4_stateid stateid; | ||
176 | __u32 seqid; | ||
177 | }; | ||
178 | |||
179 | struct nfs_lock_opargs { | 168 | struct nfs_lock_opargs { |
169 | struct nfs_seqid * lock_seqid; | ||
170 | nfs4_stateid * lock_stateid; | ||
171 | struct nfs_seqid * open_seqid; | ||
172 | nfs4_stateid * open_stateid; | ||
173 | struct nfs_lowner lock_owner; | ||
180 | __u32 reclaim; | 174 | __u32 reclaim; |
181 | __u32 new_lock_owner; | 175 | __u32 new_lock_owner; |
182 | union { | ||
183 | struct nfs_open_to_lock *open_lock; | ||
184 | struct nfs_exist_lock *exist_lock; | ||
185 | } u; | ||
186 | }; | 176 | }; |
187 | 177 | ||
188 | struct nfs_locku_opargs { | 178 | struct nfs_locku_opargs { |
189 | __u32 seqid; | 179 | struct nfs_seqid * seqid; |
190 | nfs4_stateid stateid; | 180 | nfs4_stateid * stateid; |
191 | }; | 181 | }; |
192 | 182 | ||
193 | struct nfs_lockargs { | 183 | struct nfs_lockargs { |
@@ -722,7 +712,7 @@ struct nfs_rpc_ops { | |||
722 | int (*write) (struct nfs_write_data *); | 712 | int (*write) (struct nfs_write_data *); |
723 | int (*commit) (struct nfs_write_data *); | 713 | int (*commit) (struct nfs_write_data *); |
724 | int (*create) (struct inode *, struct dentry *, | 714 | int (*create) (struct inode *, struct dentry *, |
725 | struct iattr *, int); | 715 | struct iattr *, int, struct nameidata *); |
726 | int (*remove) (struct inode *, struct qstr *); | 716 | int (*remove) (struct inode *, struct qstr *); |
727 | int (*unlink_setup) (struct rpc_message *, | 717 | int (*unlink_setup) (struct rpc_message *, |
728 | struct dentry *, struct qstr *); | 718 | struct dentry *, struct qstr *); |
diff --git a/include/linux/sunrpc/debug.h b/include/linux/sunrpc/debug.h index eadb31e3c198..1a42d902bc11 100644 --- a/include/linux/sunrpc/debug.h +++ b/include/linux/sunrpc/debug.h | |||
@@ -32,6 +32,7 @@ | |||
32 | #define RPCDBG_AUTH 0x0010 | 32 | #define RPCDBG_AUTH 0x0010 |
33 | #define RPCDBG_PMAP 0x0020 | 33 | #define RPCDBG_PMAP 0x0020 |
34 | #define RPCDBG_SCHED 0x0040 | 34 | #define RPCDBG_SCHED 0x0040 |
35 | #define RPCDBG_TRANS 0x0080 | ||
35 | #define RPCDBG_SVCSOCK 0x0100 | 36 | #define RPCDBG_SVCSOCK 0x0100 |
36 | #define RPCDBG_SVCDSP 0x0200 | 37 | #define RPCDBG_SVCDSP 0x0200 |
37 | #define RPCDBG_MISC 0x0400 | 38 | #define RPCDBG_MISC 0x0400 |
@@ -94,6 +95,8 @@ enum { | |||
94 | CTL_NLMDEBUG, | 95 | CTL_NLMDEBUG, |
95 | CTL_SLOTTABLE_UDP, | 96 | CTL_SLOTTABLE_UDP, |
96 | CTL_SLOTTABLE_TCP, | 97 | CTL_SLOTTABLE_TCP, |
98 | CTL_MIN_RESVPORT, | ||
99 | CTL_MAX_RESVPORT, | ||
97 | }; | 100 | }; |
98 | 101 | ||
99 | #endif /* _LINUX_SUNRPC_DEBUG_H_ */ | 102 | #endif /* _LINUX_SUNRPC_DEBUG_H_ */ |
diff --git a/include/linux/sunrpc/msg_prot.h b/include/linux/sunrpc/msg_prot.h index 15f115332389..f43f237360ae 100644 --- a/include/linux/sunrpc/msg_prot.h +++ b/include/linux/sunrpc/msg_prot.h | |||
@@ -76,5 +76,30 @@ enum rpc_auth_stat { | |||
76 | 76 | ||
77 | #define RPC_MAXNETNAMELEN 256 | 77 | #define RPC_MAXNETNAMELEN 256 |
78 | 78 | ||
79 | /* | ||
80 | * From RFC 1831: | ||
81 | * | ||
82 | * "A record is composed of one or more record fragments. A record | ||
83 | * fragment is a four-byte header followed by 0 to (2**31) - 1 bytes of | ||
84 | * fragment data. The bytes encode an unsigned binary number; as with | ||
85 | * XDR integers, the byte order is from highest to lowest. The number | ||
86 | * encodes two values -- a boolean which indicates whether the fragment | ||
87 | * is the last fragment of the record (bit value 1 implies the fragment | ||
88 | * is the last fragment) and a 31-bit unsigned binary value which is the | ||
89 | * length in bytes of the fragment's data. The boolean value is the | ||
90 | * highest-order bit of the header; the length is the 31 low-order bits. | ||
91 | * (Note that this record specification is NOT in XDR standard form!)" | ||
92 | * | ||
93 | * The Linux RPC client always sends its requests in a single record | ||
94 | * fragment, limiting the maximum payload size for stream transports to | ||
95 | * 2GB. | ||
96 | */ | ||
97 | |||
98 | typedef u32 rpc_fraghdr; | ||
99 | |||
100 | #define RPC_LAST_STREAM_FRAGMENT (1U << 31) | ||
101 | #define RPC_FRAGMENT_SIZE_MASK (~RPC_LAST_STREAM_FRAGMENT) | ||
102 | #define RPC_MAX_FRAGMENT_SIZE ((1U << 31) - 1) | ||
103 | |||
79 | #endif /* __KERNEL__ */ | 104 | #endif /* __KERNEL__ */ |
80 | #endif /* _LINUX_SUNRPC_MSGPROT_H_ */ | 105 | #endif /* _LINUX_SUNRPC_MSGPROT_H_ */ |
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 23448d0fb5bc..5da968729cf8 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h | |||
@@ -161,14 +161,10 @@ typedef struct { | |||
161 | 161 | ||
162 | typedef size_t (*skb_read_actor_t)(skb_reader_t *desc, void *to, size_t len); | 162 | typedef size_t (*skb_read_actor_t)(skb_reader_t *desc, void *to, size_t len); |
163 | 163 | ||
164 | extern int csum_partial_copy_to_xdr(struct xdr_buf *, struct sk_buff *); | ||
164 | extern ssize_t xdr_partial_copy_from_skb(struct xdr_buf *, unsigned int, | 165 | extern ssize_t xdr_partial_copy_from_skb(struct xdr_buf *, unsigned int, |
165 | skb_reader_t *, skb_read_actor_t); | 166 | skb_reader_t *, skb_read_actor_t); |
166 | 167 | ||
167 | struct socket; | ||
168 | struct sockaddr; | ||
169 | extern int xdr_sendpages(struct socket *, struct sockaddr *, int, | ||
170 | struct xdr_buf *, unsigned int, int); | ||
171 | |||
172 | extern int xdr_encode_word(struct xdr_buf *, int, u32); | 168 | extern int xdr_encode_word(struct xdr_buf *, int, u32); |
173 | extern int xdr_decode_word(struct xdr_buf *, int, u32 *); | 169 | extern int xdr_decode_word(struct xdr_buf *, int, u32 *); |
174 | 170 | ||
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index e618c1649814..068e1fb0868b 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/include/linux/sunrpc/clnt_xprt.h | 2 | * linux/include/linux/sunrpc/xprt.h |
3 | * | 3 | * |
4 | * Declarations for the RPC transport interface. | 4 | * Declarations for the RPC transport interface. |
5 | * | 5 | * |
@@ -15,20 +15,6 @@ | |||
15 | #include <linux/sunrpc/sched.h> | 15 | #include <linux/sunrpc/sched.h> |
16 | #include <linux/sunrpc/xdr.h> | 16 | #include <linux/sunrpc/xdr.h> |
17 | 17 | ||
18 | /* | ||
19 | * The transport code maintains an estimate on the maximum number of out- | ||
20 | * standing RPC requests, using a smoothed version of the congestion | ||
21 | * avoidance implemented in 44BSD. This is basically the Van Jacobson | ||
22 | * congestion algorithm: If a retransmit occurs, the congestion window is | ||
23 | * halved; otherwise, it is incremented by 1/cwnd when | ||
24 | * | ||
25 | * - a reply is received and | ||
26 | * - a full number of requests are outstanding and | ||
27 | * - the congestion window hasn't been updated recently. | ||
28 | * | ||
29 | * Upper procedures may check whether a request would block waiting for | ||
30 | * a free RPC slot by using the RPC_CONGESTED() macro. | ||
31 | */ | ||
32 | extern unsigned int xprt_udp_slot_table_entries; | 18 | extern unsigned int xprt_udp_slot_table_entries; |
33 | extern unsigned int xprt_tcp_slot_table_entries; | 19 | extern unsigned int xprt_tcp_slot_table_entries; |
34 | 20 | ||
@@ -36,34 +22,23 @@ extern unsigned int xprt_tcp_slot_table_entries; | |||
36 | #define RPC_DEF_SLOT_TABLE (16U) | 22 | #define RPC_DEF_SLOT_TABLE (16U) |
37 | #define RPC_MAX_SLOT_TABLE (128U) | 23 | #define RPC_MAX_SLOT_TABLE (128U) |
38 | 24 | ||
39 | #define RPC_CWNDSHIFT (8U) | ||
40 | #define RPC_CWNDSCALE (1U << RPC_CWNDSHIFT) | ||
41 | #define RPC_INITCWND RPC_CWNDSCALE | ||
42 | #define RPC_MAXCWND(xprt) ((xprt)->max_reqs << RPC_CWNDSHIFT) | ||
43 | #define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd) | ||
44 | |||
45 | /* Default timeout values */ | ||
46 | #define RPC_MAX_UDP_TIMEOUT (60*HZ) | ||
47 | #define RPC_MAX_TCP_TIMEOUT (600*HZ) | ||
48 | |||
49 | /* | 25 | /* |
50 | * Wait duration for an RPC TCP connection to be established. Solaris | 26 | * RPC call and reply header size as number of 32bit words (verifier |
51 | * NFS over TCP uses 60 seconds, for example, which is in line with how | 27 | * size computed separately) |
52 | * long a server takes to reboot. | ||
53 | */ | 28 | */ |
54 | #define RPC_CONNECT_TIMEOUT (60*HZ) | 29 | #define RPC_CALLHDRSIZE 6 |
30 | #define RPC_REPHDRSIZE 4 | ||
55 | 31 | ||
56 | /* | 32 | /* |
57 | * Delay an arbitrary number of seconds before attempting to reconnect | 33 | * Parameters for choosing a free port |
58 | * after an error. | ||
59 | */ | 34 | */ |
60 | #define RPC_REESTABLISH_TIMEOUT (15*HZ) | 35 | extern unsigned int xprt_min_resvport; |
36 | extern unsigned int xprt_max_resvport; | ||
61 | 37 | ||
62 | /* RPC call and reply header size as number of 32bit words (verifier | 38 | #define RPC_MIN_RESVPORT (1U) |
63 | * size computed separately) | 39 | #define RPC_MAX_RESVPORT (65535U) |
64 | */ | 40 | #define RPC_DEF_MIN_RESVPORT (650U) |
65 | #define RPC_CALLHDRSIZE 6 | 41 | #define RPC_DEF_MAX_RESVPORT (1023U) |
66 | #define RPC_REPHDRSIZE 4 | ||
67 | 42 | ||
68 | /* | 43 | /* |
69 | * This describes a timeout strategy | 44 | * This describes a timeout strategy |
@@ -76,6 +51,9 @@ struct rpc_timeout { | |||
76 | unsigned char to_exponential; | 51 | unsigned char to_exponential; |
77 | }; | 52 | }; |
78 | 53 | ||
54 | struct rpc_task; | ||
55 | struct rpc_xprt; | ||
56 | |||
79 | /* | 57 | /* |
80 | * This describes a complete RPC request | 58 | * This describes a complete RPC request |
81 | */ | 59 | */ |
@@ -121,12 +99,21 @@ struct rpc_rqst { | |||
121 | #define rq_svec rq_snd_buf.head | 99 | #define rq_svec rq_snd_buf.head |
122 | #define rq_slen rq_snd_buf.len | 100 | #define rq_slen rq_snd_buf.len |
123 | 101 | ||
124 | #define XPRT_LAST_FRAG (1 << 0) | 102 | struct rpc_xprt_ops { |
125 | #define XPRT_COPY_RECM (1 << 1) | 103 | void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); |
126 | #define XPRT_COPY_XID (1 << 2) | 104 | int (*reserve_xprt)(struct rpc_task *task); |
127 | #define XPRT_COPY_DATA (1 << 3) | 105 | void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
106 | void (*connect)(struct rpc_task *task); | ||
107 | int (*send_request)(struct rpc_task *task); | ||
108 | void (*set_retrans_timeout)(struct rpc_task *task); | ||
109 | void (*timer)(struct rpc_task *task); | ||
110 | void (*release_request)(struct rpc_task *task); | ||
111 | void (*close)(struct rpc_xprt *xprt); | ||
112 | void (*destroy)(struct rpc_xprt *xprt); | ||
113 | }; | ||
128 | 114 | ||
129 | struct rpc_xprt { | 115 | struct rpc_xprt { |
116 | struct rpc_xprt_ops * ops; /* transport methods */ | ||
130 | struct socket * sock; /* BSD socket layer */ | 117 | struct socket * sock; /* BSD socket layer */ |
131 | struct sock * inet; /* INET layer */ | 118 | struct sock * inet; /* INET layer */ |
132 | 119 | ||
@@ -137,11 +124,13 @@ struct rpc_xprt { | |||
137 | unsigned long cong; /* current congestion */ | 124 | unsigned long cong; /* current congestion */ |
138 | unsigned long cwnd; /* congestion window */ | 125 | unsigned long cwnd; /* congestion window */ |
139 | 126 | ||
140 | unsigned int rcvsize, /* socket receive buffer size */ | 127 | size_t rcvsize, /* transport rcv buffer size */ |
141 | sndsize; /* socket send buffer size */ | 128 | sndsize; /* transport send buffer size */ |
142 | 129 | ||
143 | size_t max_payload; /* largest RPC payload size, | 130 | size_t max_payload; /* largest RPC payload size, |
144 | in bytes */ | 131 | in bytes */ |
132 | unsigned int tsh_size; /* size of transport specific | ||
133 | header */ | ||
145 | 134 | ||
146 | struct rpc_wait_queue sending; /* requests waiting to send */ | 135 | struct rpc_wait_queue sending; /* requests waiting to send */ |
147 | struct rpc_wait_queue resend; /* requests waiting to resend */ | 136 | struct rpc_wait_queue resend; /* requests waiting to resend */ |
@@ -150,11 +139,9 @@ struct rpc_xprt { | |||
150 | struct list_head free; /* free slots */ | 139 | struct list_head free; /* free slots */ |
151 | struct rpc_rqst * slot; /* slot table storage */ | 140 | struct rpc_rqst * slot; /* slot table storage */ |
152 | unsigned int max_reqs; /* total slots */ | 141 | unsigned int max_reqs; /* total slots */ |
153 | unsigned long sockstate; /* Socket state */ | 142 | unsigned long state; /* transport state */ |
154 | unsigned char shutdown : 1, /* being shut down */ | 143 | unsigned char shutdown : 1, /* being shut down */ |
155 | nocong : 1, /* no congestion control */ | 144 | resvport : 1; /* use a reserved port */ |
156 | resvport : 1, /* use a reserved port */ | ||
157 | stream : 1; /* TCP */ | ||
158 | 145 | ||
159 | /* | 146 | /* |
160 | * XID | 147 | * XID |
@@ -171,22 +158,27 @@ struct rpc_xprt { | |||
171 | unsigned long tcp_copied, /* copied to request */ | 158 | unsigned long tcp_copied, /* copied to request */ |
172 | tcp_flags; | 159 | tcp_flags; |
173 | /* | 160 | /* |
174 | * Connection of sockets | 161 | * Connection of transports |
175 | */ | 162 | */ |
176 | struct work_struct sock_connect; | 163 | unsigned long connect_timeout, |
164 | bind_timeout, | ||
165 | reestablish_timeout; | ||
166 | struct work_struct connect_worker; | ||
177 | unsigned short port; | 167 | unsigned short port; |
168 | |||
178 | /* | 169 | /* |
179 | * Disconnection of idle sockets | 170 | * Disconnection of idle transports |
180 | */ | 171 | */ |
181 | struct work_struct task_cleanup; | 172 | struct work_struct task_cleanup; |
182 | struct timer_list timer; | 173 | struct timer_list timer; |
183 | unsigned long last_used; | 174 | unsigned long last_used, |
175 | idle_timeout; | ||
184 | 176 | ||
185 | /* | 177 | /* |
186 | * Send stuff | 178 | * Send stuff |
187 | */ | 179 | */ |
188 | spinlock_t sock_lock; /* lock socket info */ | 180 | spinlock_t transport_lock; /* lock transport info */ |
189 | spinlock_t xprt_lock; /* lock xprt info */ | 181 | spinlock_t reserve_lock; /* lock slot table */ |
190 | struct rpc_task * snd_task; /* Task blocked in send */ | 182 | struct rpc_task * snd_task; /* Task blocked in send */ |
191 | 183 | ||
192 | struct list_head recv; | 184 | struct list_head recv; |
@@ -195,37 +187,111 @@ struct rpc_xprt { | |||
195 | void (*old_data_ready)(struct sock *, int); | 187 | void (*old_data_ready)(struct sock *, int); |
196 | void (*old_state_change)(struct sock *); | 188 | void (*old_state_change)(struct sock *); |
197 | void (*old_write_space)(struct sock *); | 189 | void (*old_write_space)(struct sock *); |
198 | |||
199 | wait_queue_head_t cong_wait; | ||
200 | }; | 190 | }; |
201 | 191 | ||
192 | #define XPRT_LAST_FRAG (1 << 0) | ||
193 | #define XPRT_COPY_RECM (1 << 1) | ||
194 | #define XPRT_COPY_XID (1 << 2) | ||
195 | #define XPRT_COPY_DATA (1 << 3) | ||
196 | |||
202 | #ifdef __KERNEL__ | 197 | #ifdef __KERNEL__ |
203 | 198 | ||
204 | struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr, | 199 | /* |
205 | struct rpc_timeout *toparms); | 200 | * Transport operations used by ULPs |
206 | int xprt_destroy(struct rpc_xprt *); | 201 | */ |
207 | void xprt_set_timeout(struct rpc_timeout *, unsigned int, | 202 | struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr, struct rpc_timeout *to); |
208 | unsigned long); | 203 | void xprt_set_timeout(struct rpc_timeout *to, unsigned int retr, unsigned long incr); |
209 | 204 | ||
210 | void xprt_reserve(struct rpc_task *); | 205 | /* |
211 | int xprt_prepare_transmit(struct rpc_task *); | 206 | * Generic internal transport functions |
212 | void xprt_transmit(struct rpc_task *); | 207 | */ |
213 | void xprt_receive(struct rpc_task *); | 208 | void xprt_connect(struct rpc_task *task); |
209 | void xprt_reserve(struct rpc_task *task); | ||
210 | int xprt_reserve_xprt(struct rpc_task *task); | ||
211 | int xprt_reserve_xprt_cong(struct rpc_task *task); | ||
212 | int xprt_prepare_transmit(struct rpc_task *task); | ||
213 | void xprt_transmit(struct rpc_task *task); | ||
214 | void xprt_abort_transmit(struct rpc_task *task); | ||
214 | int xprt_adjust_timeout(struct rpc_rqst *req); | 215 | int xprt_adjust_timeout(struct rpc_rqst *req); |
215 | void xprt_release(struct rpc_task *); | 216 | void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); |
216 | void xprt_connect(struct rpc_task *); | 217 | void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
217 | void xprt_sock_setbufsize(struct rpc_xprt *); | 218 | void xprt_release(struct rpc_task *task); |
218 | 219 | int xprt_destroy(struct rpc_xprt *xprt); | |
219 | #define XPRT_LOCKED 0 | 220 | |
220 | #define XPRT_CONNECT 1 | 221 | static inline u32 *xprt_skip_transport_header(struct rpc_xprt *xprt, u32 *p) |
221 | #define XPRT_CONNECTING 2 | 222 | { |
222 | 223 | return p + xprt->tsh_size; | |
223 | #define xprt_connected(xp) (test_bit(XPRT_CONNECT, &(xp)->sockstate)) | 224 | } |
224 | #define xprt_set_connected(xp) (set_bit(XPRT_CONNECT, &(xp)->sockstate)) | 225 | |
225 | #define xprt_test_and_set_connected(xp) (test_and_set_bit(XPRT_CONNECT, &(xp)->sockstate)) | 226 | /* |
226 | #define xprt_test_and_clear_connected(xp) \ | 227 | * Transport switch helper functions |
227 | (test_and_clear_bit(XPRT_CONNECT, &(xp)->sockstate)) | 228 | */ |
228 | #define xprt_clear_connected(xp) (clear_bit(XPRT_CONNECT, &(xp)->sockstate)) | 229 | void xprt_set_retrans_timeout_def(struct rpc_task *task); |
230 | void xprt_set_retrans_timeout_rtt(struct rpc_task *task); | ||
231 | void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status); | ||
232 | void xprt_wait_for_buffer_space(struct rpc_task *task); | ||
233 | void xprt_write_space(struct rpc_xprt *xprt); | ||
234 | void xprt_update_rtt(struct rpc_task *task); | ||
235 | void xprt_adjust_cwnd(struct rpc_task *task, int result); | ||
236 | struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid); | ||
237 | void xprt_complete_rqst(struct rpc_task *task, int copied); | ||
238 | void xprt_release_rqst_cong(struct rpc_task *task); | ||
239 | void xprt_disconnect(struct rpc_xprt *xprt); | ||
240 | |||
241 | /* | ||
242 | * Socket transport setup operations | ||
243 | */ | ||
244 | int xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to); | ||
245 | int xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to); | ||
246 | |||
247 | /* | ||
248 | * Reserved bit positions in xprt->state | ||
249 | */ | ||
250 | #define XPRT_LOCKED (0) | ||
251 | #define XPRT_CONNECTED (1) | ||
252 | #define XPRT_CONNECTING (2) | ||
253 | |||
254 | static inline void xprt_set_connected(struct rpc_xprt *xprt) | ||
255 | { | ||
256 | set_bit(XPRT_CONNECTED, &xprt->state); | ||
257 | } | ||
258 | |||
259 | static inline void xprt_clear_connected(struct rpc_xprt *xprt) | ||
260 | { | ||
261 | clear_bit(XPRT_CONNECTED, &xprt->state); | ||
262 | } | ||
263 | |||
264 | static inline int xprt_connected(struct rpc_xprt *xprt) | ||
265 | { | ||
266 | return test_bit(XPRT_CONNECTED, &xprt->state); | ||
267 | } | ||
268 | |||
269 | static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt) | ||
270 | { | ||
271 | return test_and_set_bit(XPRT_CONNECTED, &xprt->state); | ||
272 | } | ||
273 | |||
274 | static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt) | ||
275 | { | ||
276 | return test_and_clear_bit(XPRT_CONNECTED, &xprt->state); | ||
277 | } | ||
278 | |||
279 | static inline void xprt_clear_connecting(struct rpc_xprt *xprt) | ||
280 | { | ||
281 | smp_mb__before_clear_bit(); | ||
282 | clear_bit(XPRT_CONNECTING, &xprt->state); | ||
283 | smp_mb__after_clear_bit(); | ||
284 | } | ||
285 | |||
286 | static inline int xprt_connecting(struct rpc_xprt *xprt) | ||
287 | { | ||
288 | return test_bit(XPRT_CONNECTING, &xprt->state); | ||
289 | } | ||
290 | |||
291 | static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt) | ||
292 | { | ||
293 | return test_and_set_bit(XPRT_CONNECTING, &xprt->state); | ||
294 | } | ||
229 | 295 | ||
230 | #endif /* __KERNEL__*/ | 296 | #endif /* __KERNEL__*/ |
231 | 297 | ||