]> err.no Git - linux-2.6/blobdiff - fs/splice.c
kconfig: attach help text to menus
[linux-2.6] / fs / splice.c
index 421b3b8211527123eb48411cad2a4496a9383448..0a09732180847ce6cb7d67f91477c2314296003a 100644 (file)
@@ -265,7 +265,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
                           unsigned int flags)
 {
        struct address_space *mapping = in->f_mapping;
-       unsigned int loff, nr_pages;
+       unsigned int loff, nr_pages, req_pages;
        struct page *pages[PIPE_BUFFERS];
        struct partial_page partial[PIPE_BUFFERS];
        struct page *page;
@@ -281,10 +281,8 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
 
        index = *ppos >> PAGE_CACHE_SHIFT;
        loff = *ppos & ~PAGE_CACHE_MASK;
-       nr_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
-
-       if (nr_pages > PIPE_BUFFERS)
-               nr_pages = PIPE_BUFFERS;
+       req_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+       nr_pages = min(req_pages, (unsigned)PIPE_BUFFERS);
 
        /*
         * Lookup the (hopefully) full range of pages we need.
@@ -297,8 +295,8 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
         * readahead/allocate the rest and fill in the holes.
         */
        if (spd.nr_pages < nr_pages)
-               page_cache_readahead_ondemand(mapping, &in->f_ra, in,
-                               NULL, index, nr_pages - spd.nr_pages);
+               page_cache_sync_readahead(mapping, &in->f_ra, in,
+                               index, req_pages - spd.nr_pages);
 
        error = 0;
        while (spd.nr_pages < nr_pages) {
@@ -354,8 +352,8 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
                page = pages[page_nr];
 
                if (PageReadahead(page))
-                       page_cache_readahead_ondemand(mapping, &in->f_ra, in,
-                                       page, index, nr_pages - page_nr);
+                       page_cache_async_readahead(mapping, &in->f_ra, in,
+                                       page, index, req_pages - page_nr);
 
                /*
                 * If the page isn't uptodate, we may need to start io on it
@@ -596,7 +594,7 @@ find_page:
                ret = add_to_page_cache_lru(page, mapping, index,
                                            GFP_KERNEL);
                if (unlikely(ret))
-                       goto out;
+                       goto out_release;
        }
 
        ret = mapping->a_ops->prepare_write(file, page, offset, offset+this_len);
@@ -652,8 +650,9 @@ find_page:
         */
        mark_page_accessed(page);
 out:
-       page_cache_release(page);
        unlock_page(page);
+out_release:
+       page_cache_release(page);
 out_ret:
        return ret;
 }