From 74f7777ccf593550f7417a582b742b5d1a92eb2d Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Sat, 30 Jun 2012 07:33:37 -0400 Subject: [PATCH] cifs: when server doesn't set CAP_LARGE_READ_X, cap default rsize at MaxBufferSize When the server doesn't advertise CAP_LARGE_READ_X, then MS-CIFS states that you must cap the size of the read at the client's MaxBufferSize. Unfortunately, testing with many older servers shows that they further cap the size of a READ_ANDX response at the size of the server's MaxBufferSize. Since we can't clearly tell what the server will do, we must be conservative here for the default. When the server can't do large reads, then assume that it can't satisfy any read larger than its MaxBufferSize either. This just governs the default however. The admin can always override this on his own. Cc: # 3.2 Reported-by: David H. Durgee Signed-off-by: Jeff Layton --- fs/cifs/connect.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 402fe08..f0a1a24 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -3508,18 +3508,15 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) * MS-CIFS indicates that servers are only limited by the client's * bufsize for reads, testing against win98se shows that it throws * INVALID_PARAMETER errors if you try to request too large a read. + * OS/2 just sends back short reads. * - * If the server advertises a MaxBufferSize of less than one page, - * assume that it also can't satisfy reads larger than that either. - * - * FIXME: Is there a better heuristic for this? + * If the server doesn't advertise CAP_LARGE_READ_X, then assume that + * it can't handle a read request larger than its MaxBufferSize either. */ if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP)) defsize = CIFS_DEFAULT_IOSIZE; else if (server->capabilities & CAP_LARGE_READ_X) defsize = CIFS_DEFAULT_NON_POSIX_RSIZE; - else if (server->maxBuf >= PAGE_CACHE_SIZE) - defsize = CIFSMaxBufSize; else defsize = server->maxBuf - sizeof(READ_RSP); -- 1.7.7.6