Re: [PATCH 6/6] cifs: don't bother with kmap on read_pages side

2016-04-19 Thread Jeff Layton
On Sat, 2016-04-09 at 21:53 +0100, Al Viro wrote:
> just do ITER_BVEC recvmsg
> 
> Signed-off-by: Al Viro 
> ---
>  fs/cifs/cifsproto.h |  7 +++---
>  fs/cifs/connect.c   | 65 
> -
>  fs/cifs/file.c  | 53 ++-
>  3 files changed, 55 insertions(+), 70 deletions(-)
> 
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 7d5f53a..0f9a6bc 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, 
> struct inode *,
>  
>  extern void dequeue_mid(struct mid_q_entry *mid, bool malformed);
>  extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
> -  unsigned int to_read);
> -extern int cifs_readv_from_socket(struct TCP_Server_Info *server,
> - struct kvec *iov_orig, unsigned int nr_segs,
> - unsigned int to_read);
> +  unsigned int to_read);
> +extern int cifs_read_page_from_socket(struct TCP_Server_Info *server,
> +   struct page *page, unsigned int to_read);
>  extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
>      struct cifs_sb_info *cifs_sb);
>  extern int cifs_match_super(struct super_block *, void *);
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index eb42665..e33c5e0 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server)
>   return false;
>  }
>  
> -int
> -cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
> -    unsigned int nr_segs, unsigned int to_read)
> +static int
> +cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr 
> *smb_msg)
>  {
>   int length = 0;
>   int total_read;
> - struct msghdr smb_msg;
>  
> - smb_msg.msg_control = NULL;
> - smb_msg.msg_controllen = 0;
> - iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC,
> -   iov_orig, nr_segs, to_read);
> + smb_msg->msg_control = NULL;
> + smb_msg->msg_controllen = 0;
>  
> - for (total_read = 0; msg_data_left(_msg); total_read += length) {
> + for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
>   try_to_freeze();
>  
> - if (server_unresponsive(server)) {
> - total_read = -ECONNABORTED;
> - break;
> - }
> + if (server_unresponsive(server))
> + return -ECONNABORTED;
>  
> - length = sock_recvmsg(server->ssocket, _msg, 0);
> + length = sock_recvmsg(server->ssocket, smb_msg, 0);
>  
> - if (server->tcpStatus == CifsExiting) {
> - total_read = -ESHUTDOWN;
> - break;
> - } else if (server->tcpStatus == CifsNeedReconnect) {
> + if (server->tcpStatus == CifsExiting)
> + return -ESHUTDOWN;
> +
> + if (server->tcpStatus == CifsNeedReconnect) {
>   cifs_reconnect(server);
> - total_read = -ECONNABORTED;
> - break;
> - } else if (length == -ERESTARTSYS ||
> -    length == -EAGAIN ||
> -    length == -EINTR) {
> + return -ECONNABORTED;
> + }
> +
> + if (length == -ERESTARTSYS ||
> + length == -EAGAIN ||
> + length == -EINTR) {
>   /*
>    * Minimum sleep to prevent looping, allowing socket
>    * to clear and app threads to set tcpStatus
> @@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, 
> struct kvec *iov_orig,
>   usleep_range(1000, 2000);
>   length = 0;
>   continue;
> - } else if (length <= 0) {
> + }
> +
> + if (length <= 0) {
>   cifs_dbg(FYI, "Received no data or error: %d\n", 
> length);
>   cifs_reconnect(server);
> - total_read = -ECONNABORTED;
> - break;
> + return -ECONNABORTED;
>   }
>   }
>   return total_read;
> @@ -556,12 +552,21 @@ int
>  cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
>     unsigned int to_read)
>  {
> - struct kvec iov;
> + struct msghdr smb_msg;
> + struct kvec iov = {.iov_base = buf, .iov_len = to_read};
> + iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read);
>  
> - iov.iov_base = buf;
> - iov.iov_len = to_read;
> + return cifs_readv_from_socket(server, _msg);
> +}
>  
> - return cifs_readv_from_socket(server, , 1, to_read);
> +int
> 

Re: [PATCH 6/6] cifs: don't bother with kmap on read_pages side

2016-04-19 Thread Jeff Layton
On Sat, 2016-04-09 at 21:53 +0100, Al Viro wrote:
> just do ITER_BVEC recvmsg
> 
> Signed-off-by: Al Viro 
> ---
>  fs/cifs/cifsproto.h |  7 +++---
>  fs/cifs/connect.c   | 65 
> -
>  fs/cifs/file.c  | 53 ++-
>  3 files changed, 55 insertions(+), 70 deletions(-)
> 
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 7d5f53a..0f9a6bc 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, 
> struct inode *,
>  
>  extern void dequeue_mid(struct mid_q_entry *mid, bool malformed);
>  extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
> -  unsigned int to_read);
> -extern int cifs_readv_from_socket(struct TCP_Server_Info *server,
> - struct kvec *iov_orig, unsigned int nr_segs,
> - unsigned int to_read);
> +  unsigned int to_read);
> +extern int cifs_read_page_from_socket(struct TCP_Server_Info *server,
> +   struct page *page, unsigned int to_read);
>  extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
>      struct cifs_sb_info *cifs_sb);
>  extern int cifs_match_super(struct super_block *, void *);
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index eb42665..e33c5e0 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server)
>   return false;
>  }
>  
> -int
> -cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
> -    unsigned int nr_segs, unsigned int to_read)
> +static int
> +cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr 
> *smb_msg)
>  {
>   int length = 0;
>   int total_read;
> - struct msghdr smb_msg;
>  
> - smb_msg.msg_control = NULL;
> - smb_msg.msg_controllen = 0;
> - iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC,
> -   iov_orig, nr_segs, to_read);
> + smb_msg->msg_control = NULL;
> + smb_msg->msg_controllen = 0;
>  
> - for (total_read = 0; msg_data_left(_msg); total_read += length) {
> + for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
>   try_to_freeze();
>  
> - if (server_unresponsive(server)) {
> - total_read = -ECONNABORTED;
> - break;
> - }
> + if (server_unresponsive(server))
> + return -ECONNABORTED;
>  
> - length = sock_recvmsg(server->ssocket, _msg, 0);
> + length = sock_recvmsg(server->ssocket, smb_msg, 0);
>  
> - if (server->tcpStatus == CifsExiting) {
> - total_read = -ESHUTDOWN;
> - break;
> - } else if (server->tcpStatus == CifsNeedReconnect) {
> + if (server->tcpStatus == CifsExiting)
> + return -ESHUTDOWN;
> +
> + if (server->tcpStatus == CifsNeedReconnect) {
>   cifs_reconnect(server);
> - total_read = -ECONNABORTED;
> - break;
> - } else if (length == -ERESTARTSYS ||
> -    length == -EAGAIN ||
> -    length == -EINTR) {
> + return -ECONNABORTED;
> + }
> +
> + if (length == -ERESTARTSYS ||
> + length == -EAGAIN ||
> + length == -EINTR) {
>   /*
>    * Minimum sleep to prevent looping, allowing socket
>    * to clear and app threads to set tcpStatus
> @@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, 
> struct kvec *iov_orig,
>   usleep_range(1000, 2000);
>   length = 0;
>   continue;
> - } else if (length <= 0) {
> + }
> +
> + if (length <= 0) {
>   cifs_dbg(FYI, "Received no data or error: %d\n", 
> length);
>   cifs_reconnect(server);
> - total_read = -ECONNABORTED;
> - break;
> + return -ECONNABORTED;
>   }
>   }
>   return total_read;
> @@ -556,12 +552,21 @@ int
>  cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
>     unsigned int to_read)
>  {
> - struct kvec iov;
> + struct msghdr smb_msg;
> + struct kvec iov = {.iov_base = buf, .iov_len = to_read};
> + iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read);
>  
> - iov.iov_base = buf;
> - iov.iov_len = to_read;
> + return cifs_readv_from_socket(server, _msg);
> +}
>  
> - return cifs_readv_from_socket(server, , 1, to_read);
> +int
> 

[PATCH 6/6] cifs: don't bother with kmap on read_pages side

2016-04-09 Thread Al Viro
just do ITER_BVEC recvmsg

Signed-off-by: Al Viro 
---
 fs/cifs/cifsproto.h |  7 +++---
 fs/cifs/connect.c   | 65 -
 fs/cifs/file.c  | 53 ++-
 3 files changed, 55 insertions(+), 70 deletions(-)

diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 7d5f53a..0f9a6bc 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, struct 
inode *,
 
 extern void dequeue_mid(struct mid_q_entry *mid, bool malformed);
 extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
-unsigned int to_read);
-extern int cifs_readv_from_socket(struct TCP_Server_Info *server,
-   struct kvec *iov_orig, unsigned int nr_segs,
-   unsigned int to_read);
+unsigned int to_read);
+extern int cifs_read_page_from_socket(struct TCP_Server_Info *server,
+ struct page *page, unsigned int to_read);
 extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
   struct cifs_sb_info *cifs_sb);
 extern int cifs_match_super(struct super_block *, void *);
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index eb42665..e33c5e0 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server)
return false;
 }
 
-int
-cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
-  unsigned int nr_segs, unsigned int to_read)
+static int
+cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
 {
int length = 0;
int total_read;
-   struct msghdr smb_msg;
 
-   smb_msg.msg_control = NULL;
-   smb_msg.msg_controllen = 0;
-   iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC,
- iov_orig, nr_segs, to_read);
+   smb_msg->msg_control = NULL;
+   smb_msg->msg_controllen = 0;
 
-   for (total_read = 0; msg_data_left(_msg); total_read += length) {
+   for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
try_to_freeze();
 
-   if (server_unresponsive(server)) {
-   total_read = -ECONNABORTED;
-   break;
-   }
+   if (server_unresponsive(server))
+   return -ECONNABORTED;
 
-   length = sock_recvmsg(server->ssocket, _msg, 0);
+   length = sock_recvmsg(server->ssocket, smb_msg, 0);
 
-   if (server->tcpStatus == CifsExiting) {
-   total_read = -ESHUTDOWN;
-   break;
-   } else if (server->tcpStatus == CifsNeedReconnect) {
+   if (server->tcpStatus == CifsExiting)
+   return -ESHUTDOWN;
+
+   if (server->tcpStatus == CifsNeedReconnect) {
cifs_reconnect(server);
-   total_read = -ECONNABORTED;
-   break;
-   } else if (length == -ERESTARTSYS ||
-  length == -EAGAIN ||
-  length == -EINTR) {
+   return -ECONNABORTED;
+   }
+
+   if (length == -ERESTARTSYS ||
+   length == -EAGAIN ||
+   length == -EINTR) {
/*
 * Minimum sleep to prevent looping, allowing socket
 * to clear and app threads to set tcpStatus
@@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, 
struct kvec *iov_orig,
usleep_range(1000, 2000);
length = 0;
continue;
-   } else if (length <= 0) {
+   }
+
+   if (length <= 0) {
cifs_dbg(FYI, "Received no data or error: %d\n", 
length);
cifs_reconnect(server);
-   total_read = -ECONNABORTED;
-   break;
+   return -ECONNABORTED;
}
}
return total_read;
@@ -556,12 +552,21 @@ int
 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
  unsigned int to_read)
 {
-   struct kvec iov;
+   struct msghdr smb_msg;
+   struct kvec iov = {.iov_base = buf, .iov_len = to_read};
+   iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read);
 
-   iov.iov_base = buf;
-   iov.iov_len = to_read;
+   return cifs_readv_from_socket(server, _msg);
+}
 
-   return cifs_readv_from_socket(server, , 1, to_read);
+int
+cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
+ unsigned int to_read)
+{
+   struct msghdr smb_msg;
+   

[PATCH 6/6] cifs: don't bother with kmap on read_pages side

2016-04-09 Thread Al Viro
just do ITER_BVEC recvmsg

Signed-off-by: Al Viro 
---
 fs/cifs/cifsproto.h |  7 +++---
 fs/cifs/connect.c   | 65 -
 fs/cifs/file.c  | 53 ++-
 3 files changed, 55 insertions(+), 70 deletions(-)

diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 7d5f53a..0f9a6bc 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -179,10 +179,9 @@ extern int set_cifs_acl(struct cifs_ntsd *, __u32, struct 
inode *,
 
 extern void dequeue_mid(struct mid_q_entry *mid, bool malformed);
 extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
-unsigned int to_read);
-extern int cifs_readv_from_socket(struct TCP_Server_Info *server,
-   struct kvec *iov_orig, unsigned int nr_segs,
-   unsigned int to_read);
+unsigned int to_read);
+extern int cifs_read_page_from_socket(struct TCP_Server_Info *server,
+ struct page *page, unsigned int to_read);
 extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
   struct cifs_sb_info *cifs_sb);
 extern int cifs_match_super(struct super_block *, void *);
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index eb42665..e33c5e0 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -501,39 +501,34 @@ server_unresponsive(struct TCP_Server_Info *server)
return false;
 }
 
-int
-cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
-  unsigned int nr_segs, unsigned int to_read)
+static int
+cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
 {
int length = 0;
int total_read;
-   struct msghdr smb_msg;
 
-   smb_msg.msg_control = NULL;
-   smb_msg.msg_controllen = 0;
-   iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC,
- iov_orig, nr_segs, to_read);
+   smb_msg->msg_control = NULL;
+   smb_msg->msg_controllen = 0;
 
-   for (total_read = 0; msg_data_left(_msg); total_read += length) {
+   for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
try_to_freeze();
 
-   if (server_unresponsive(server)) {
-   total_read = -ECONNABORTED;
-   break;
-   }
+   if (server_unresponsive(server))
+   return -ECONNABORTED;
 
-   length = sock_recvmsg(server->ssocket, _msg, 0);
+   length = sock_recvmsg(server->ssocket, smb_msg, 0);
 
-   if (server->tcpStatus == CifsExiting) {
-   total_read = -ESHUTDOWN;
-   break;
-   } else if (server->tcpStatus == CifsNeedReconnect) {
+   if (server->tcpStatus == CifsExiting)
+   return -ESHUTDOWN;
+
+   if (server->tcpStatus == CifsNeedReconnect) {
cifs_reconnect(server);
-   total_read = -ECONNABORTED;
-   break;
-   } else if (length == -ERESTARTSYS ||
-  length == -EAGAIN ||
-  length == -EINTR) {
+   return -ECONNABORTED;
+   }
+
+   if (length == -ERESTARTSYS ||
+   length == -EAGAIN ||
+   length == -EINTR) {
/*
 * Minimum sleep to prevent looping, allowing socket
 * to clear and app threads to set tcpStatus
@@ -542,11 +537,12 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, 
struct kvec *iov_orig,
usleep_range(1000, 2000);
length = 0;
continue;
-   } else if (length <= 0) {
+   }
+
+   if (length <= 0) {
cifs_dbg(FYI, "Received no data or error: %d\n", 
length);
cifs_reconnect(server);
-   total_read = -ECONNABORTED;
-   break;
+   return -ECONNABORTED;
}
}
return total_read;
@@ -556,12 +552,21 @@ int
 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
  unsigned int to_read)
 {
-   struct kvec iov;
+   struct msghdr smb_msg;
+   struct kvec iov = {.iov_base = buf, .iov_len = to_read};
+   iov_iter_kvec(_msg.msg_iter, READ | ITER_KVEC, , 1, to_read);
 
-   iov.iov_base = buf;
-   iov.iov_len = to_read;
+   return cifs_readv_from_socket(server, _msg);
+}
 
-   return cifs_readv_from_socket(server, , 1, to_read);
+int
+cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
+ unsigned int to_read)
+{
+   struct msghdr smb_msg;
+   struct bio_vec bv =