aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/super.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2010-10-20 12:28:46 -0400
committerJan Kara <jack@suse.cz>2011-01-06 11:03:55 -0500
commitd664b6af609ecf5e7dcedf92f0bf188e3a29b3e0 (patch)
tree865eb1db44abdceefea52e46117af61051b610e8 /fs/udf/super.c
parent49521de119d326d04fb3736ab827e12e1de966d0 (diff)
udf: Move handling of uniqueID into a helper function and protect it by a s_alloc_mutex
uniqueID handling has been duplicated in three places. Move it into a common helper. Since we modify an LVID buffer with uniqueID update, we take sbi->s_alloc_mutex to protect agaist other modifications of the structure. Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf/super.c')
-rw-r--r--fs/udf/super.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c
index f99ff5dbd741..948e1aca0f34 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -1823,6 +1823,33 @@ static void udf_close_lvid(struct super_block *sb)
1823 sbi->s_lvid_dirty = 0; 1823 sbi->s_lvid_dirty = 0;
1824} 1824}
1825 1825
1826u64 lvid_get_unique_id(struct super_block *sb)
1827{
1828 struct buffer_head *bh;
1829 struct udf_sb_info *sbi = UDF_SB(sb);
1830 struct logicalVolIntegrityDesc *lvid;
1831 struct logicalVolHeaderDesc *lvhd;
1832 u64 uniqueID;
1833 u64 ret;
1834
1835 bh = sbi->s_lvid_bh;
1836 if (!bh)
1837 return 0;
1838
1839 lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1840 lvhd = (struct logicalVolHeaderDesc *)lvid->logicalVolContentsUse;
1841
1842 mutex_lock(&sbi->s_alloc_mutex);
1843 ret = uniqueID = le64_to_cpu(lvhd->uniqueID);
1844 if (!(++uniqueID & 0xFFFFFFFF))
1845 uniqueID += 16;
1846 lvhd->uniqueID = cpu_to_le64(uniqueID);
1847 mutex_unlock(&sbi->s_alloc_mutex);
1848 mark_buffer_dirty(bh);
1849
1850 return ret;
1851}
1852
1826static void udf_sb_free_bitmap(struct udf_bitmap *bitmap) 1853static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
1827{ 1854{
1828 int i; 1855 int i;