Tentatively merged into cifs-2.6.git for-next, pending testing On Thu, Feb 4, 2021 at 12:49 AM Steve French <smfrench@xxxxxxxxx> wrote: > > (Another patch to make conversion to new netfs interfaces easier) > > Optimize read_page_from_socket by using an iov_iter > > Signed-off-by: David Howells <dhowells@xxxxxxxxxx> > Signed-off-by: Steve French <stfrench@xxxxxxxxxxxxx> > --- > fs/cifs/cifsglob.h | 1 + > fs/cifs/cifsproto.h | 3 +++ > fs/cifs/connect.c | 16 ++++++++++++++++ > fs/cifs/file.c | 3 +-- > 4 files changed, 21 insertions(+), 2 deletions(-) > > diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h > index 50fcb65920e8..73f80cc38316 100644 > --- a/fs/cifs/cifsglob.h > +++ b/fs/cifs/cifsglob.h > @@ -1301,6 +1301,7 @@ struct cifs_readdata { > int (*copy_into_pages)(struct TCP_Server_Info *server, > struct cifs_readdata *rdata, > struct iov_iter *iter); > + struct iov_iter iter; > struct kvec iov[2]; > struct TCP_Server_Info *server; > #ifdef CONFIG_CIFS_SMB_DIRECT > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 75ce6f742b8d..64eb5c817712 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -239,6 +239,9 @@ extern int cifs_read_page_from_socket(struct > TCP_Server_Info *server, > unsigned int page_offset, > unsigned int to_read); > extern int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb); > +extern int cifs_read_iter_from_socket(struct TCP_Server_Info *server, > + struct iov_iter *iter, > + unsigned int to_read); > extern int cifs_match_super(struct super_block *, void *); > extern int cifs_mount(struct cifs_sb_info *cifs_sb, struct > smb3_fs_context *ctx); > extern void cifs_umount(struct cifs_sb_info *); > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > index 943f4eba027d..7c8db233fba4 100644 > --- a/fs/cifs/connect.c > +++ b/fs/cifs/connect.c > @@ -585,6 +585,22 @@ cifs_read_page_from_socket(struct TCP_Server_Info > *server, struct page *page, > return cifs_readv_from_socket(server, &smb_msg); > } > > +int > +cifs_read_iter_from_socket(struct TCP_Server_Info *server, struct > iov_iter *iter, > + unsigned int to_read) > +{ > + struct msghdr smb_msg; > + int ret; > + > + smb_msg.msg_iter = *iter; > + if (smb_msg.msg_iter.count > to_read) > + smb_msg.msg_iter.count = to_read; > + ret = cifs_readv_from_socket(server, &smb_msg); > + if (ret > 0) > + iov_iter_advance(iter, ret); > + return ret; > +} > + > static bool > is_smb_response(struct TCP_Server_Info *server, unsigned char type) > { > diff --git a/fs/cifs/file.c b/fs/cifs/file.c > index 6d001905c8e5..4b8c1ac58f00 100644 > --- a/fs/cifs/file.c > +++ b/fs/cifs/file.c > @@ -4261,8 +4261,7 @@ readpages_fill_pages(struct TCP_Server_Info *server, > result = n; > #endif > else > - result = cifs_read_page_from_socket( > - server, page, page_offset, n); > + result = cifs_read_iter_from_socket(server, &rdata->iter, n); > if (result < 0) > break; > > > -- > Thanks, > > Steve -- Thanks, Steve