diff options
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/file.c | 35 | ||||
-rw-r--r-- | fs/udf/inode.c | 9 | ||||
-rw-r--r-- | fs/udf/namei.c | 5 | ||||
-rw-r--r-- | fs/udf/super.c | 137 | ||||
-rw-r--r-- | fs/udf/truncate.c | 4 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 1 |
6 files changed, 109 insertions, 82 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index 7f3f7ba3df6..d1c6093fd3d 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -39,20 +39,24 @@ | |||
39 | #include "udf_i.h" | 39 | #include "udf_i.h" |
40 | #include "udf_sb.h" | 40 | #include "udf_sb.h" |
41 | 41 | ||
42 | static int udf_adinicb_readpage(struct file *file, struct page *page) | 42 | static void __udf_adinicb_readpage(struct page *page) |
43 | { | 43 | { |
44 | struct inode *inode = page->mapping->host; | 44 | struct inode *inode = page->mapping->host; |
45 | char *kaddr; | 45 | char *kaddr; |
46 | struct udf_inode_info *iinfo = UDF_I(inode); | 46 | struct udf_inode_info *iinfo = UDF_I(inode); |
47 | 47 | ||
48 | BUG_ON(!PageLocked(page)); | ||
49 | |||
50 | kaddr = kmap(page); | 48 | kaddr = kmap(page); |
51 | memset(kaddr, 0, PAGE_CACHE_SIZE); | ||
52 | memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size); | 49 | memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size); |
50 | memset(kaddr + inode->i_size, 0, PAGE_CACHE_SIZE - inode->i_size); | ||
53 | flush_dcache_page(page); | 51 | flush_dcache_page(page); |
54 | SetPageUptodate(page); | 52 | SetPageUptodate(page); |
55 | kunmap(page); | 53 | kunmap(page); |
54 | } | ||
55 | |||
56 | static int udf_adinicb_readpage(struct file *file, struct page *page) | ||
57 | { | ||
58 | BUG_ON(!PageLocked(page)); | ||
59 | __udf_adinicb_readpage(page); | ||
56 | unlock_page(page); | 60 | unlock_page(page); |
57 | 61 | ||
58 | return 0; | 62 | return 0; |
@@ -77,6 +81,25 @@ static int udf_adinicb_writepage(struct page *page, | |||
77 | return 0; | 81 | return 0; |
78 | } | 82 | } |
79 | 83 | ||
84 | static int udf_adinicb_write_begin(struct file *file, | ||
85 | struct address_space *mapping, loff_t pos, | ||
86 | unsigned len, unsigned flags, struct page **pagep, | ||
87 | void **fsdata) | ||
88 | { | ||
89 | struct page *page; | ||
90 | |||
91 | if (WARN_ON_ONCE(pos >= PAGE_CACHE_SIZE)) | ||
92 | return -EIO; | ||
93 | page = grab_cache_page_write_begin(mapping, 0, flags); | ||
94 | if (!page) | ||
95 | return -ENOMEM; | ||
96 | *pagep = page; | ||
97 | |||
98 | if (!PageUptodate(page) && len != PAGE_CACHE_SIZE) | ||
99 | __udf_adinicb_readpage(page); | ||
100 | return 0; | ||
101 | } | ||
102 | |||
80 | static int udf_adinicb_write_end(struct file *file, | 103 | static int udf_adinicb_write_end(struct file *file, |
81 | struct address_space *mapping, | 104 | struct address_space *mapping, |
82 | loff_t pos, unsigned len, unsigned copied, | 105 | loff_t pos, unsigned len, unsigned copied, |
@@ -98,8 +121,8 @@ static int udf_adinicb_write_end(struct file *file, | |||
98 | const struct address_space_operations udf_adinicb_aops = { | 121 | const struct address_space_operations udf_adinicb_aops = { |
99 | .readpage = udf_adinicb_readpage, | 122 | .readpage = udf_adinicb_readpage, |
100 | .writepage = udf_adinicb_writepage, | 123 | .writepage = udf_adinicb_writepage, |
101 | .write_begin = simple_write_begin, | 124 | .write_begin = udf_adinicb_write_begin, |
102 | .write_end = udf_adinicb_write_end, | 125 | .write_end = udf_adinicb_write_end, |
103 | }; | 126 | }; |
104 | 127 | ||
105 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | 128 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 873e1bab9c4..aa233469b3c 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -1124,14 +1124,17 @@ int udf_setsize(struct inode *inode, loff_t newsize) | |||
1124 | if (err) | 1124 | if (err) |
1125 | return err; | 1125 | return err; |
1126 | down_write(&iinfo->i_data_sem); | 1126 | down_write(&iinfo->i_data_sem); |
1127 | } else | 1127 | } else { |
1128 | iinfo->i_lenAlloc = newsize; | 1128 | iinfo->i_lenAlloc = newsize; |
1129 | goto set_size; | ||
1130 | } | ||
1129 | } | 1131 | } |
1130 | err = udf_extend_file(inode, newsize); | 1132 | err = udf_extend_file(inode, newsize); |
1131 | if (err) { | 1133 | if (err) { |
1132 | up_write(&iinfo->i_data_sem); | 1134 | up_write(&iinfo->i_data_sem); |
1133 | return err; | 1135 | return err; |
1134 | } | 1136 | } |
1137 | set_size: | ||
1135 | truncate_setsize(inode, newsize); | 1138 | truncate_setsize(inode, newsize); |
1136 | up_write(&iinfo->i_data_sem); | 1139 | up_write(&iinfo->i_data_sem); |
1137 | } else { | 1140 | } else { |
@@ -1247,7 +1250,6 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1247 | { | 1250 | { |
1248 | struct fileEntry *fe; | 1251 | struct fileEntry *fe; |
1249 | struct extendedFileEntry *efe; | 1252 | struct extendedFileEntry *efe; |
1250 | int offset; | ||
1251 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | 1253 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); |
1252 | struct udf_inode_info *iinfo = UDF_I(inode); | 1254 | struct udf_inode_info *iinfo = UDF_I(inode); |
1253 | unsigned int link_count; | 1255 | unsigned int link_count; |
@@ -1359,7 +1361,6 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1359 | iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr); | 1361 | iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr); |
1360 | iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs); | 1362 | iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs); |
1361 | iinfo->i_checkpoint = le32_to_cpu(fe->checkpoint); | 1363 | iinfo->i_checkpoint = le32_to_cpu(fe->checkpoint); |
1362 | offset = sizeof(struct fileEntry) + iinfo->i_lenEAttr; | ||
1363 | } else { | 1364 | } else { |
1364 | inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << | 1365 | inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << |
1365 | (inode->i_sb->s_blocksize_bits - 9); | 1366 | (inode->i_sb->s_blocksize_bits - 9); |
@@ -1381,8 +1382,6 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1381 | iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr); | 1382 | iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr); |
1382 | iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs); | 1383 | iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs); |
1383 | iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint); | 1384 | iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint); |
1384 | offset = sizeof(struct extendedFileEntry) + | ||
1385 | iinfo->i_lenEAttr; | ||
1386 | } | 1385 | } |
1387 | 1386 | ||
1388 | switch (fe->icbTag.fileType) { | 1387 | switch (fe->icbTag.fileType) { |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 18024178ac4..95fee278ab9 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -251,7 +251,7 @@ out_ok: | |||
251 | } | 251 | } |
252 | 252 | ||
253 | static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | 253 | static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, |
254 | struct nameidata *nd) | 254 | unsigned int flags) |
255 | { | 255 | { |
256 | struct inode *inode = NULL; | 256 | struct inode *inode = NULL; |
257 | struct fileIdentDesc cfi; | 257 | struct fileIdentDesc cfi; |
@@ -551,7 +551,7 @@ static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, | |||
551 | } | 551 | } |
552 | 552 | ||
553 | static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, | 553 | static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, |
554 | struct nameidata *nd) | 554 | bool excl) |
555 | { | 555 | { |
556 | struct udf_fileident_bh fibh; | 556 | struct udf_fileident_bh fibh; |
557 | struct inode *inode; | 557 | struct inode *inode; |
@@ -1279,6 +1279,7 @@ static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp, | |||
1279 | *lenp = 3; | 1279 | *lenp = 3; |
1280 | fid->udf.block = location.logicalBlockNum; | 1280 | fid->udf.block = location.logicalBlockNum; |
1281 | fid->udf.partref = location.partitionReferenceNum; | 1281 | fid->udf.partref = location.partitionReferenceNum; |
1282 | fid->udf.parent_partref = 0; | ||
1282 | fid->udf.generation = inode->i_generation; | 1283 | fid->udf.generation = inode->i_generation; |
1283 | 1284 | ||
1284 | if (parent) { | 1285 | if (parent) { |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 8d86a8706c0..18fc038a438 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -252,6 +252,63 @@ static int udf_sb_alloc_partition_maps(struct super_block *sb, u32 count) | |||
252 | return 0; | 252 | return 0; |
253 | } | 253 | } |
254 | 254 | ||
255 | static void udf_sb_free_bitmap(struct udf_bitmap *bitmap) | ||
256 | { | ||
257 | int i; | ||
258 | int nr_groups = bitmap->s_nr_groups; | ||
259 | int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * | ||
260 | nr_groups); | ||
261 | |||
262 | for (i = 0; i < nr_groups; i++) | ||
263 | if (bitmap->s_block_bitmap[i]) | ||
264 | brelse(bitmap->s_block_bitmap[i]); | ||
265 | |||
266 | if (size <= PAGE_SIZE) | ||
267 | kfree(bitmap); | ||
268 | else | ||
269 | vfree(bitmap); | ||
270 | } | ||
271 | |||
272 | static void udf_free_partition(struct udf_part_map *map) | ||
273 | { | ||
274 | int i; | ||
275 | struct udf_meta_data *mdata; | ||
276 | |||
277 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) | ||
278 | iput(map->s_uspace.s_table); | ||
279 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) | ||
280 | iput(map->s_fspace.s_table); | ||
281 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) | ||
282 | udf_sb_free_bitmap(map->s_uspace.s_bitmap); | ||
283 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) | ||
284 | udf_sb_free_bitmap(map->s_fspace.s_bitmap); | ||
285 | if (map->s_partition_type == UDF_SPARABLE_MAP15) | ||
286 | for (i = 0; i < 4; i++) | ||
287 | brelse(map->s_type_specific.s_sparing.s_spar_map[i]); | ||
288 | else if (map->s_partition_type == UDF_METADATA_MAP25) { | ||
289 | mdata = &map->s_type_specific.s_metadata; | ||
290 | iput(mdata->s_metadata_fe); | ||
291 | mdata->s_metadata_fe = NULL; | ||
292 | |||
293 | iput(mdata->s_mirror_fe); | ||
294 | mdata->s_mirror_fe = NULL; | ||
295 | |||
296 | iput(mdata->s_bitmap_fe); | ||
297 | mdata->s_bitmap_fe = NULL; | ||
298 | } | ||
299 | } | ||
300 | |||
301 | static void udf_sb_free_partitions(struct super_block *sb) | ||
302 | { | ||
303 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
304 | int i; | ||
305 | |||
306 | for (i = 0; i < sbi->s_partitions; i++) | ||
307 | udf_free_partition(&sbi->s_partmaps[i]); | ||
308 | kfree(sbi->s_partmaps); | ||
309 | sbi->s_partmaps = NULL; | ||
310 | } | ||
311 | |||
255 | static int udf_show_options(struct seq_file *seq, struct dentry *root) | 312 | static int udf_show_options(struct seq_file *seq, struct dentry *root) |
256 | { | 313 | { |
257 | struct super_block *sb = root->d_sb; | 314 | struct super_block *sb = root->d_sb; |
@@ -1283,10 +1340,11 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1283 | BUG_ON(ident != TAG_IDENT_LVD); | 1340 | BUG_ON(ident != TAG_IDENT_LVD); |
1284 | lvd = (struct logicalVolDesc *)bh->b_data; | 1341 | lvd = (struct logicalVolDesc *)bh->b_data; |
1285 | table_len = le32_to_cpu(lvd->mapTableLength); | 1342 | table_len = le32_to_cpu(lvd->mapTableLength); |
1286 | if (sizeof(*lvd) + table_len > sb->s_blocksize) { | 1343 | if (table_len > sb->s_blocksize - sizeof(*lvd)) { |
1287 | udf_err(sb, "error loading logical volume descriptor: " | 1344 | udf_err(sb, "error loading logical volume descriptor: " |
1288 | "Partition table too long (%u > %lu)\n", table_len, | 1345 | "Partition table too long (%u > %lu)\n", table_len, |
1289 | sb->s_blocksize - sizeof(*lvd)); | 1346 | sb->s_blocksize - sizeof(*lvd)); |
1347 | ret = 1; | ||
1290 | goto out_bh; | 1348 | goto out_bh; |
1291 | } | 1349 | } |
1292 | 1350 | ||
@@ -1331,8 +1389,10 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1331 | UDF_ID_SPARABLE, | 1389 | UDF_ID_SPARABLE, |
1332 | strlen(UDF_ID_SPARABLE))) { | 1390 | strlen(UDF_ID_SPARABLE))) { |
1333 | if (udf_load_sparable_map(sb, map, | 1391 | if (udf_load_sparable_map(sb, map, |
1334 | (struct sparablePartitionMap *)gpm) < 0) | 1392 | (struct sparablePartitionMap *)gpm) < 0) { |
1393 | ret = 1; | ||
1335 | goto out_bh; | 1394 | goto out_bh; |
1395 | } | ||
1336 | } else if (!strncmp(upm2->partIdent.ident, | 1396 | } else if (!strncmp(upm2->partIdent.ident, |
1337 | UDF_ID_METADATA, | 1397 | UDF_ID_METADATA, |
1338 | strlen(UDF_ID_METADATA))) { | 1398 | strlen(UDF_ID_METADATA))) { |
@@ -1596,7 +1656,11 @@ static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, | |||
1596 | /* responsible for finding the PartitionDesc(s) */ | 1656 | /* responsible for finding the PartitionDesc(s) */ |
1597 | if (!udf_process_sequence(sb, main_s, main_e, fileset)) | 1657 | if (!udf_process_sequence(sb, main_s, main_e, fileset)) |
1598 | return 1; | 1658 | return 1; |
1599 | return !udf_process_sequence(sb, reserve_s, reserve_e, fileset); | 1659 | udf_sb_free_partitions(sb); |
1660 | if (!udf_process_sequence(sb, reserve_s, reserve_e, fileset)) | ||
1661 | return 1; | ||
1662 | udf_sb_free_partitions(sb); | ||
1663 | return 0; | ||
1600 | } | 1664 | } |
1601 | 1665 | ||
1602 | /* | 1666 | /* |
@@ -1861,55 +1925,8 @@ u64 lvid_get_unique_id(struct super_block *sb) | |||
1861 | return ret; | 1925 | return ret; |
1862 | } | 1926 | } |
1863 | 1927 | ||
1864 | static void udf_sb_free_bitmap(struct udf_bitmap *bitmap) | ||
1865 | { | ||
1866 | int i; | ||
1867 | int nr_groups = bitmap->s_nr_groups; | ||
1868 | int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * | ||
1869 | nr_groups); | ||
1870 | |||
1871 | for (i = 0; i < nr_groups; i++) | ||
1872 | if (bitmap->s_block_bitmap[i]) | ||
1873 | brelse(bitmap->s_block_bitmap[i]); | ||
1874 | |||
1875 | if (size <= PAGE_SIZE) | ||
1876 | kfree(bitmap); | ||
1877 | else | ||
1878 | vfree(bitmap); | ||
1879 | } | ||
1880 | |||
1881 | static void udf_free_partition(struct udf_part_map *map) | ||
1882 | { | ||
1883 | int i; | ||
1884 | struct udf_meta_data *mdata; | ||
1885 | |||
1886 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) | ||
1887 | iput(map->s_uspace.s_table); | ||
1888 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) | ||
1889 | iput(map->s_fspace.s_table); | ||
1890 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) | ||
1891 | udf_sb_free_bitmap(map->s_uspace.s_bitmap); | ||
1892 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) | ||
1893 | udf_sb_free_bitmap(map->s_fspace.s_bitmap); | ||
1894 | if (map->s_partition_type == UDF_SPARABLE_MAP15) | ||
1895 | for (i = 0; i < 4; i++) | ||
1896 | brelse(map->s_type_specific.s_sparing.s_spar_map[i]); | ||
1897 | else if (map->s_partition_type == UDF_METADATA_MAP25) { | ||
1898 | mdata = &map->s_type_specific.s_metadata; | ||
1899 | iput(mdata->s_metadata_fe); | ||
1900 | mdata->s_metadata_fe = NULL; | ||
1901 | |||
1902 | iput(mdata->s_mirror_fe); | ||
1903 | mdata->s_mirror_fe = NULL; | ||
1904 | |||
1905 | iput(mdata->s_bitmap_fe); | ||
1906 | mdata->s_bitmap_fe = NULL; | ||
1907 | } | ||
1908 | } | ||
1909 | |||
1910 | static int udf_fill_super(struct super_block *sb, void *options, int silent) | 1928 | static int udf_fill_super(struct super_block *sb, void *options, int silent) |
1911 | { | 1929 | { |
1912 | int i; | ||
1913 | int ret; | 1930 | int ret; |
1914 | struct inode *inode = NULL; | 1931 | struct inode *inode = NULL; |
1915 | struct udf_options uopt; | 1932 | struct udf_options uopt; |
@@ -1974,7 +1991,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1974 | sb->s_op = &udf_sb_ops; | 1991 | sb->s_op = &udf_sb_ops; |
1975 | sb->s_export_op = &udf_export_ops; | 1992 | sb->s_export_op = &udf_export_ops; |
1976 | 1993 | ||
1977 | sb->s_dirt = 0; | ||
1978 | sb->s_magic = UDF_SUPER_MAGIC; | 1994 | sb->s_magic = UDF_SUPER_MAGIC; |
1979 | sb->s_time_gran = 1000; | 1995 | sb->s_time_gran = 1000; |
1980 | 1996 | ||
@@ -1987,6 +2003,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1987 | if (!silent) | 2003 | if (!silent) |
1988 | pr_notice("Rescanning with blocksize %d\n", | 2004 | pr_notice("Rescanning with blocksize %d\n", |
1989 | UDF_DEFAULT_BLOCKSIZE); | 2005 | UDF_DEFAULT_BLOCKSIZE); |
2006 | brelse(sbi->s_lvid_bh); | ||
2007 | sbi->s_lvid_bh = NULL; | ||
1990 | uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; | 2008 | uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; |
1991 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | 2009 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); |
1992 | } | 2010 | } |
@@ -2072,9 +2090,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2072 | error_out: | 2090 | error_out: |
2073 | if (sbi->s_vat_inode) | 2091 | if (sbi->s_vat_inode) |
2074 | iput(sbi->s_vat_inode); | 2092 | iput(sbi->s_vat_inode); |
2075 | if (sbi->s_partitions) | ||
2076 | for (i = 0; i < sbi->s_partitions; i++) | ||
2077 | udf_free_partition(&sbi->s_partmaps[i]); | ||
2078 | #ifdef CONFIG_UDF_NLS | 2093 | #ifdef CONFIG_UDF_NLS |
2079 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) | 2094 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) |
2080 | unload_nls(sbi->s_nls_map); | 2095 | unload_nls(sbi->s_nls_map); |
@@ -2082,8 +2097,7 @@ error_out: | |||
2082 | if (!(sb->s_flags & MS_RDONLY)) | 2097 | if (!(sb->s_flags & MS_RDONLY)) |
2083 | udf_close_lvid(sb); | 2098 | udf_close_lvid(sb); |
2084 | brelse(sbi->s_lvid_bh); | 2099 | brelse(sbi->s_lvid_bh); |
2085 | 2100 | udf_sb_free_partitions(sb); | |
2086 | kfree(sbi->s_partmaps); | ||
2087 | kfree(sbi); | 2101 | kfree(sbi); |
2088 | sb->s_fs_info = NULL; | 2102 | sb->s_fs_info = NULL; |
2089 | 2103 | ||
@@ -2096,10 +2110,6 @@ void _udf_err(struct super_block *sb, const char *function, | |||
2096 | struct va_format vaf; | 2110 | struct va_format vaf; |
2097 | va_list args; | 2111 | va_list args; |
2098 | 2112 | ||
2099 | /* mark sb error */ | ||
2100 | if (!(sb->s_flags & MS_RDONLY)) | ||
2101 | sb->s_dirt = 1; | ||
2102 | |||
2103 | va_start(args, fmt); | 2113 | va_start(args, fmt); |
2104 | 2114 | ||
2105 | vaf.fmt = fmt; | 2115 | vaf.fmt = fmt; |
@@ -2128,16 +2138,12 @@ void _udf_warn(struct super_block *sb, const char *function, | |||
2128 | 2138 | ||
2129 | static void udf_put_super(struct super_block *sb) | 2139 | static void udf_put_super(struct super_block *sb) |
2130 | { | 2140 | { |
2131 | int i; | ||
2132 | struct udf_sb_info *sbi; | 2141 | struct udf_sb_info *sbi; |
2133 | 2142 | ||
2134 | sbi = UDF_SB(sb); | 2143 | sbi = UDF_SB(sb); |
2135 | 2144 | ||
2136 | if (sbi->s_vat_inode) | 2145 | if (sbi->s_vat_inode) |
2137 | iput(sbi->s_vat_inode); | 2146 | iput(sbi->s_vat_inode); |
2138 | if (sbi->s_partitions) | ||
2139 | for (i = 0; i < sbi->s_partitions; i++) | ||
2140 | udf_free_partition(&sbi->s_partmaps[i]); | ||
2141 | #ifdef CONFIG_UDF_NLS | 2147 | #ifdef CONFIG_UDF_NLS |
2142 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) | 2148 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) |
2143 | unload_nls(sbi->s_nls_map); | 2149 | unload_nls(sbi->s_nls_map); |
@@ -2145,7 +2151,7 @@ static void udf_put_super(struct super_block *sb) | |||
2145 | if (!(sb->s_flags & MS_RDONLY)) | 2151 | if (!(sb->s_flags & MS_RDONLY)) |
2146 | udf_close_lvid(sb); | 2152 | udf_close_lvid(sb); |
2147 | brelse(sbi->s_lvid_bh); | 2153 | brelse(sbi->s_lvid_bh); |
2148 | kfree(sbi->s_partmaps); | 2154 | udf_sb_free_partitions(sb); |
2149 | kfree(sb->s_fs_info); | 2155 | kfree(sb->s_fs_info); |
2150 | sb->s_fs_info = NULL; | 2156 | sb->s_fs_info = NULL; |
2151 | } | 2157 | } |
@@ -2161,7 +2167,6 @@ static int udf_sync_fs(struct super_block *sb, int wait) | |||
2161 | * the buffer for IO | 2167 | * the buffer for IO |
2162 | */ | 2168 | */ |
2163 | mark_buffer_dirty(sbi->s_lvid_bh); | 2169 | mark_buffer_dirty(sbi->s_lvid_bh); |
2164 | sb->s_dirt = 0; | ||
2165 | sbi->s_lvid_dirty = 0; | 2170 | sbi->s_lvid_dirty = 0; |
2166 | } | 2171 | } |
2167 | mutex_unlock(&sbi->s_alloc_mutex); | 2172 | mutex_unlock(&sbi->s_alloc_mutex); |
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 4b98fee8e16..8a9657d7f7c 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c | |||
@@ -248,7 +248,7 @@ void udf_truncate_extents(struct inode *inode) | |||
248 | /* We managed to free all extents in the | 248 | /* We managed to free all extents in the |
249 | * indirect extent - free it too */ | 249 | * indirect extent - free it too */ |
250 | BUG_ON(!epos.bh); | 250 | BUG_ON(!epos.bh); |
251 | udf_free_blocks(sb, inode, &epos.block, | 251 | udf_free_blocks(sb, NULL, &epos.block, |
252 | 0, indirect_ext_len); | 252 | 0, indirect_ext_len); |
253 | } else if (!epos.bh) { | 253 | } else if (!epos.bh) { |
254 | iinfo->i_lenAlloc = lenalloc; | 254 | iinfo->i_lenAlloc = lenalloc; |
@@ -275,7 +275,7 @@ void udf_truncate_extents(struct inode *inode) | |||
275 | 275 | ||
276 | if (indirect_ext_len) { | 276 | if (indirect_ext_len) { |
277 | BUG_ON(!epos.bh); | 277 | BUG_ON(!epos.bh); |
278 | udf_free_blocks(sb, inode, &epos.block, 0, indirect_ext_len); | 278 | udf_free_blocks(sb, NULL, &epos.block, 0, indirect_ext_len); |
279 | } else if (!epos.bh) { | 279 | } else if (!epos.bh) { |
280 | iinfo->i_lenAlloc = lenalloc; | 280 | iinfo->i_lenAlloc = lenalloc; |
281 | mark_inode_dirty(inode); | 281 | mark_inode_dirty(inode); |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index ebe10314e51..de038da6f6b 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
@@ -129,7 +129,6 @@ static inline void udf_updated_lvid(struct super_block *sb) | |||
129 | WARN_ON_ONCE(((struct logicalVolIntegrityDesc *) | 129 | WARN_ON_ONCE(((struct logicalVolIntegrityDesc *) |
130 | bh->b_data)->integrityType != | 130 | bh->b_data)->integrityType != |
131 | cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN)); | 131 | cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN)); |
132 | sb->s_dirt = 1; | ||
133 | UDF_SB(sb)->s_lvid_dirty = 1; | 132 | UDF_SB(sb)->s_lvid_dirty = 1; |
134 | } | 133 | } |
135 | extern u64 lvid_get_unique_id(struct super_block *sb); | 134 | extern u64 lvid_get_unique_id(struct super_block *sb); |