Commit 949f4a7c08bc4a050eae7aeeac3e6d019d1feafb
1 parent
d664b6af60
Exists in
master
and in
4 other branches
udf: Protect all modifications of LVID with s_alloc_mutex
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>
Showing 1 changed file with 5 additions and 0 deletions Side-by-side Diff
fs/udf/super.c
... | ... | @@ -1773,6 +1773,8 @@ |
1773 | 1773 | |
1774 | 1774 | if (!bh) |
1775 | 1775 | return; |
1776 | + | |
1777 | + mutex_lock(&sbi->s_alloc_mutex); | |
1776 | 1778 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; |
1777 | 1779 | lvidiu = udf_sb_lvidiu(sbi); |
1778 | 1780 | |
... | ... | @@ -1789,6 +1791,7 @@ |
1789 | 1791 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); |
1790 | 1792 | mark_buffer_dirty(bh); |
1791 | 1793 | sbi->s_lvid_dirty = 0; |
1794 | + mutex_unlock(&sbi->s_alloc_mutex); | |
1792 | 1795 | } |
1793 | 1796 | |
1794 | 1797 | static void udf_close_lvid(struct super_block *sb) |
... | ... | @@ -1801,6 +1804,7 @@ |
1801 | 1804 | if (!bh) |
1802 | 1805 | return; |
1803 | 1806 | |
1807 | + mutex_lock(&sbi->s_alloc_mutex); | |
1804 | 1808 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; |
1805 | 1809 | lvidiu = udf_sb_lvidiu(sbi); |
1806 | 1810 | lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
... | ... | @@ -1821,6 +1825,7 @@ |
1821 | 1825 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); |
1822 | 1826 | mark_buffer_dirty(bh); |
1823 | 1827 | sbi->s_lvid_dirty = 0; |
1828 | + mutex_unlock(&sbi->s_alloc_mutex); | |
1824 | 1829 | } |
1825 | 1830 | |
1826 | 1831 | u64 lvid_get_unique_id(struct super_block *sb) |