From 82f3217ab7a78963970758ec8b01b5716b21e570 Mon Sep 17 00:00:00 2001 From: Hisashi Hifumi Date: Tue, 2 Sep 2008 14:35:40 -0700 Subject: [PATCH] --- yaml --- r: 109404 b: refs/heads/master c: 6ccfa806a9cfbbf1cd43d5b6aa47ef2c0eb518fd h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/filemap.c | 11 +++++++++-- trunk/mm/truncate.c | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 71b6c810f68e..c133859d29c0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 344c790e3821dac37eb742ddd0b611a300f78b9a +refs/heads/master: 6ccfa806a9cfbbf1cd43d5b6aa47ef2c0eb518fd diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c index 54e968650855..876bc595d0f8 100644 --- a/trunk/mm/filemap.c +++ b/trunk/mm/filemap.c @@ -2129,13 +2129,20 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, * After a write we want buffered reads to be sure to go to disk to get * the new data. We invalidate clean cached page from the region we're * about to write. We do this *before* the write so that we can return - * -EIO without clobbering -EIOCBQUEUED from ->direct_IO(). + * without clobbering -EIOCBQUEUED from ->direct_IO(). */ if (mapping->nrpages) { written = invalidate_inode_pages2_range(mapping, pos >> PAGE_CACHE_SHIFT, end); - if (written) + /* + * If a page can not be invalidated, return 0 to fall back + * to buffered write. + */ + if (written) { + if (written == -EBUSY) + return 0; goto out; + } } written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); diff --git a/trunk/mm/truncate.c b/trunk/mm/truncate.c index 250505091d37..6650c1d878b4 100644 --- a/trunk/mm/truncate.c +++ b/trunk/mm/truncate.c @@ -380,7 +380,7 @@ static int do_launder_page(struct address_space *mapping, struct page *page) * Any pages which are found to be mapped into pagetables are unmapped prior to * invalidation. * - * Returns -EIO if any pages could not be invalidated. + * Returns -EBUSY if any pages could not be invalidated. */ int invalidate_inode_pages2_range(struct address_space *mapping, pgoff_t start, pgoff_t end) @@ -440,7 +440,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping, ret2 = do_launder_page(mapping, page); if (ret2 == 0) { if (!invalidate_complete_page2(mapping, page)) - ret2 = -EIO; + ret2 = -EBUSY; } if (ret2 < 0) ret = ret2;