Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

udf: Propagate errors from udf_truncate_extents()

Make udf_truncate_extents() properly propagate errors to its callers and
let udf_setsize() handle the error properly as well. This lets userspace
know in case there's some error when truncating blocks.

Signed-off-by: Jan Kara <jack@suse.cz>

Jan Kara 2b42be5e d3ca4651

+8 -5
+3 -1
fs/udf/inode.c
··· 1242 1242 truncate_setsize(inode, newsize); 1243 1243 down_write(&iinfo->i_data_sem); 1244 1244 udf_clear_extent_cache(inode); 1245 - udf_truncate_extents(inode); 1245 + err = udf_truncate_extents(inode); 1246 1246 up_write(&iinfo->i_data_sem); 1247 + if (err) 1248 + return err; 1247 1249 } 1248 1250 update_time: 1249 1251 inode->i_mtime = inode->i_ctime = current_time(inode);
+4 -3
fs/udf/truncate.c
··· 199 199 * for making file shorter. For making file longer, udf_extend_file() has to 200 200 * be used. 201 201 */ 202 - void udf_truncate_extents(struct inode *inode) 202 + int udf_truncate_extents(struct inode *inode) 203 203 { 204 204 struct extent_position epos; 205 205 struct kernel_lb_addr eloc, neloc = {}; ··· 224 224 if (etype == -1) { 225 225 /* We should extend the file? */ 226 226 WARN_ON(byte_offset); 227 - return; 227 + return 0; 228 228 } 229 229 epos.offset -= adsize; 230 230 extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset); ··· 262 262 udf_get_lb_pblock(sb, &eloc, 0)); 263 263 /* Error reading indirect block? */ 264 264 if (!epos.bh) 265 - return; 265 + return -EIO; 266 266 if (elen) 267 267 indirect_ext_len = 268 268 (elen + sb->s_blocksize - 1) >> ··· 286 286 iinfo->i_lenExtents = inode->i_size; 287 287 288 288 brelse(epos.bh); 289 + return 0; 289 290 }
+1 -1
fs/udf/udfdecl.h
··· 235 235 /* truncate.c */ 236 236 extern void udf_truncate_tail_extent(struct inode *); 237 237 extern void udf_discard_prealloc(struct inode *); 238 - extern void udf_truncate_extents(struct inode *); 238 + extern int udf_truncate_extents(struct inode *); 239 239 240 240 /* balloc.c */ 241 241 extern void udf_free_blocks(struct super_block *, struct inode *,