Messages in this thread Patch in this message | | | From | Artem Bityutskiy <> | Subject | [PATCHv5 07/16] AFFS: fix race condition in marking SB dirty | Date | Sun, 6 Jun 2010 17:50:20 +0300 |
| |
From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
When synchronizing the superblock, AFFS 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> --- fs/affs/super.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/fs/affs/super.c b/fs/affs/super.c index a1e0f10..e93a1e3 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -32,6 +32,7 @@ affs_commit_super(struct super_block *sb, int wait, int clean) struct buffer_head *bh = sbi->s_root_bh; struct affs_root_tail *tail = AFFS_ROOT_TAIL(sb, bh); + sb_mark_clean(sb); tail->bm_flag = cpu_to_be32(clean); secs_to_datestamp(get_seconds(), &tail->disk_change); affs_fix_checksum(sb, bh); @@ -66,7 +67,6 @@ affs_write_super(struct super_block *sb) lock_super(sb); if (!(sb->s_flags & MS_RDONLY)) affs_commit_super(sb, 1, 2); - sb_mark_clean(sb); unlock_super(sb); pr_debug("AFFS: write_super() at %lu, clean=2\n", get_seconds()); @@ -77,7 +77,6 @@ affs_sync_fs(struct super_block *sb, int wait) { lock_super(sb); affs_commit_super(sb, wait, 2); - sb_mark_clean(sb); unlock_super(sb); return 0; } -- 1.7.0.1
| |