mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
	akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
	Al Viro <viro@ZenIV.linux.org.uk>, Josh Hunt <johunt@akamai.com>,
	Jan Kara <jack@suse.cz>
Subject: [07/18] ext2: Fix link count corruption under heavy link+rename load
Date: Fri, 04 Mar 2011 17:03:01 -0800	[thread overview]
Message-ID: <20110305010352.504367425@clark.kroah.org> (raw)
In-Reply-To: <20110305010410.GA18668@kroah.com>

2.6.32-longterm review patch.  If anyone has any objections, please let us know.

------------------

From: Josh Hunt <johunt@akamai.com>

commit e8a80c6f769dd4622d8b211b398452158ee60c0b upstream.

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: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Josh Hunt <johunt@akamai.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 fs/ext2/namei.c |    9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

--- a/fs/ext2/namei.c
+++ b/fs/ext2/namei.c
@@ -327,7 +327,6 @@ static int ext2_rename (struct inode * o
 		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)
@@ -339,12 +338,9 @@ static int ext2_rename (struct inode * o
 			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);
 	}
@@ -352,12 +348,11 @@ static int ext2_rename (struct inode * o
 	/*
 	 * 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)



  parent reply	other threads:[~2011-03-05  1:05 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-05  1:04 [00/18] 2.6.32.32-longterm review Greg KH
2011-03-05  1:02 ` [01/18] Ocfs2/refcounttree: Fix a bug for refcounttree to writeback clusters in a right number Greg KH
2011-03-05  1:02 ` [02/18] drm: fix unsigned vs signed comparison issue in modeset ctl ioctl Greg KH
2011-03-05  1:02 ` [03/18] mfd: Fix NULL pointer due to non-initialized ucb1x00-ts absinfo Greg KH
2011-03-05  1:02 ` [04/18] x86: Use u32 instead of long to set reset vector back to 0 Greg KH
2011-03-05  1:02 ` [05/18] fuse: fix hang of single threaded fuseblk filesystem Greg KH
2011-03-05  1:03 ` [06/18] clockevents: Prevent oneshot mode when broadcast device is periodic Greg KH
2011-03-05  1:03 ` Greg KH [this message]
2011-03-05  1:03 ` [08/18] sctp: Fix oops when sending queued ASCONF chunks Greg KH
2011-03-05  1:03 ` [09/18] virtio: set pci bus master enable bit Greg KH
2011-03-05  1:03 ` [10/18] netxen: fix set mac addr Greg KH
2011-03-05  1:03 ` [11/18] HID: add support for Acan FG-8100 barcode reader Greg KH
2011-03-05  1:03 ` [12/18] p54usb: add Senao NUB-350 usbid Greg KH
2011-03-05  1:03 ` [13/18] dccp: fix oops on Reset after close Greg KH
2011-03-05  1:03 ` [14/18] e1000e: disable broken PHY wakeup for ICH10 LOMs, use MAC wakeup instead Greg KH
2011-03-05  1:03 ` [15/18] r8169: disable ASPM Greg KH
2011-03-05  1:03 ` [16/18] usb: iowarrior: dont trust report_size for buffer size Greg KH
2011-03-05  1:03 ` [17/18] arp_notify: unconditionally send gratuitous ARP for NETDEV_NOTIFY_PEERS Greg KH
2011-03-05  9:36   ` Ian Campbell
2011-03-05 17:45     ` Mike Surcouf
2011-03-05  1:03 ` [18/18] CIFS: Fix oplock break handling (try #2) Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110305010352.504367425@clark.kroah.org \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=jack@suse.cz \
    --cc=johunt@akamai.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable-review@kernel.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@ZenIV.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®