diff options
author | Jan Kara <jack@suse.cz> | 2019-03-11 10:27:02 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2019-03-18 11:30:02 -0400 |
commit | 2b42be5eb24564227b15e66f54f088e5a26549c7 (patch) | |
tree | eeb32b8731b61f2ce1fb54ed52cc2a3801d2d1b7 | |
parent | d3ca4651d05c0ff7259d087d8c949bcf3e14fb46 (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.c | 4 | ||||
-rw-r--r-- | fs/udf/truncate.c | 7 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 2 |
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 | } |
1248 | update_time: | 1250 | update_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 | */ |
202 | void udf_truncate_extents(struct inode *inode) | 202 | int 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 */ |
236 | extern void udf_truncate_tail_extent(struct inode *); | 236 | extern void udf_truncate_tail_extent(struct inode *); |
237 | extern void udf_discard_prealloc(struct inode *); | 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 | /* balloc.c */ | 240 | /* balloc.c */ |
241 | extern void udf_free_blocks(struct super_block *, struct inode *, | 241 | extern void udf_free_blocks(struct super_block *, struct inode *, |