X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fsmbfs%2Fsock.c;h=92ea6b2367d7f69224462396b021d0f23937d4dc;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=74d6a3e27491828498bddacda514eb784d47e7f6;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/smbfs/sock.c b/fs/smbfs/sock.c index 74d6a3e27..92ea6b236 100644 --- a/fs/smbfs/sock.c +++ b/fs/smbfs/sock.c @@ -15,12 +15,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include @@ -38,27 +38,10 @@ static int _recvfrom(struct socket *socket, unsigned char *ubuf, int size, unsigned flags) { - struct iovec iov; - struct msghdr msg; - mm_segment_t fs; - - fs = get_fs(); - set_fs(get_ds()); - flags |= MSG_DONTWAIT | MSG_NOSIGNAL; - - msg.msg_flags = flags; - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = NULL; - iov.iov_base = ubuf; - iov.iov_len = size; - - size = sock_recvmsg(socket, &msg, size, flags); - - set_fs(fs); - return size; + struct kvec iov = {ubuf, size}; + struct msghdr msg = {.msg_flags = flags}; + msg.msg_flags |= MSG_DONTWAIT | MSG_NOSIGNAL; + return kernel_recvmsg(socket, &msg, &iov, 1, size, msg.msg_flags); } /* @@ -99,10 +82,10 @@ server_sock(struct smb_sb_info *server) if (server && (file = server->sock_file)) { #ifdef SMBFS_PARANOIA - if (!smb_valid_socket(file->f_dentry->d_inode)) + if (!smb_valid_socket(file->f_path.dentry->d_inode)) PARANOIA("bad socket!\n"); #endif - return SOCKET_I(file->f_dentry->d_inode); + return SOCKET_I(file->f_path.dentry->d_inode); } return NULL; } @@ -171,42 +154,42 @@ smb_recv_available(struct smb_sb_info *server) } /* - * Adjust the iovec to move on 'n' bytes (from nfs/sunrpc) + * Adjust the kvec to move on 'n' bytes (from nfs/sunrpc) */ static int -smb_move_iov(struct msghdr *msg, struct iovec *niv, unsigned amount) +smb_move_iov(struct kvec **data, size_t *num, struct kvec *vec, unsigned amount) { - struct iovec *iv = msg->msg_iov; + struct kvec *iv = *data; int i; int len; /* - * Eat any sent iovecs + * Eat any sent kvecs */ while (iv->iov_len <= amount) { amount -= iv->iov_len; iv++; - msg->msg_iovlen--; + (*num)--; } /* * And chew down the partial one */ - niv[0].iov_len = iv->iov_len-amount; - niv[0].iov_base =((unsigned char *)iv->iov_base)+amount; + vec[0].iov_len = iv->iov_len-amount; + vec[0].iov_base =((unsigned char *)iv->iov_base)+amount; iv++; - len = niv[0].iov_len; + len = vec[0].iov_len; /* * And copy any others */ - for (i = 1; i < msg->msg_iovlen; i++) { - niv[i] = *iv++; - len += niv[i].iov_len; + for (i = 1; i < *num; i++) { + vec[i] = *iv++; + len += vec[i].iov_len; } - msg->msg_iov = niv; + *data = vec; return len; } @@ -280,37 +263,29 @@ smb_receive_drop(struct smb_sb_info *server) { struct socket *sock; unsigned int flags; - struct iovec iov; + struct kvec iov; struct msghdr msg; - mm_segment_t fs; int rlen = smb_len(server->header) - server->smb_read + 4; int result = -EIO; + if (rlen > PAGE_SIZE) + rlen = PAGE_SIZE; + sock = server_sock(server); if (!sock) goto out; if (sock->sk->sk_state != TCP_ESTABLISHED) goto out; - fs = get_fs(); - set_fs(get_ds()); - flags = MSG_DONTWAIT | MSG_NOSIGNAL; iov.iov_base = drop_buffer; iov.iov_len = PAGE_SIZE; msg.msg_flags = flags; msg.msg_name = NULL; msg.msg_namelen = 0; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; msg.msg_control = NULL; - if (rlen > PAGE_SIZE) - rlen = PAGE_SIZE; - - result = sock_recvmsg(sock, &msg, rlen, flags); - - set_fs(fs); + result = kernel_recvmsg(sock, &msg, &iov, 1, rlen, flags); VERBOSE("read: %d\n", result); if (result < 0) { @@ -335,9 +310,10 @@ smb_receive(struct smb_sb_info *server, struct smb_request *req) { struct socket *sock; unsigned int flags; - struct iovec iov[4]; + struct kvec iov[4]; + struct kvec *p = req->rq_iov; + size_t num = req->rq_iovlen; struct msghdr msg; - mm_segment_t fs; int rlen; int result = -EIO; @@ -347,25 +323,18 @@ smb_receive(struct smb_sb_info *server, struct smb_request *req) if (sock->sk->sk_state != TCP_ESTABLISHED) goto out; - fs = get_fs(); - set_fs(get_ds()); - flags = MSG_DONTWAIT | MSG_NOSIGNAL; msg.msg_flags = flags; msg.msg_name = NULL; msg.msg_namelen = 0; - msg.msg_iov = req->rq_iov; - msg.msg_iovlen = req->rq_iovlen; msg.msg_control = NULL; /* Dont repeat bytes and count available bufferspace */ - rlen = smb_move_iov(&msg, iov, req->rq_bytes_recvd); + rlen = smb_move_iov(&p, &num, iov, req->rq_bytes_recvd); if (req->rq_rlen < rlen) rlen = req->rq_rlen; - result = sock_recvmsg(sock, &msg, rlen, flags); - - set_fs(fs); + result = kernel_recvmsg(sock, &msg, p, num, rlen, flags); VERBOSE("read: %d\n", result); if (result < 0) { @@ -388,13 +357,14 @@ out: int smb_send_request(struct smb_request *req) { - mm_segment_t fs; struct smb_sb_info *server = req->rq_server; struct socket *sock; - struct msghdr msg; + struct msghdr msg = {.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT}; int slen = req->rq_slen - req->rq_bytes_sent; int result = -EIO; - struct iovec iov[4]; + struct kvec iov[4]; + struct kvec *p = req->rq_iov; + size_t num = req->rq_iovlen; sock = server_sock(server); if (!sock) @@ -402,22 +372,11 @@ smb_send_request(struct smb_request *req) if (sock->sk->sk_state != TCP_ESTABLISHED) goto out; - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_iov = req->rq_iov; - msg.msg_iovlen = req->rq_iovlen; - msg.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT; - /* Dont repeat bytes */ if (req->rq_bytes_sent) - smb_move_iov(&msg, iov, req->rq_bytes_sent); + smb_move_iov(&p, &num, iov, req->rq_bytes_sent); - fs = get_fs(); - set_fs(get_ds()); - result = sock_sendmsg(sock, &msg, slen); - set_fs(fs); + result = kernel_sendmsg(sock, &msg, p, num, slen); if (result >= 0) { req->rq_bytes_sent += result;