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.



---

 25-akpm/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	Tue Feb 10 13:08:36 2004
+++ 25-akpm/fs/nfs/inode.c	Tue Feb 10 13:08:36 2004
@@ -834,7 +834,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);
 		}
 	}
@@ -1193,11 +1193,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;
 		}
 	}

_