]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
cifs: Fix error in smb_send2
authorSteve French <sfrench@us.ibm.com>
Fri, 21 Nov 2008 07:28:52 +0000 (12:58 +0530)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 5 Dec 2008 18:55:22 +0000 (10:55 -0800)
Backport of upstream commit 61de800d33af585cb7e6f27b5cdd51029c6855cb
for -stable.

[CIFS] fix error in smb_send2

smb_send2 exit logic was strange, and with the previous change
could cause us to fail large
smb writes when all of the smb was not sent as one chunk.

Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Cc: Suresh Jayaraman <sjayaraman@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/cifs/cifssmb.c
fs/cifs/file.c
fs/cifs/transport.c

index 77a0d1fa27d01f21ba034b19622f3a24938cec17..97c98c7679bd4e3491d27ff8a42280f8935db3fb 100644 (file)
@@ -1534,7 +1534,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
        __u32 bytes_sent;
        __u16 byte_count;
 
-       /* cFYI(1,("write at %lld %d bytes",offset,count));*/
+       /* cFYI(1, ("write at %lld %d bytes",offset,count));*/
        if (tcon->ses == NULL)
                return -ECONNABORTED;
 
index cbefe1f1f9fe2c4c92e97e8b4999039ba5c15b99..46d59341256ee56974fde28cbe1f3f80a8ad41bf 100644 (file)
@@ -1813,7 +1813,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
        pTcon = cifs_sb->tcon;
 
        pagevec_init(&lru_pvec, 0);
-               cFYI(DBG2, ("rpages: num pages %d", num_pages));
+       cFYI(DBG2, ("rpages: num pages %d", num_pages));
        for (i = 0; i < num_pages; ) {
                unsigned contig_pages;
                struct page *tmp_page;
index e4ccd9fdad8cffcc467774a1692bc9b63a0b1385..bb0f32960a7c697595d795e9d376a515d45a046e 100644 (file)
@@ -291,8 +291,11 @@ smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec,
                if (rc < 0)
                        break;
 
-               if (rc >= total_len) {
-                       WARN_ON(rc > total_len);
+               if (rc == total_len) {
+                       total_len = 0;
+                       break;
+               } else if (rc > total_len) {
+                       cERROR(1, ("sent %d requested %d", rc, total_len));
                        break;
                }
                if (rc == 0) {