Prev: [PATCHv5 11/16] ext2: fix race condition in marking SB dirty
Next: [PATCHv5 12/16] ext4: fix race condition in marking SB dirty
From: Artem Bityutskiy on 6 Jun 2010 11:00 From: Artem Bityutskiy <Artem.Bityutskiy(a)nokia.com> When synchronizing the superblock, exofs 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(a)nokia.com> Cc: Boaz Harrosh <bharrosh(a)panasas.com> --- fs/exofs/super.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/fs/exofs/super.c b/fs/exofs/super.c index 74ccbdc..0b432b9 100644 --- a/fs/exofs/super.c +++ b/fs/exofs/super.c @@ -219,6 +219,7 @@ int exofs_sync_fs(struct super_block *sb, int wait) * the fscb->s_dev_table_oid member. There is no read-modify-write * here. */ + sb_mark_clean(sb); ios->length = offsetof(struct exofs_fscb, s_dev_table_oid); memset(fscb, 0, ios->length); fscb->s_nextid = cpu_to_le64(sbi->s_nextid); @@ -237,7 +238,6 @@ int exofs_sync_fs(struct super_block *sb, int wait) EXOFS_ERR("%s: exofs_sbi_write failed.\n", __func__); goto out; } - sb_mark_clean(sb); out: EXOFS_DBGMSG("s_nextid=0x%llx ret=%d\n", _LLU(sbi->s_nextid), ret); -- 1.7.0.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |