summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2019-03-11 10:27:02 -0400
committerJan Kara <jack@suse.cz>2019-03-18 11:30:02 -0400
commit2b42be5eb24564227b15e66f54f088e5a26549c7 (patch)
treeeeb32b8731b61f2ce1fb54ed52cc2a3801d2d1b7
parentd3ca4651d05c0ff7259d087d8c949bcf3e14fb46 (diff)
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>
-rw-r--r--fs/udf/inode.c4
-rw-r--r--fs/udf/truncate.c7
-rw-r--r--fs/udf/udfdecl.h2
3 files changed, 8 insertions, 5 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index ae796e10f68b..e7276932e433 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -1242,8 +1242,10 @@ set_size:
1242 truncate_setsize(inode, newsize); 1242 truncate_setsize(inode, newsize);
1243 down_write(&iinfo->i_data_sem); 1243 down_write(&iinfo->i_data_sem);
1244 udf_clear_extent_cache(inode); 1244 udf_clear_extent_cache(inode);
1245 udf_truncate_extents(inode); 1245 err = udf_truncate_extents(inode);
1246 up_write(&iinfo->i_data_sem); 1246 up_write(&iinfo->i_data_sem);
1247 if (err)
1248 return err;
1247 } 1249 }
1248update_time: 1250update_time:
1249 inode->i_mtime = inode->i_ctime = current_time(inode); 1251 inode->i_mtime = inode->i_ctime = current_time(inode);
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c
index 94220ba85628..63a47f1e1d52 100644
--- a/fs/udf/truncate.c
+++ b/fs/udf/truncate.c
@@ -199,7 +199,7 @@ static void udf_update_alloc_ext_desc(struct inode *inode,
199 * for making file shorter. For making file longer, udf_extend_file() has to 199 * for making file shorter. For making file longer, udf_extend_file() has to
200 * be used. 200 * be used.
201 */ 201 */
202void udf_truncate_extents(struct inode *inode) 202int udf_truncate_extents(struct inode *inode)
203{ 203{
204 struct extent_position epos; 204 struct extent_position epos;
205 struct kernel_lb_addr eloc, neloc = {}; 205 struct kernel_lb_addr eloc, neloc = {};
@@ -224,7 +224,7 @@ void udf_truncate_extents(struct inode *inode)
224 if (etype == -1) { 224 if (etype == -1) {
225 /* We should extend the file? */ 225 /* We should extend the file? */
226 WARN_ON(byte_offset); 226 WARN_ON(byte_offset);
227 return; 227 return 0;
228 } 228 }
229 epos.offset -= adsize; 229 epos.offset -= adsize;
230 extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset); 230 extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset);
@@ -262,7 +262,7 @@ void udf_truncate_extents(struct inode *inode)
262 udf_get_lb_pblock(sb, &eloc, 0)); 262 udf_get_lb_pblock(sb, &eloc, 0));
263 /* Error reading indirect block? */ 263 /* Error reading indirect block? */
264 if (!epos.bh) 264 if (!epos.bh)
265 return; 265 return -EIO;
266 if (elen) 266 if (elen)
267 indirect_ext_len = 267 indirect_ext_len =
268 (elen + sb->s_blocksize - 1) >> 268 (elen + sb->s_blocksize - 1) >>
@@ -286,4 +286,5 @@ void udf_truncate_extents(struct inode *inode)
286 iinfo->i_lenExtents = inode->i_size; 286 iinfo->i_lenExtents = inode->i_size;
287 287
288 brelse(epos.bh); 288 brelse(epos.bh);
289 return 0;
289} 290}
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h
index ee246769dee4..d89ef71887fc 100644
--- a/fs/udf/udfdecl.h
+++ b/fs/udf/udfdecl.h
@@ -235,7 +235,7 @@ extern struct inode *udf_new_inode(struct inode *, umode_t);
235/* truncate.c */ 235/* truncate.c */
236extern void udf_truncate_tail_extent(struct inode *); 236extern void udf_truncate_tail_extent(struct inode *);
237extern void udf_discard_prealloc(struct inode *); 237extern void udf_discard_prealloc(struct inode *);
238extern void udf_truncate_extents(struct inode *); 238extern int udf_truncate_extents(struct inode *);
239 239
240/* balloc.c */ 240/* balloc.c */
241extern void udf_free_blocks(struct super_block *, struct inode *, 241extern void udf_free_blocks(struct super_block *, struct inode *,