linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Artem Bityutskiy <dedekind1@gmail.com>
To: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	LKML <linux-kernel@vger.kernel.org>,
	linux-fsdevel@vger.kernel.org,
	Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Subject: [PATCHv5 11/16] ext2: fix race condition in marking SB dirty
Date: Sun,  6 Jun 2010 17:50:24 +0300	[thread overview]
Message-ID: <1275835829-1478-12-git-send-email-dedekind1@gmail.com> (raw)
In-Reply-To: <1275835829-1478-1-git-send-email-dedekind1@gmail.com>

From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>

When synchronizing the superblock, ext2 first initiates the SB write
(a) and then marks the superblock as clean (b). However, meanwhile
(between (a) and (b)) someone else can modify the superblock and
mark it as dirty. This would be a race condition, and the result
would be that we'd end up with a modified superblock which would
nevertheless be marked as clean (because of (b)). This means that
'sync_supers()' would never call our '->write_super()', at least
not until yet another SB change happens.

This patch fixes this race condition by marking the superblock as
clean before initiating the write operation.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
---
 fs/ext2/super.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 39eb5df..611d4c4 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -1145,6 +1145,7 @@ static void ext2_clear_super_error(struct super_block *sb)
 static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,
 			    int wait)
 {
+	sb_mark_clean(sb);
 	ext2_clear_super_error(sb);
 	spin_lock(&EXT2_SB(sb)->s_lock);
 	es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb));
@@ -1155,7 +1156,6 @@ static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,
 	mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
 	if (wait)
 		sync_dirty_buffer(EXT2_SB(sb)->s_sbh);
-	sb_mark_clean(sb);
 }
 
 /*
-- 
1.7.0.1

  parent reply	other threads:[~2010-06-06 14:50 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-06 14:50 [PATCHv5 00/16] kill unnecessary SB sync wake-ups + cleanups Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 01/16] VFS: introduce helpers for the s_dirt flag Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 02/16] VFS: rename s_dirt to s_dirty Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 03/16] writeback: lessen sync_supers wakeup count Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 04/16] VFS: add memory barrier to sb_mark_clean and sb_mark_dirty Artem Bityutskiy
2010-06-06 17:16   ` Artem Bityutskiy
2010-06-06 19:22     ` Artem Bityutskiy
2010-06-09 16:36   ` Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 05/16] AFFS: clean up dirty flag usage Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 06/16] AFFS: wait for sb synchronization when needed Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 07/16] AFFS: fix race condition in marking SB dirty Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 08/16] BFS: clean up the superblock usage Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 09/16] btrfs: remove junk sb_mark_dirty call Artem Bityutskiy
2010-06-12  7:36   ` Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 10/16] exofs: fix race condition in marking SB dirty Artem Bityutskiy
2010-06-06 16:12   ` Boaz Harrosh
2010-06-06 14:50 ` Artem Bityutskiy [this message]
2010-06-06 14:50 ` [PATCHv5 12/16] ext4: " Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 13/16] HFS: " Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 14/16] HFS: kill hfs_buffer_sync Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 15/16] HFS: wait for sb synchronization when needed Artem Bityutskiy
2010-06-06 14:50 ` [PATCHv5 16/16] HFSPLUS: wait for synchronization Artem Bityutskiy

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=1275835829-1478-12-git-send-email-dedekind1@gmail.com \
    --to=dedekind1@gmail.com \
    --cc=Artem.Bityutskiy@nokia.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).