For complex reasons it is not possible to hold i_sem in nfs_update_indoe(). Hence the i_size_write() in there is deadlocky. Go back to the old way. --- fs/nfs/inode.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff -puN fs/nfs/inode.c~nfs-avoid-i_size_write fs/nfs/inode.c --- 25/fs/nfs/inode.c~nfs-avoid-i_size_write 2004-02-28 18:11:48.000000000 -0800 +++ 25-akpm/fs/nfs/inode.c 2004-02-28 18:11:48.000000000 -0800 @@ -802,7 +802,7 @@ nfs_setattr(struct dentry *dentry, struc if ((attr->ia_valid & ATTR_GID) != 0) inode->i_gid = attr->ia_gid; if ((attr->ia_valid & ATTR_SIZE) != 0) { - i_size_write(inode, attr->ia_size); + inode->i_size = attr->ia_size; vmtruncate(inode, attr->ia_size); } } @@ -1162,11 +1162,11 @@ static int nfs_update_inode(struct inode */ if (S_ISREG(inode->i_mode) && data_unstable) { if (new_isize > cur_isize) { - i_size_write(inode, new_isize); + inode->i_size = new_isize; invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; } } else { - i_size_write(inode, new_isize); + inode->i_size = new_isize; invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; } } _