diff options
Diffstat (limited to 'fs/udf/truncate.c')
-rw-r--r-- | fs/udf/truncate.c | 76 |
1 files changed, 34 insertions, 42 deletions
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 6111d97902d7..cde328f16775 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c | |||
@@ -223,34 +223,29 @@ void udf_truncate_extents(struct inode *inode) | |||
223 | if (indirect_ext_len) { | 223 | if (indirect_ext_len) { |
224 | /* We managed to free all extents in the | 224 | /* We managed to free all extents in the |
225 | * indirect extent - free it too */ | 225 | * indirect extent - free it too */ |
226 | if (!epos.bh) | 226 | BUG_ON(!epos.bh); |
227 | BUG(); | ||
228 | udf_free_blocks(sb, inode, epos.block, | 227 | udf_free_blocks(sb, inode, epos.block, |
229 | 0, indirect_ext_len); | 228 | 0, indirect_ext_len); |
229 | } else if (!epos.bh) { | ||
230 | iinfo->i_lenAlloc = lenalloc; | ||
231 | mark_inode_dirty(inode); | ||
230 | } else { | 232 | } else { |
231 | if (!epos.bh) { | 233 | struct allocExtDesc *aed = |
232 | iinfo->i_lenAlloc = | 234 | (struct allocExtDesc *) |
233 | lenalloc; | 235 | (epos.bh->b_data); |
234 | mark_inode_dirty(inode); | 236 | int len = sizeof(struct allocExtDesc); |
235 | } else { | ||
236 | struct allocExtDesc *aed = | ||
237 | (struct allocExtDesc *) | ||
238 | (epos.bh->b_data); | ||
239 | int len = | ||
240 | sizeof(struct allocExtDesc); | ||
241 | 237 | ||
242 | aed->lengthAllocDescs = | 238 | aed->lengthAllocDescs = |
243 | cpu_to_le32(lenalloc); | 239 | cpu_to_le32(lenalloc); |
244 | if (!UDF_QUERY_FLAG(sb, | 240 | if (!UDF_QUERY_FLAG(sb, |
245 | UDF_FLAG_STRICT) || | 241 | UDF_FLAG_STRICT) || |
246 | sbi->s_udfrev >= 0x0201) | 242 | sbi->s_udfrev >= 0x0201) |
247 | len += lenalloc; | 243 | len += lenalloc; |
248 | 244 | ||
249 | udf_update_tag(epos.bh->b_data, | 245 | udf_update_tag(epos.bh->b_data, |
250 | len); | 246 | len); |
251 | mark_buffer_dirty_inode( | 247 | mark_buffer_dirty_inode( |
252 | epos.bh, inode); | 248 | epos.bh, inode); |
253 | } | ||
254 | } | 249 | } |
255 | brelse(epos.bh); | 250 | brelse(epos.bh); |
256 | epos.offset = sizeof(struct allocExtDesc); | 251 | epos.offset = sizeof(struct allocExtDesc); |
@@ -271,28 +266,25 @@ void udf_truncate_extents(struct inode *inode) | |||
271 | } | 266 | } |
272 | 267 | ||
273 | if (indirect_ext_len) { | 268 | if (indirect_ext_len) { |
274 | if (!epos.bh) | 269 | BUG_ON(!epos.bh); |
275 | BUG(); | ||
276 | udf_free_blocks(sb, inode, epos.block, 0, | 270 | udf_free_blocks(sb, inode, epos.block, 0, |
277 | indirect_ext_len); | 271 | indirect_ext_len); |
272 | } else if (!epos.bh) { | ||
273 | iinfo->i_lenAlloc = lenalloc; | ||
274 | mark_inode_dirty(inode); | ||
278 | } else { | 275 | } else { |
279 | if (!epos.bh) { | 276 | struct allocExtDesc *aed = |
280 | iinfo->i_lenAlloc = lenalloc; | 277 | (struct allocExtDesc *)(epos.bh->b_data); |
281 | mark_inode_dirty(inode); | 278 | aed->lengthAllocDescs = cpu_to_le32(lenalloc); |
282 | } else { | 279 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || |
283 | struct allocExtDesc *aed = | 280 | sbi->s_udfrev >= 0x0201) |
284 | (struct allocExtDesc *)(epos.bh->b_data); | 281 | udf_update_tag(epos.bh->b_data, |
285 | aed->lengthAllocDescs = cpu_to_le32(lenalloc); | 282 | lenalloc + |
286 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || | 283 | sizeof(struct allocExtDesc)); |
287 | sbi->s_udfrev >= 0x0201) | 284 | else |
288 | udf_update_tag(epos.bh->b_data, | 285 | udf_update_tag(epos.bh->b_data, |
289 | lenalloc + | 286 | sizeof(struct allocExtDesc)); |
290 | sizeof(struct allocExtDesc)); | 287 | mark_buffer_dirty_inode(epos.bh, inode); |
291 | else | ||
292 | udf_update_tag(epos.bh->b_data, | ||
293 | sizeof(struct allocExtDesc)); | ||
294 | mark_buffer_dirty_inode(epos.bh, inode); | ||
295 | } | ||
296 | } | 288 | } |
297 | } else if (inode->i_size) { | 289 | } else if (inode->i_size) { |
298 | if (byte_offset) { | 290 | if (byte_offset) { |