diff options
| -rw-r--r-- | fs/cifs/cifsproto.h | 4 | ||||
| -rw-r--r-- | fs/cifs/connect.c | 4 | ||||
| -rw-r--r-- | fs/cifs/transport.c | 107 |
3 files changed, 22 insertions, 93 deletions
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 06f6779988bf..382ba6298809 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
| @@ -35,8 +35,8 @@ extern struct smb_hdr *cifs_buf_get(void); | |||
| 35 | extern void cifs_buf_release(void *); | 35 | extern void cifs_buf_release(void *); |
| 36 | extern struct smb_hdr *cifs_small_buf_get(void); | 36 | extern struct smb_hdr *cifs_small_buf_get(void); |
| 37 | extern void cifs_small_buf_release(void *); | 37 | extern void cifs_small_buf_release(void *); |
| 38 | extern int smb_send(struct socket *, struct smb_hdr *, | 38 | extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *, |
| 39 | unsigned int /* length */ , struct sockaddr *, bool); | 39 | unsigned int /* length */); |
| 40 | extern unsigned int _GetXid(void); | 40 | extern unsigned int _GetXid(void); |
| 41 | extern void _FreeXid(unsigned int); | 41 | extern void _FreeXid(unsigned int); |
| 42 | #define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current_fsuid())); | 42 | #define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current_fsuid())); |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index e9ea394ee075..7419576228fb 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -1860,9 +1860,7 @@ ipv4_connect(struct TCP_Server_Info *server) | |||
| 1860 | smb_buf = (struct smb_hdr *)ses_init_buf; | 1860 | smb_buf = (struct smb_hdr *)ses_init_buf; |
| 1861 | /* sizeof RFC1002_SESSION_REQUEST with no scope */ | 1861 | /* sizeof RFC1002_SESSION_REQUEST with no scope */ |
| 1862 | smb_buf->smb_buf_length = 0x81000044; | 1862 | smb_buf->smb_buf_length = 0x81000044; |
| 1863 | rc = smb_send(socket, smb_buf, 0x44, | 1863 | rc = smb_send(server, smb_buf, 0x44); |
| 1864 | (struct sockaddr *) &server->addr.sockAddr, | ||
| 1865 | server->noblocksnd); | ||
| 1866 | kfree(ses_init_buf); | 1864 | kfree(ses_init_buf); |
| 1867 | msleep(1); /* RFC1001 layer in at least one server | 1865 | msleep(1); /* RFC1001 layer in at least one server |
| 1868 | requires very short break before negprot | 1866 | requires very short break before negprot |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 7ebe6599ed3a..2c7efd26992d 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
| @@ -154,81 +154,8 @@ void DeleteTconOplockQEntries(struct cifsTconInfo *tcon) | |||
| 154 | spin_unlock(&GlobalMid_Lock); | 154 | spin_unlock(&GlobalMid_Lock); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | int | ||
| 158 | smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer, | ||
| 159 | unsigned int smb_buf_length, struct sockaddr *sin, bool noblocksnd) | ||
| 160 | { | ||
| 161 | int rc = 0; | ||
| 162 | int i = 0; | ||
| 163 | struct msghdr smb_msg; | ||
| 164 | struct kvec iov; | ||
| 165 | unsigned len = smb_buf_length + 4; | ||
| 166 | |||
| 167 | if (ssocket == NULL) | ||
| 168 | return -ENOTSOCK; /* BB eventually add reconnect code here */ | ||
| 169 | iov.iov_base = smb_buffer; | ||
| 170 | iov.iov_len = len; | ||
| 171 | |||
| 172 | smb_msg.msg_name = sin; | ||
| 173 | smb_msg.msg_namelen = sizeof(struct sockaddr); | ||
| 174 | smb_msg.msg_control = NULL; | ||
| 175 | smb_msg.msg_controllen = 0; | ||
| 176 | if (noblocksnd) | ||
| 177 | smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; | ||
| 178 | else | ||
| 179 | smb_msg.msg_flags = MSG_NOSIGNAL; | ||
| 180 | |||
| 181 | /* smb header is converted in header_assemble. bcc and rest of SMB word | ||
| 182 | area, and byte area if necessary, is converted to littleendian in | ||
| 183 | cifssmb.c and RFC1001 len is converted to bigendian in smb_send | ||
| 184 | Flags2 is converted in SendReceive */ | ||
| 185 | |||
| 186 | smb_buffer->smb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length); | ||
| 187 | cFYI(1, ("Sending smb of length %d", smb_buf_length)); | ||
| 188 | dump_smb(smb_buffer, len); | ||
| 189 | |||
| 190 | while (len > 0) { | ||
| 191 | rc = kernel_sendmsg(ssocket, &smb_msg, &iov, 1, len); | ||
| 192 | if ((rc == -ENOSPC) || (rc == -EAGAIN)) { | ||
| 193 | i++; | ||
| 194 | /* smaller timeout here than send2 since smaller size */ | ||
| 195 | /* Although it may not be required, this also is smaller | ||
| 196 | oplock break time */ | ||
| 197 | if (i > 12) { | ||
| 198 | cERROR(1, | ||
| 199 | ("sends on sock %p stuck for 7 seconds", | ||
| 200 | ssocket)); | ||
| 201 | rc = -EAGAIN; | ||
| 202 | break; | ||
| 203 | } | ||
| 204 | msleep(1 << i); | ||
| 205 | continue; | ||
| 206 | } | ||
| 207 | if (rc < 0) | ||
| 208 | break; | ||
| 209 | else | ||
| 210 | i = 0; /* reset i after each successful send */ | ||
| 211 | iov.iov_base += rc; | ||
| 212 | iov.iov_len -= rc; | ||
| 213 | len -= rc; | ||
| 214 | } | ||
| 215 | |||
| 216 | if (rc < 0) { | ||
| 217 | cERROR(1, ("Error %d sending data on socket to server", rc)); | ||
| 218 | } else { | ||
| 219 | rc = 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | /* Don't want to modify the buffer as a | ||
| 223 | side effect of this call. */ | ||
| 224 | smb_buffer->smb_buf_length = smb_buf_length; | ||
| 225 | |||
| 226 | return rc; | ||
| 227 | } | ||
| 228 | |||
| 229 | static int | 157 | static int |
| 230 | smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec, | 158 | smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec) |
| 231 | struct sockaddr *sin, bool noblocksnd) | ||
| 232 | { | 159 | { |
| 233 | int rc = 0; | 160 | int rc = 0; |
| 234 | int i = 0; | 161 | int i = 0; |
| @@ -243,11 +170,11 @@ smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec, | |||
| 243 | if (ssocket == NULL) | 170 | if (ssocket == NULL) |
| 244 | return -ENOTSOCK; /* BB eventually add reconnect code here */ | 171 | return -ENOTSOCK; /* BB eventually add reconnect code here */ |
| 245 | 172 | ||
| 246 | smb_msg.msg_name = sin; | 173 | smb_msg.msg_name = (struct sockaddr *) &server->addr.sockAddr; |
| 247 | smb_msg.msg_namelen = sizeof(struct sockaddr); | 174 | smb_msg.msg_namelen = sizeof(struct sockaddr); |
| 248 | smb_msg.msg_control = NULL; | 175 | smb_msg.msg_control = NULL; |
| 249 | smb_msg.msg_controllen = 0; | 176 | smb_msg.msg_controllen = 0; |
| 250 | if (noblocksnd) | 177 | if (server->noblocksnd) |
| 251 | smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; | 178 | smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; |
| 252 | else | 179 | else |
| 253 | smb_msg.msg_flags = MSG_NOSIGNAL; | 180 | smb_msg.msg_flags = MSG_NOSIGNAL; |
| @@ -339,6 +266,18 @@ smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec, | |||
| 339 | return rc; | 266 | return rc; |
| 340 | } | 267 | } |
| 341 | 268 | ||
| 269 | int | ||
| 270 | smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer, | ||
| 271 | unsigned int smb_buf_length) | ||
| 272 | { | ||
| 273 | struct kvec iov; | ||
| 274 | |||
| 275 | iov.iov_base = smb_buffer; | ||
| 276 | iov.iov_len = smb_buf_length + 4; | ||
| 277 | |||
| 278 | return smb_sendv(server, &iov, 1); | ||
| 279 | } | ||
| 280 | |||
| 342 | static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op) | 281 | static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op) |
| 343 | { | 282 | { |
| 344 | if (long_op == CIFS_ASYNC_OP) { | 283 | if (long_op == CIFS_ASYNC_OP) { |
| @@ -540,9 +479,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 540 | #ifdef CONFIG_CIFS_STATS2 | 479 | #ifdef CONFIG_CIFS_STATS2 |
| 541 | atomic_inc(&ses->server->inSend); | 480 | atomic_inc(&ses->server->inSend); |
| 542 | #endif | 481 | #endif |
| 543 | rc = smb_send2(ses->server, iov, n_vec, | 482 | rc = smb_sendv(ses->server, iov, n_vec); |
| 544 | (struct sockaddr *) &(ses->server->addr.sockAddr), | ||
| 545 | ses->server->noblocksnd); | ||
| 546 | #ifdef CONFIG_CIFS_STATS2 | 483 | #ifdef CONFIG_CIFS_STATS2 |
| 547 | atomic_dec(&ses->server->inSend); | 484 | atomic_dec(&ses->server->inSend); |
| 548 | midQ->when_sent = jiffies; | 485 | midQ->when_sent = jiffies; |
| @@ -736,9 +673,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
| 736 | #ifdef CONFIG_CIFS_STATS2 | 673 | #ifdef CONFIG_CIFS_STATS2 |
| 737 | atomic_inc(&ses->server->inSend); | 674 | atomic_inc(&ses->server->inSend); |
| 738 | #endif | 675 | #endif |
| 739 | rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length, | 676 | rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length); |
| 740 | (struct sockaddr *) &(ses->server->addr.sockAddr), | ||
| 741 | ses->server->noblocksnd); | ||
| 742 | #ifdef CONFIG_CIFS_STATS2 | 677 | #ifdef CONFIG_CIFS_STATS2 |
| 743 | atomic_dec(&ses->server->inSend); | 678 | atomic_dec(&ses->server->inSend); |
| 744 | midQ->when_sent = jiffies; | 679 | midQ->when_sent = jiffies; |
| @@ -879,9 +814,7 @@ send_nt_cancel(struct cifsTconInfo *tcon, struct smb_hdr *in_buf, | |||
| 879 | mutex_unlock(&ses->server->srv_mutex); | 814 | mutex_unlock(&ses->server->srv_mutex); |
| 880 | return rc; | 815 | return rc; |
| 881 | } | 816 | } |
| 882 | rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length, | 817 | rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length); |
| 883 | (struct sockaddr *) &(ses->server->addr.sockAddr), | ||
| 884 | ses->server->noblocksnd); | ||
| 885 | mutex_unlock(&ses->server->srv_mutex); | 818 | mutex_unlock(&ses->server->srv_mutex); |
| 886 | return rc; | 819 | return rc; |
| 887 | } | 820 | } |
| @@ -973,9 +906,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, | |||
| 973 | #ifdef CONFIG_CIFS_STATS2 | 906 | #ifdef CONFIG_CIFS_STATS2 |
| 974 | atomic_inc(&ses->server->inSend); | 907 | atomic_inc(&ses->server->inSend); |
| 975 | #endif | 908 | #endif |
| 976 | rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length, | 909 | rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length); |
| 977 | (struct sockaddr *) &(ses->server->addr.sockAddr), | ||
| 978 | ses->server->noblocksnd); | ||
| 979 | #ifdef CONFIG_CIFS_STATS2 | 910 | #ifdef CONFIG_CIFS_STATS2 |
| 980 | atomic_dec(&ses->server->inSend); | 911 | atomic_dec(&ses->server->inSend); |
| 981 | midQ->when_sent = jiffies; | 912 | midQ->when_sent = jiffies; |
