--- 2.4.17rc2aa2/mm/filemap.c.~1~ Wed Dec 19 03:43:23 2001 +++ 2.4.17rc2aa2/mm/filemap.c Fri Dec 21 02:21:07 2001 @@ -3026,8 +3025,14 @@ kaddr = kmap(page); status = mapping->a_ops->prepare_write(file, page, offset, offset+bytes); - if (status) + if (status) { + if (status == -ENOSPC && inode->i_op && inode->i_op->truncate) { + lock_kernel(); + inode->i_op->truncate(inode); + unlock_kernel(); + } goto unlock; + } page_fault = __copy_from_user(kaddr+offset, buf, bytes); flush_dcache_page(page); status = mapping->a_ops->commit_write(file, page, offset, offset+bytes); @@ -3090,6 +3095,14 @@ if (end > inode->i_size && !S_ISBLK(inode->i_mode)) { inode->i_size = end; mark_inode_dirty(inode); + } + /* there's the possibility that some get_block left some leftover */ + if (written != count) { + if (inode->i_op && inode->i_op->truncate) { + lock_kernel(); + inode->i_op->truncate(inode); + unlock_kernel(); + } } *ppos = end; invalidate_inode_pages2(mapping);