Commit 0ae0efad authored by Steve French's avatar Steve French

[CIFS] Fix rsize calculation so that large readx flag is checked.

Signed-off-by: Steve French (sfrench@us.ibm.com)
parent 68058e75
...@@ -267,7 +267,7 @@ cifs_stats_read(char *buf, char **beginBuffer, off_t offset, ...@@ -267,7 +267,7 @@ cifs_stats_read(char *buf, char **beginBuffer, off_t offset,
atomic_read(&tcon->num_oplock_brks)); atomic_read(&tcon->num_oplock_brks));
buf += item_length; buf += item_length;
length += item_length; length += item_length;
item_length = sprintf(buf, "\nReads: %d Bytes %lld", item_length = sprintf(buf, "\nReads: %d Bytes: %lld",
atomic_read(&tcon->num_reads), atomic_read(&tcon->num_reads),
(long long)(tcon->bytes_read)); (long long)(tcon->bytes_read));
buf += item_length; buf += item_length;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/mempool.h> #include <linux/mempool.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/pagevec.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/processor.h> #include <asm/processor.h>
#include "cifspdu.h" #include "cifspdu.h"
...@@ -188,6 +189,7 @@ cifs_reconnect(struct TCP_Server_Info *server) ...@@ -188,6 +189,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
server->server_RFC1001_name); server->server_RFC1001_name);
} }
if(rc) { if(rc) {
cERROR(1,("reconnect error %d",rc));
msleep(3000); msleep(3000);
} else { } else {
atomic_inc(&tcpSesReconnectCount); atomic_inc(&tcpSesReconnectCount);
...@@ -469,6 +471,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -469,6 +471,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
} else { } else {
/* give server a second to /* give server a second to
clean up before reconnect attempt */ clean up before reconnect attempt */
cERROR(1,("sleep before reconnect"));
msleep(1000); msleep(1000);
/* always try 445 first on reconnect /* always try 445 first on reconnect
since we get NACK on some if we ever since we get NACK on some if we ever
...@@ -556,6 +559,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -556,6 +559,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
dump_smb(smb_buffer, length); dump_smb(smb_buffer, length);
if (checkSMB (smb_buffer, smb_buffer->Mid, total_read+4)) { if (checkSMB (smb_buffer, smb_buffer->Mid, total_read+4)) {
cERROR(1, ("Bad SMB Received ")); cERROR(1, ("Bad SMB Received "));
cifs_dump_mem("smb: ", smb_buffer, 48);
continue; continue;
} }
...@@ -1383,7 +1387,9 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1383,7 +1387,9 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
the default. sock_setsockopt not used because it expects the default. sock_setsockopt not used because it expects
user space buffer */ user space buffer */
(*csocket)->sk->sk_rcvtimeo = 7 * HZ; (*csocket)->sk->sk_rcvtimeo = 7 * HZ;
cERROR(1,("sndbuf %d rcvbuf %d reset to 200K each",(*csocket)->sk->sk_sndbuf, (*csocket)->sk->sk_rcvbuf));
(*csocket)->sk->sk_sndbuf = 300 * 1024;
(*csocket)->sk->sk_rcvbuf = 200 * 1024;
/* send RFC1001 sessinit */ /* send RFC1001 sessinit */
if(psin_server->sin_port == htons(RFC1001_PORT)) { if(psin_server->sin_port == htons(RFC1001_PORT)) {
...@@ -1736,11 +1742,20 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1736,11 +1742,20 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* search for existing tcon to this server share */ /* search for existing tcon to this server share */
if (!rc) { if (!rc) {
if((volume_info.rsize) && (volume_info.rsize <= CIFSMaxBufSize)) if(volume_info.rsize > CIFSMaxBufSize) {
cERROR(1,("rsize %d too large, using MaxBufSize",
volume_info.rsize));
cifs_sb->rsize = CIFSMaxBufSize;
} else if((volume_info.rsize) && (volume_info.rsize <= CIFSMaxBufSize))
cifs_sb->rsize = volume_info.rsize; cifs_sb->rsize = volume_info.rsize;
else else /* default */
cifs_sb->rsize = srvTcp->maxBuf - MAX_CIFS_HDR_SIZE; /* default */ cifs_sb->rsize = CIFSMaxBufSize;
if(volume_info.wsize)
if(volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
cERROR(1,("wsize %d too large using 4096 instead",
volume_info.wsize));
cifs_sb->wsize = 4096;
} else if(volume_info.wsize)
cifs_sb->wsize = volume_info.wsize; cifs_sb->wsize = volume_info.wsize;
else else
cifs_sb->wsize = CIFSMaxBufSize; /* default */ cifs_sb->wsize = CIFSMaxBufSize; /* default */
...@@ -1895,6 +1910,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1895,6 +1910,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cifs_sb->wsize = min(cifs_sb->wsize, cifs_sb->wsize = min(cifs_sb->wsize,
(tcon->ses->server->maxBuf - (tcon->ses->server->maxBuf -
MAX_CIFS_HDR_SIZE)); MAX_CIFS_HDR_SIZE));
if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
cifs_sb->rsize = min(cifs_sb->rsize,
(tcon->ses->server->maxBuf -
MAX_CIFS_HDR_SIZE));
} }
/* volume_info.password is freed above when existing session found /* volume_info.password is freed above when existing session found
......
...@@ -855,7 +855,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data, ...@@ -855,7 +855,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
struct kvec iov[2]; struct kvec iov[2];
unsigned int len; unsigned int len;
len = min(cifs_sb->wsize, len = min((size_t)cifs_sb->wsize,
write_size - total_written); write_size - total_written);
/* iov[0] is reserved for smb header */ /* iov[0] is reserved for smb header */
iov[1].iov_base = (char *)write_data + iov[1].iov_base = (char *)write_data +
...@@ -920,7 +920,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode) ...@@ -920,7 +920,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
((open_file->pfile->f_flags & O_RDWR) || ((open_file->pfile->f_flags & O_RDWR) ||
(open_file->pfile->f_flags & O_WRONLY))) { (open_file->pfile->f_flags & O_WRONLY))) {
read_unlock(&GlobalSMBSeslock); read_unlock(&GlobalSMBSeslock);
if(open_file->invalidHandle) { if((open_file->invalidHandle) &&
(!open_file->closePend)) {
rc = cifs_reopen_file(&cifs_inode->vfs_inode, rc = cifs_reopen_file(&cifs_inode->vfs_inode,
open_file->pfile, FALSE); open_file->pfile, FALSE);
/* if it fails, try another handle - might be */ /* if it fails, try another handle - might be */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment