Skip to content

Commit 0939221

Browse files
committed
Merge tag 'fixes_for_v5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull udf fixes from Jan Kara: "Two udf error handling fixes" * tag 'fixes_for_v5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: udf: Propagate errors from udf_truncate_extents() udf: Fix crash on IO error during truncate
2 parents 7294fbd + 2b42be5 commit 0939221

File tree

3 files changed

+10
-4
lines changed

3 files changed

+10
-4
lines changed

fs/udf/inode.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,8 +1242,10 @@ int udf_setsize(struct inode *inode, loff_t newsize)
12421242
truncate_setsize(inode, newsize);
12431243
down_write(&iinfo->i_data_sem);
12441244
udf_clear_extent_cache(inode);
1245-
udf_truncate_extents(inode);
1245+
err = udf_truncate_extents(inode);
12461246
up_write(&iinfo->i_data_sem);
1247+
if (err)
1248+
return err;
12471249
}
12481250
update_time:
12491251
inode->i_mtime = inode->i_ctime = current_time(inode);

fs/udf/truncate.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static void udf_update_alloc_ext_desc(struct inode *inode,
199199
* for making file shorter. For making file longer, udf_extend_file() has to
200200
* be used.
201201
*/
202-
void udf_truncate_extents(struct inode *inode)
202+
int udf_truncate_extents(struct inode *inode)
203203
{
204204
struct extent_position epos;
205205
struct kernel_lb_addr eloc, neloc = {};
@@ -224,7 +224,7 @@ void udf_truncate_extents(struct inode *inode)
224224
if (etype == -1) {
225225
/* We should extend the file? */
226226
WARN_ON(byte_offset);
227-
return;
227+
return 0;
228228
}
229229
epos.offset -= adsize;
230230
extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset);
@@ -260,6 +260,9 @@ void udf_truncate_extents(struct inode *inode)
260260
epos.block = eloc;
261261
epos.bh = udf_tread(sb,
262262
udf_get_lb_pblock(sb, &eloc, 0));
263+
/* Error reading indirect block? */
264+
if (!epos.bh)
265+
return -EIO;
263266
if (elen)
264267
indirect_ext_len =
265268
(elen + sb->s_blocksize - 1) >>
@@ -283,4 +286,5 @@ void udf_truncate_extents(struct inode *inode)
283286
iinfo->i_lenExtents = inode->i_size;
284287

285288
brelse(epos.bh);
289+
return 0;
286290
}

fs/udf/udfdecl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ extern struct inode *udf_new_inode(struct inode *, umode_t);
235235
/* truncate.c */
236236
extern void udf_truncate_tail_extent(struct inode *);
237237
extern void udf_discard_prealloc(struct inode *);
238-
extern void udf_truncate_extents(struct inode *);
238+
extern int udf_truncate_extents(struct inode *);
239239

240240
/* balloc.c */
241241
extern void udf_free_blocks(struct super_block *, struct inode *,

0 commit comments

Comments
 (0)