linux/fs/ext3
Andrew Morton 1aa9b4b9bc [PATCH] revert "retries in ext3_prepare_write() violate ordering requirements"
Revert e92a4d595b.

Dmitry points out

"When we block_prepare_write() failed while ext3_prepare_write() we jump to
 "failure" label and call ext3_prepare_failure() witch search last mapped bh
 and invoke commit_write untill it.  This is wrong!!  because some bh from
 begining to the last mapped bh may be not uptodate.  As a result we commit to
 disk not uptodate page content witch contains garbage from previous usage."

and

"Unexpected file size increasing."

   Call trace the same as it was in first issue but result is different.
   For example we have file with i_size is zero.  we want write two blocks ,
   but fs has only one free block.

   ->ext3_prepare_write(...from == 0, to == 2048)
     retry:
     ->block_prepare_write() == -ENOSPC# we failed but allocated one block here.
     ->ext3_prepare_failure()
       ->commit_write( from == 0, to == 1024) # after this i_size becomes 1024 :)
     if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
        goto retry;

   Finally when all retries will be spended ext3_prepare_failure return
   -ENOSPC, but i_size was increased and later block trimm procedures can't
   help here.

We don't appear to have the horsepower to fix these issues, so let's put
things back the way they were for now.

Cc: Kirill Korotaev <dev@openvz.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Ken Chen <kenneth.w.chen@intel.com>
Cc: Andrey Savochkin <saw@sw.ru>
Cc: <linux-ext4@vger.kernel.org>
Cc: Dmitriy Monakhov <dmonakhov@openvz.org>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-04-02 10:06:08 -07:00
..
acl.c [PATCH] fs: Removing useless casts 2006-09-27 08:26:10 -07:00
acl.h [PATCH] Remove leftover ext3 acl declarations 2006-07-10 13:24:26 -07:00
balloc.c [PATCH] ext[234]: update documentation 2007-02-20 17:10:14 -08:00
bitmap.c [PATCH] ext3 and jbd cleanup: remove whitespace 2006-09-27 08:26:09 -07:00
dir.c [PATCH] ext3: change uses of f_{dentry, vfsmnt} to use f_path 2006-12-08 08:28:41 -08:00
ext3_jbd.c [PATCH] ext3: uninline large functions 2006-12-07 08:39:35 -08:00
file.c [PATCH] mark struct inode_operations const 1 2007-02-12 09:48:46 -08:00
fsync.c [PATCH] ext3 and jbd cleanup: remove whitespace 2006-09-27 08:26:09 -07:00
hash.c [PATCH] remove many unneeded #includes of sched.h 2007-02-14 08:09:54 -08:00
ialloc.c [PATCH] inode-diet: Eliminate i_blksize from the inode structure 2006-09-27 08:26:18 -07:00
inode.c [PATCH] revert "retries in ext3_prepare_write() violate ordering requirements" 2007-04-02 10:06:08 -07:00
ioctl.c [PATCH] ext3: change uses of f_{dentry, vfsmnt} to use f_path 2006-12-08 08:28:41 -08:00
Makefile [PATCH] ext3: uninline large functions 2006-12-07 08:39:35 -08:00
namei.c [PATCH] mark struct inode_operations const 1 2007-02-12 09:48:46 -08:00
namei.h [PATCH] ext3: sparse fixes 2005-10-30 17:37:25 -08:00
resize.c [PATCH] remove many unneeded #includes of sched.h 2007-02-14 08:09:54 -08:00
super.c [PATCH] Mark struct super_operations const 2007-02-12 09:48:47 -08:00
symlink.c [PATCH] mark struct inode_operations const 1 2007-02-12 09:48:46 -08:00
xattr.c [PATCH] "ext[34]: EA block reference count racing fix" performance fix 2007-03-23 11:01:22 -07:00
xattr.h Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
xattr_security.c
xattr_trusted.c [PATCH] capable/capability.h (fs/) 2006-01-11 18:42:13 -08:00
xattr_user.c [PATCH] remove ext3 xattr permission checks 2006-01-10 08:01:30 -08:00