This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / mm / filemap.c
index c6d2f66..d2290f1 100644 (file)
@@ -440,6 +440,10 @@ struct page * find_get_page(struct address_space *mapping, unsigned long offset)
 {
        struct page *page;
 
+       /*
+        * We scan the hash list read-only. Addition to and removal from
+        * the hash-list needs a held write-lock.
+        */
        spin_lock_irq(&mapping->tree_lock);
        page = radix_tree_lookup(&mapping->page_tree, offset);
        if (page)
@@ -651,8 +655,7 @@ void do_generic_mapping_read(struct address_space *mapping,
                             struct file * filp,
                             loff_t *ppos,
                             read_descriptor_t * desc,
-                            read_actor_t actor,
-                            int nonblock)
+                            read_actor_t actor)
 {
        struct inode *inode = mapping->host;
        unsigned long index, end_index, offset;
@@ -680,21 +683,11 @@ void do_generic_mapping_read(struct address_space *mapping,
 find_page:
                page = find_get_page(mapping, index);
                if (unlikely(page == NULL)) {
-                       if (nonblock) {
-                               desc->error = -EWOULDBLOCKIO;
-                               break;
-                       }
                        handle_ra_miss(mapping, &ra, index);
                        goto no_cached_page;
                }
-               if (!PageUptodate(page)) {
-                       if (nonblock) {
-                               page_cache_release(page);
-                               desc->error = -EWOULDBLOCKIO;
-                               break;
-                       }
+               if (!PageUptodate(page))
                        goto page_not_up_to_date;
-               }
 page_ok:
                /* nr is the maximum number of bytes to copy from this page */
                nr = PAGE_CACHE_SIZE;
@@ -935,7 +928,7 @@ __generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
                        if (desc.count == 0)
                                continue;
                        desc.error = 0;
-                       do_generic_file_read(filp,ppos,&desc,file_read_actor,0);
+                       do_generic_file_read(filp,ppos,&desc,file_read_actor);
                        retval += desc.written;
                        if (!retval) {
                                retval = desc.error;
@@ -1009,7 +1002,7 @@ ssize_t generic_file_sendfile(struct file *in_file, loff_t *ppos,
        desc.arg.data = target;
        desc.error = 0;
 
-       do_generic_file_read(in_file, ppos, &desc, actor, 0);
+       do_generic_file_read(in_file, ppos, &desc, actor);
        if (desc.written)
                return desc.written;
        return desc.error;
@@ -1206,7 +1199,6 @@ no_cached_page:
         * effect.
         */
        error = page_cache_read(file, pgoff);
-       grab_swap_token();
 
        /*
         * The page we want has now been added to the page cache.
@@ -1429,9 +1421,15 @@ repeat:
                        return err;
                }
        } else {
-               err = install_file_pte(mm, vma, addr, pgoff, prot);
-               if (err)
-                       return err;
+               /*
+                * If a nonlinear mapping then store the file page offset
+                * in the pte.
+                */
+               if (pgoff != linear_page_index(vma, addr)) {
+                       err = install_file_pte(mm, vma, addr, pgoff, prot);
+                       if (err)
+                               return err;
+               }
        }
 
        len -= PAGE_SIZE;
@@ -1887,7 +1885,7 @@ generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
        if (err)
                goto out;
 
-       inode_update_time(inode, file->f_vfsmnt, 1);
+       inode_update_time(inode, 1);
 
        /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
        if (unlikely(file->f_flags & O_DIRECT)) {