udf: Don't modify filesystem for read-only mounts
authorJan Kara <jack@suse.com>
Thu, 20 Aug 2015 12:50:07 +0000 (14:50 +0200)
committerJan Kara <jack@suse.com>
Thu, 20 Aug 2015 12:58:35 +0000 (14:58 +0200)
When read-write mount of a filesystem is requested but we find out we
can mount the filesystem only in read-only mode, we still modify
LVID in udf_close_lvid(). That is both unnecessary and contrary to
expectation that when we fall back to read-only mount we don't modify
the filesystem.

Make sure we call udf_close_lvid() only if we called udf_open_lvid() so
that filesystem gets modified only if we verified we are allowed to
write to it.

Reported-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Jan Kara <jack@suse.com>
fs/udf/super.c

index b96f190..81155b9 100644 (file)
@@ -2070,6 +2070,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
        struct udf_options uopt;
        struct kernel_lb_addr rootdir, fileset;
        struct udf_sb_info *sbi;
+       bool lvid_open = false;
 
        uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
        uopt.uid = INVALID_UID;
@@ -2216,8 +2217,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
                         le16_to_cpu(ts.year), ts.month, ts.day,
                         ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone));
        }
-       if (!(sb->s_flags & MS_RDONLY))
+       if (!(sb->s_flags & MS_RDONLY)) {
                udf_open_lvid(sb);
+               lvid_open = true;
+       }
 
        /* Assign the root inode */
        /* assign inodes by physical block number */
@@ -2248,7 +2251,7 @@ parse_options_failure:
        if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
                unload_nls(sbi->s_nls_map);
 #endif
-       if (!(sb->s_flags & MS_RDONLY))
+       if (lvid_open)
                udf_close_lvid(sb);
        brelse(sbi->s_lvid_bh);
        udf_sb_free_partitions(sb);