Index: linux-2.6.9/fs/attr.c =================================================================== --- linux-2.6.9/fs.orig/attr.c 2006-03-10 17:20:39.000000000 +0200 +++ linux-2.6.9/fs/attr.c 2006-04-09 01:21:44.000000000 +0300 @@ -177,6 +177,9 @@ if (!attr->ia_valid) return 0; + if (ia_valid & ATTR_SIZE) + down_write(&dentry->d_inode->i_alloc_sem); + if (inode->i_op && inode->i_op->setattr) { audit_notify_watch(inode, MAY_WRITE); error = security_inode_setattr(dentry, attr); @@ -194,6 +197,10 @@ error = inode_setattr(inode, attr); } } + + if (ia_valid & ATTR_SIZE) + up_write(&dentry->d_inode->i_alloc_sem); + if (!error) { unsigned long dn_mask = setattr_mask(ia_valid); if (dn_mask) Index: linux-2.6.9/fs/open.c =================================================================== --- linux-2.6.9/fs.orig/open.c 2006-04-09 01:18:08.000000000 +0300 +++ linux-2.6.9/fs/open.c 2006-04-09 01:22:29.000000000 +0300 @@ -205,16 +205,16 @@ newattrs.ia_size = length; newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; down(&dentry->d_inode->i_sem); - down_write(&dentry->d_inode->i_alloc_sem); if (called_from_open) newattrs.ia_valid |= ATTR_FROM_OPEN; if (op->setattr_raw) { newattrs.ia_valid |= ATTR_RAW; newattrs.ia_ctime = CURRENT_TIME; + down_write(&dentry->d_inode->i_alloc_sem); err = op->setattr_raw(dentry->d_inode, &newattrs); + up_write(&dentry->d_inode->i_alloc_sem); } else err = notify_change(dentry, &newattrs); - up_write(&dentry->d_inode->i_alloc_sem); up(&dentry->d_inode->i_sem); return err; }