Looks like this failed b/c it was already applied in 2.6.37.3. I also
got a mail trying to apply it to 38-stable. This was included as part of
the original 38 release, so no need for it to be included in the 38-stable.

Josh

On 03/18/2011 03:27 PM, [email protected] wrote:
> 
> The patch below does not apply to the .37-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <[email protected]>.
> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> From 03885ac3c79ab7f3f4a8e502486be2ea6c85c3e3 Mon Sep 17 00:00:00 2001
> From: Josh Hunt <[email protected]>
> Date: Thu, 24 Feb 2011 11:48:22 +0100
> Subject: [PATCH] ext2: Fix link count corruption under heavy link+rename load
> 
> vfs_rename_other() does not lock renamed inode with i_mutex. Thus changing
> i_nlink in a non-atomic manner (which happens in ext2_rename()) can corrupt
> it as reported and analyzed by Josh.
> 
> In fact, there is no good reason to mess with i_nlink of the moved file.
> We did it presumably to simulate linking into the new directory and unlinking
> from an old one. But the practical effect of this is disputable because fsck
> can possibly treat file as being properly linked into both directories without
> writing any error which is confusing. So we just stop increment-decrement
> games with i_nlink which also fixes the corruption.
> 
> CC: [email protected]
> CC: Al Viro <[email protected]>
> Signed-off-by: Josh Hunt <[email protected]>
> Signed-off-by: Jan Kara <[email protected]>
> 
> diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
> index 2e1d834..adb9185 100644
> --- a/fs/ext2/namei.c
> +++ b/fs/ext2/namei.c
> @@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct 
> dentry * old_dentry,
>               new_de = ext2_find_entry (new_dir, &new_dentry->d_name, 
> &new_page);
>               if (!new_de)
>                       goto out_dir;
> -             inode_inc_link_count(old_inode);
>               ext2_set_link(new_dir, new_de, new_page, old_inode, 1);
>               new_inode->i_ctime = CURRENT_TIME_SEC;
>               if (dir_de)
> @@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct 
> dentry * old_dentry,
>                       if (new_dir->i_nlink >= EXT2_LINK_MAX)
>                               goto out_dir;
>               }
> -             inode_inc_link_count(old_inode);
>               err = ext2_add_link(new_dentry, old_inode);
> -             if (err) {
> -                     inode_dec_link_count(old_inode);
> +             if (err)
>                       goto out_dir;
> -             }
>               if (dir_de)
>                       inode_inc_link_count(new_dir);
>       }
> @@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct 
> dentry * old_dentry,
>       /*
>        * Like most other Unix systems, set the ctime for inodes on a
>        * rename.
> -      * inode_dec_link_count() will mark the inode dirty.
>        */
>       old_inode->i_ctime = CURRENT_TIME_SEC;
> +     mark_inode_dirty(old_inode);
>  
>       ext2_delete_entry (old_de, old_page);
> -     inode_dec_link_count(old_inode);
>  
>       if (dir_de) {
>               if (old_dir != new_dir)
> 

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to