udf: Protect all modifications of LVID with s_alloc_mutex
authorJan Kara <jack@suse.cz>
Wed, 20 Oct 2010 16:49:20 +0000 (18:49 +0200)
committerJan Kara <jack@suse.cz>
Thu, 6 Jan 2011 16:03:55 +0000 (17:03 +0100)
udf_open_lvid() and udf_close_lvid() were modifying LVID without
s_alloc_mutex. Since they can be called from remount, the modification
could race with other filesystem modifications of LVID so protect them
by s_alloc_mutex just to be sure.

Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/super.c

index 948e1aca0f34bfa6c2a21f168d089f158dc66140..e54960c0e960560c8844d80e98553227bbbabae5 100644 (file)
@@ -1773,6 +1773,8 @@ static void udf_open_lvid(struct super_block *sb)
 
        if (!bh)
                return;
+
+       mutex_lock(&sbi->s_alloc_mutex);
        lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
        lvidiu = udf_sb_lvidiu(sbi);
 
@@ -1789,6 +1791,7 @@ static void udf_open_lvid(struct super_block *sb)
        lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
        mark_buffer_dirty(bh);
        sbi->s_lvid_dirty = 0;
+       mutex_unlock(&sbi->s_alloc_mutex);
 }
 
 static void udf_close_lvid(struct super_block *sb)
@@ -1801,6 +1804,7 @@ static void udf_close_lvid(struct super_block *sb)
        if (!bh)
                return;
 
+       mutex_lock(&sbi->s_alloc_mutex);
        lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
        lvidiu = udf_sb_lvidiu(sbi);
        lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
@@ -1821,6 +1825,7 @@ static void udf_close_lvid(struct super_block *sb)
        lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
        mark_buffer_dirty(bh);
        sbi->s_lvid_dirty = 0;
+       mutex_unlock(&sbi->s_alloc_mutex);
 }
 
 u64 lvid_get_unique_id(struct super_block *sb)