i_sem is required when running i_size_write(). Really, this patch is not necessary - nobody else will be trying to modify i_size while we're running page_symlink(). The directory's i_sem is held so nobody can find the new symlink. --- fs/namei.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) diff -puN fs/namei.c~page_symlink-needs-i_sem fs/namei.c --- 25/fs/namei.c~page_symlink-needs-i_sem 2004-02-03 02:45:11.000000000 -0800 +++ 25-akpm/fs/namei.c 2004-02-03 02:46:39.000000000 -0800 @@ -2242,13 +2242,17 @@ int page_symlink(struct inode *inode, co if (!page) goto fail; + down(&inode->i_sem); err = mapping->a_ops->prepare_write(NULL, page, 0, len-1); - if (err) + if (err) { + up(&inode->i_sem); 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); + up(&inode->i_sem); /* * 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 _