From 99e8c3e7f937726800d2485671f0b3c153f6c328 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 25 Mar 2006 03:07:57 -0800 Subject: [PATCH] --- yaml --- r: 23584 b: refs/heads/master c: 7e53cac41da9ebb9be774220c1b2615182667c9d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index b06f2e572bb8..095215fc0a47 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 341546f5ad6fce584531f744853a5807a140f2a9 +refs/heads/master: 7e53cac41da9ebb9be774220c1b2615182667c9d diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index 1baf1b06fe47..712dfc77793b 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -2627,16 +2627,27 @@ int __page_symlink(struct inode *inode, const char *symname, int len, int err = -ENOMEM; char *kaddr; +retry: page = find_or_create_page(mapping, 0, gfp_mask); if (!page) goto fail; err = mapping->a_ops->prepare_write(NULL, page, 0, len-1); + if (err == AOP_TRUNCATED_PAGE) { + page_cache_release(page); + goto retry; + } if (err) goto fail_map; kaddr = kmap_atomic(page, KM_USER0); memcpy(kaddr, symname, len-1); kunmap_atomic(kaddr, KM_USER0); - mapping->a_ops->commit_write(NULL, page, 0, len-1); + err = mapping->a_ops->commit_write(NULL, page, 0, len-1); + if (err == AOP_TRUNCATED_PAGE) { + page_cache_release(page); + goto retry; + } + if (err) + goto fail_map; /* * Notice that we are _not_ going to block here - end of page is * unmapped, so this will only try to map the rest of page, see @@ -2646,7 +2657,8 @@ int __page_symlink(struct inode *inode, const char *symname, int len, */ if (!PageUptodate(page)) { err = mapping->a_ops->readpage(NULL, page); - wait_on_page_locked(page); + if (err != AOP_TRUNCATED_PAGE) + wait_on_page_locked(page); } else { unlock_page(page); }