Linux CIFS filesystem development
 help / color / mirror / Atom feed
* ASYNC operation
@ 2016-02-11 12:12 Sachin Prabhu
  0 siblings, 0 replies; only message in thread
From: Sachin Prabhu @ 2016-02-11 12:12 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

Hello Steve,

We have a report where users using async reads by setting the directive
"aio read size = 4096"
in smb.conf. The user uses SMB3.

When using large rsize/wsize, we hit the problem where we have the
following messages

Feb  8 15:03:28 storage-qe13 kernel: CIFS VFS: SMB response too long
(1048656 bytes)
Feb  8 15:03:28 storage-qe13 kernel: CIFS VFS: Send error in read = -11

It looks like the Reads in the cifs module does not follow the async io
steps described in  
https://msdn.microsoft.com/en-us/library/cc246721.aspx

Looking at the tcpdump, just before the client reconnects to the
server, I see a read response with status set to STATUS_PENDING. The
async_id for the smb2_hdr is set. 
This response is received and processed by cifs_readv_receive() which
doesn't not know about the STATUS_PENDING response. It proceeds to
discard the readv response, returns an error and clears the MID.
The subsequent async response for the call then reaches the client.
Since the client has already discarded the MID from the earlier call,
it can no longer find any corresponding MIDs in the pending MID list.
The response is then handled by standard_receive3() which considers it
to be too large.
The connection is closed and the client attempts to reconnect to the
server.

The client then should subsequently retry the read call and should
receive the necessary response.

To reproduce: 
On the server, add the following conf
aio read size = 4096
and restart server. 
Server version used in my test samba-4.1.12-23.el7_1.x86_64.

On the client: using kernel 4.5.0-0.rc1.git2.1.fc24.x86_64

1)  mount with the mount options
rsize=1048576,wsize=1048576,vers=3.0 

2) Create a file to use to read
dd if=/dev/zero of=test bs=1M count=1024

3) Start read and keep a tab on dmesg
# dd if=test of=/dev/null 

Are there any plans on adding this functionality to the cifs module? 

Sachin Prabhu

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2016-02-11 12:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-11 12:12 ASYNC operation Sachin Prabhu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox