]> err.no Git - linux-2.6/commitdiff
CIFS: cifs_writepages should not write beyond end of file
authorSteve French <sfrench@us.ibm.com>
Wed, 12 Oct 2005 22:32:05 +0000 (15:32 -0700)
committerSteve French <sfrench@us.ibm.com>
Wed, 12 Oct 2005 22:32:05 +0000 (15:32 -0700)
Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/file.c

index 585a62aebd590c78ad838c089f8aed111b861de0..23af20d5af7c41467783961bc37ad37126347c1e 100644 (file)
@@ -1011,6 +1011,7 @@ static int cifs_writepages(struct address_space *mapping,
        pgoff_t index;
        int is_range = 0;
        struct kvec iov[32];
+       int len;
        int n_iov = 0;
        pgoff_t next;
        int nr_pages;
@@ -1124,16 +1125,26 @@ retry:
                                unlock_page(page);
                                break;
                        }
+
+                       if (page_offset(page) >= mapping->host->i_size) {
+                               done = 1;
+                               unlock_page(page);
+                               break;
+                       }
+
                        /*
                         * BB can we get rid of this?  pages are held by pvec
                         */
                        page_cache_get(page);
 
+                       len = min(mapping->host->i_size - page_offset(page),
+                                 (loff_t)PAGE_CACHE_SIZE);
+
                        /* reserve iov[0] for the smb header */
                        n_iov++;
                        iov[n_iov].iov_base = kmap(page);
-                       iov[n_iov].iov_len = PAGE_CACHE_SIZE;
-                       bytes_to_write += PAGE_CACHE_SIZE;
+                       iov[n_iov].iov_len = len;
+                       bytes_to_write += len;
 
                        if (first < 0) {
                                first = i;