Skip to content

Commit c7bfaff

Browse files
committed
Merge tag 'fs_for_v6.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull udf and ext2 updates from Jan Kara: "A few udf and ext2 fixes and cleanups" * tag 'fs_for_v6.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: udf: Verify partition map count udf: stop using write_cache_pages ext2: Handle fiemap on empty files to prevent EINVAL
2 parents 1edaac3 + 1a11201 commit c7bfaff

File tree

3 files changed

+38
-15
lines changed

3 files changed

+38
-15
lines changed

fs/ext2/inode.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,19 @@ int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
895895
u64 start, u64 len)
896896
{
897897
int ret;
898+
loff_t i_size;
898899

899900
inode_lock(inode);
900-
len = min_t(u64, len, i_size_read(inode));
901+
i_size = i_size_read(inode);
902+
/*
903+
* iomap_fiemap() returns EINVAL for 0 length. Make sure we don't trim
904+
* length to 0 but still trim the range as much as possible since
905+
* ext2_get_blocks() iterates unmapped space block by block which is
906+
* slow.
907+
*/
908+
if (i_size == 0)
909+
i_size = 1;
910+
len = min_t(u64, len, i_size);
901911
ret = iomap_fiemap(inode, fieinfo, start, len, &ext2_iomap_ops);
902912
inode_unlock(inode);
903913

fs/udf/inode.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,19 +181,23 @@ static void udf_write_failed(struct address_space *mapping, loff_t to)
181181
}
182182
}
183183

184-
static int udf_adinicb_writepage(struct folio *folio,
185-
struct writeback_control *wbc, void *data)
184+
static int udf_adinicb_writepages(struct address_space *mapping,
185+
struct writeback_control *wbc)
186186
{
187-
struct inode *inode = folio->mapping->host;
187+
struct inode *inode = mapping->host;
188188
struct udf_inode_info *iinfo = UDF_I(inode);
189+
struct folio *folio = NULL;
190+
int error = 0;
191+
192+
while ((folio = writeback_iter(mapping, wbc, folio, &error))) {
193+
BUG_ON(!folio_test_locked(folio));
194+
BUG_ON(folio->index != 0);
195+
memcpy_from_file_folio(iinfo->i_data + iinfo->i_lenEAttr, folio,
196+
0, i_size_read(inode));
197+
folio_unlock(folio);
198+
}
189199

190-
BUG_ON(!folio_test_locked(folio));
191-
BUG_ON(folio->index != 0);
192-
memcpy_from_file_folio(iinfo->i_data + iinfo->i_lenEAttr, folio, 0,
193-
i_size_read(inode));
194-
folio_unlock(folio);
195200
mark_inode_dirty(inode);
196-
197201
return 0;
198202
}
199203

@@ -203,9 +207,9 @@ static int udf_writepages(struct address_space *mapping,
203207
struct inode *inode = mapping->host;
204208
struct udf_inode_info *iinfo = UDF_I(inode);
205209

206-
if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB)
207-
return mpage_writepages(mapping, wbc, udf_get_block_wb);
208-
return write_cache_pages(mapping, wbc, udf_adinicb_writepage, NULL);
210+
if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
211+
return udf_adinicb_writepages(mapping, wbc);
212+
return mpage_writepages(mapping, wbc, udf_get_block_wb);
209213
}
210214

211215
static void udf_adinicb_read_folio(struct folio *folio)

fs/udf/super.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block,
14401440
struct genericPartitionMap *gpm;
14411441
uint16_t ident;
14421442
struct buffer_head *bh;
1443-
unsigned int table_len;
1443+
unsigned int table_len, part_map_count;
14441444
int ret;
14451445

14461446
bh = udf_read_tagged(sb, block, block, &ident);
@@ -1461,7 +1461,16 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block,
14611461
"logical volume");
14621462
if (ret)
14631463
goto out_bh;
1464-
ret = udf_sb_alloc_partition_maps(sb, le32_to_cpu(lvd->numPartitionMaps));
1464+
1465+
part_map_count = le32_to_cpu(lvd->numPartitionMaps);
1466+
if (part_map_count > table_len / sizeof(struct genericPartitionMap1)) {
1467+
udf_err(sb, "error loading logical volume descriptor: "
1468+
"Too many partition maps (%u > %u)\n", part_map_count,
1469+
table_len / (unsigned)sizeof(struct genericPartitionMap1));
1470+
ret = -EIO;
1471+
goto out_bh;
1472+
}
1473+
ret = udf_sb_alloc_partition_maps(sb, part_map_count);
14651474
if (ret)
14661475
goto out_bh;
14671476

0 commit comments

Comments
 (0)