Commit 949f4a7c08bc4a050eae7aeeac3e6d019d1feafb

Authored by Jan Kara
1 parent d664b6af60

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

... ... @@ -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)