diff --git a/[refs] b/[refs] index 48b8b1bdabb0..e7817d43f770 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8b3d3567f72aa61d5d6f4ce89d289b154e1ea866 +refs/heads/master: 32502b8413a77b54b9e19809404109590c32dfb7 diff --git a/trunk/fs/splice.c b/trunk/fs/splice.c index aa5f6f60b305..399442179d89 100644 --- a/trunk/fs/splice.c +++ b/trunk/fs/splice.c @@ -379,13 +379,22 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, lock_page(page); /* - * page was truncated, stop here. if this isn't the - * first page, we'll just complete what we already - * added + * Page was truncated, or invalidated by the + * filesystem. Redo the find/create, but this time the + * page is kept locked, so there's no chance of another + * race with truncate/invalidate. */ if (!page->mapping) { unlock_page(page); - break; + page = find_or_create_page(mapping, index, + mapping_gfp_mask(mapping)); + + if (!page) { + error = -ENOMEM; + break; + } + page_cache_release(pages[page_nr]); + pages[page_nr] = page; } /* * page was already under io and is now done, great