diff options
Diffstat (limited to 'fs/udf/inode.c')
-rw-r--r-- | fs/udf/inode.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 1d1358ed80c1..4fd1d809738c 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/writeback.h> | 37 | #include <linux/writeback.h> |
38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
39 | #include <linux/crc-itu-t.h> | 39 | #include <linux/crc-itu-t.h> |
40 | #include <linux/mpage.h> | ||
40 | 41 | ||
41 | #include "udf_i.h" | 42 | #include "udf_i.h" |
42 | #include "udf_sb.h" | 43 | #include "udf_sb.h" |
@@ -83,12 +84,10 @@ void udf_evict_inode(struct inode *inode) | |||
83 | end_writeback(inode); | 84 | end_writeback(inode); |
84 | if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && | 85 | if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && |
85 | inode->i_size != iinfo->i_lenExtents) { | 86 | inode->i_size != iinfo->i_lenExtents) { |
86 | printk(KERN_WARNING "UDF-fs (%s): Inode %lu (mode %o) has " | 87 | udf_warn(inode->i_sb, "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n", |
87 | "inode size %llu different from extent length %llu. " | 88 | inode->i_ino, inode->i_mode, |
88 | "Filesystem need not be standards compliant.\n", | 89 | (unsigned long long)inode->i_size, |
89 | inode->i_sb->s_id, inode->i_ino, inode->i_mode, | 90 | (unsigned long long)iinfo->i_lenExtents); |
90 | (unsigned long long)inode->i_size, | ||
91 | (unsigned long long)iinfo->i_lenExtents); | ||
92 | } | 91 | } |
93 | kfree(iinfo->i_ext.i_data); | 92 | kfree(iinfo->i_ext.i_data); |
94 | iinfo->i_ext.i_data = NULL; | 93 | iinfo->i_ext.i_data = NULL; |
@@ -104,7 +103,13 @@ static int udf_writepage(struct page *page, struct writeback_control *wbc) | |||
104 | 103 | ||
105 | static int udf_readpage(struct file *file, struct page *page) | 104 | static int udf_readpage(struct file *file, struct page *page) |
106 | { | 105 | { |
107 | return block_read_full_page(page, udf_get_block); | 106 | return mpage_readpage(page, udf_get_block); |
107 | } | ||
108 | |||
109 | static int udf_readpages(struct file *file, struct address_space *mapping, | ||
110 | struct list_head *pages, unsigned nr_pages) | ||
111 | { | ||
112 | return mpage_readpages(mapping, pages, nr_pages, udf_get_block); | ||
108 | } | 113 | } |
109 | 114 | ||
110 | static int udf_write_begin(struct file *file, struct address_space *mapping, | 115 | static int udf_write_begin(struct file *file, struct address_space *mapping, |
@@ -139,6 +144,7 @@ static sector_t udf_bmap(struct address_space *mapping, sector_t block) | |||
139 | 144 | ||
140 | const struct address_space_operations udf_aops = { | 145 | const struct address_space_operations udf_aops = { |
141 | .readpage = udf_readpage, | 146 | .readpage = udf_readpage, |
147 | .readpages = udf_readpages, | ||
142 | .writepage = udf_writepage, | 148 | .writepage = udf_writepage, |
143 | .write_begin = udf_write_begin, | 149 | .write_begin = udf_write_begin, |
144 | .write_end = generic_write_end, | 150 | .write_end = generic_write_end, |
@@ -1169,16 +1175,15 @@ static void __udf_read_inode(struct inode *inode) | |||
1169 | */ | 1175 | */ |
1170 | bh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 0, &ident); | 1176 | bh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 0, &ident); |
1171 | if (!bh) { | 1177 | if (!bh) { |
1172 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n", | 1178 | udf_err(inode->i_sb, "(ino %ld) failed !bh\n", inode->i_ino); |
1173 | inode->i_ino); | ||
1174 | make_bad_inode(inode); | 1179 | make_bad_inode(inode); |
1175 | return; | 1180 | return; |
1176 | } | 1181 | } |
1177 | 1182 | ||
1178 | if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && | 1183 | if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE && |
1179 | ident != TAG_IDENT_USE) { | 1184 | ident != TAG_IDENT_USE) { |
1180 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) " | 1185 | udf_err(inode->i_sb, "(ino %ld) failed ident=%d\n", |
1181 | "failed ident=%d\n", inode->i_ino, ident); | 1186 | inode->i_ino, ident); |
1182 | brelse(bh); | 1187 | brelse(bh); |
1183 | make_bad_inode(inode); | 1188 | make_bad_inode(inode); |
1184 | return; | 1189 | return; |
@@ -1218,8 +1223,8 @@ static void __udf_read_inode(struct inode *inode) | |||
1218 | } | 1223 | } |
1219 | brelse(ibh); | 1224 | brelse(ibh); |
1220 | } else if (fe->icbTag.strategyType != cpu_to_le16(4)) { | 1225 | } else if (fe->icbTag.strategyType != cpu_to_le16(4)) { |
1221 | printk(KERN_ERR "udf: unsupported strategy type: %d\n", | 1226 | udf_err(inode->i_sb, "unsupported strategy type: %d\n", |
1222 | le16_to_cpu(fe->icbTag.strategyType)); | 1227 | le16_to_cpu(fe->icbTag.strategyType)); |
1223 | brelse(bh); | 1228 | brelse(bh); |
1224 | make_bad_inode(inode); | 1229 | make_bad_inode(inode); |
1225 | return; | 1230 | return; |
@@ -1236,6 +1241,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1236 | int offset; | 1241 | int offset; |
1237 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | 1242 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); |
1238 | struct udf_inode_info *iinfo = UDF_I(inode); | 1243 | struct udf_inode_info *iinfo = UDF_I(inode); |
1244 | unsigned int link_count; | ||
1239 | 1245 | ||
1240 | fe = (struct fileEntry *)bh->b_data; | 1246 | fe = (struct fileEntry *)bh->b_data; |
1241 | efe = (struct extendedFileEntry *)bh->b_data; | 1247 | efe = (struct extendedFileEntry *)bh->b_data; |
@@ -1318,9 +1324,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1318 | inode->i_mode &= ~sbi->s_umask; | 1324 | inode->i_mode &= ~sbi->s_umask; |
1319 | read_unlock(&sbi->s_cred_lock); | 1325 | read_unlock(&sbi->s_cred_lock); |
1320 | 1326 | ||
1321 | inode->i_nlink = le16_to_cpu(fe->fileLinkCount); | 1327 | link_count = le16_to_cpu(fe->fileLinkCount); |
1322 | if (!inode->i_nlink) | 1328 | if (!link_count) |
1323 | inode->i_nlink = 1; | 1329 | link_count = 1; |
1330 | set_nlink(inode, link_count); | ||
1324 | 1331 | ||
1325 | inode->i_size = le64_to_cpu(fe->informationLength); | 1332 | inode->i_size = le64_to_cpu(fe->informationLength); |
1326 | iinfo->i_lenExtents = inode->i_size; | 1333 | iinfo->i_lenExtents = inode->i_size; |
@@ -1413,9 +1420,8 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1413 | udf_debug("METADATA BITMAP FILE-----\n"); | 1420 | udf_debug("METADATA BITMAP FILE-----\n"); |
1414 | break; | 1421 | break; |
1415 | default: | 1422 | default: |
1416 | printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown " | 1423 | udf_err(inode->i_sb, "(ino %ld) failed unknown file type=%d\n", |
1417 | "file type=%d\n", inode->i_ino, | 1424 | inode->i_ino, fe->icbTag.fileType); |
1418 | fe->icbTag.fileType); | ||
1419 | make_bad_inode(inode); | 1425 | make_bad_inode(inode); |
1420 | return; | 1426 | return; |
1421 | } | 1427 | } |
@@ -1438,8 +1444,8 @@ static int udf_alloc_i_data(struct inode *inode, size_t size) | |||
1438 | iinfo->i_ext.i_data = kmalloc(size, GFP_KERNEL); | 1444 | iinfo->i_ext.i_data = kmalloc(size, GFP_KERNEL); |
1439 | 1445 | ||
1440 | if (!iinfo->i_ext.i_data) { | 1446 | if (!iinfo->i_ext.i_data) { |
1441 | printk(KERN_ERR "udf:udf_alloc_i_data (ino %ld) " | 1447 | udf_err(inode->i_sb, "(ino %ld) no free memory\n", |
1442 | "no free memory\n", inode->i_ino); | 1448 | inode->i_ino); |
1443 | return -ENOMEM; | 1449 | return -ENOMEM; |
1444 | } | 1450 | } |
1445 | 1451 | ||
@@ -1689,9 +1695,8 @@ out: | |||
1689 | if (do_sync) { | 1695 | if (do_sync) { |
1690 | sync_dirty_buffer(bh); | 1696 | sync_dirty_buffer(bh); |
1691 | if (buffer_write_io_error(bh)) { | 1697 | if (buffer_write_io_error(bh)) { |
1692 | printk(KERN_WARNING "IO error syncing udf inode " | 1698 | udf_warn(inode->i_sb, "IO error syncing udf inode [%08lx]\n", |
1693 | "[%s:%08lx]\n", inode->i_sb->s_id, | 1699 | inode->i_ino); |
1694 | inode->i_ino); | ||
1695 | err = -EIO; | 1700 | err = -EIO; |
1696 | } | 1701 | } |
1697 | } | 1702 | } |
@@ -1982,8 +1987,7 @@ int8_t udf_current_aext(struct inode *inode, struct extent_position *epos, | |||
1982 | *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK; | 1987 | *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK; |
1983 | break; | 1988 | break; |
1984 | default: | 1989 | default: |
1985 | udf_debug("alloc_type = %d unsupported\n", | 1990 | udf_debug("alloc_type = %d unsupported\n", iinfo->i_alloc_type); |
1986 | iinfo->i_alloc_type); | ||
1987 | return -1; | 1991 | return -1; |
1988 | } | 1992 | } |
1989 | 1993 | ||