diff options
Diffstat (limited to 'fs/udf/truncate.c')
-rw-r--r-- | fs/udf/truncate.c | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 6931f6bfa1ae..5c1bf921f400 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c | |||
@@ -154,7 +154,8 @@ void udf_discard_prealloc(struct inode *inode) | |||
154 | extent_trunc(inode, &epos, eloc, etype, elen, 0); | 154 | extent_trunc(inode, &epos, eloc, etype, elen, 0); |
155 | if (!epos.bh) { | 155 | if (!epos.bh) { |
156 | UDF_I_LENALLOC(inode) = | 156 | UDF_I_LENALLOC(inode) = |
157 | epos.offset - udf_file_entry_alloc_offset(inode); | 157 | epos.offset - |
158 | udf_file_entry_alloc_offset(inode); | ||
158 | mark_inode_dirty(inode); | 159 | mark_inode_dirty(inode); |
159 | } else { | 160 | } else { |
160 | struct allocExtDesc *aed = | 161 | struct allocExtDesc *aed = |
@@ -213,7 +214,8 @@ void udf_truncate_extents(struct inode *inode) | |||
213 | else | 214 | else |
214 | lenalloc -= sizeof(struct allocExtDesc); | 215 | lenalloc -= sizeof(struct allocExtDesc); |
215 | 216 | ||
216 | while ((etype = udf_current_aext(inode, &epos, &eloc, &elen, 0)) != -1) { | 217 | while ((etype = udf_current_aext(inode, &epos, &eloc, |
218 | &elen, 0)) != -1) { | ||
217 | if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { | 219 | if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { |
218 | udf_write_aext(inode, &epos, neloc, nelen, 0); | 220 | udf_write_aext(inode, &epos, neloc, nelen, 0); |
219 | if (indirect_ext_len) { | 221 | if (indirect_ext_len) { |
@@ -225,35 +227,43 @@ void udf_truncate_extents(struct inode *inode) | |||
225 | 0, indirect_ext_len); | 227 | 0, indirect_ext_len); |
226 | } else { | 228 | } else { |
227 | if (!epos.bh) { | 229 | if (!epos.bh) { |
228 | UDF_I_LENALLOC(inode) = lenalloc; | 230 | UDF_I_LENALLOC(inode) = |
231 | lenalloc; | ||
229 | mark_inode_dirty(inode); | 232 | mark_inode_dirty(inode); |
230 | } else { | 233 | } else { |
231 | struct allocExtDesc *aed = | 234 | struct allocExtDesc *aed = |
232 | (struct allocExtDesc *)(epos.bh->b_data); | 235 | (struct allocExtDesc *) |
236 | (epos.bh->b_data); | ||
237 | int len = | ||
238 | sizeof(struct allocExtDesc); | ||
239 | |||
233 | aed->lengthAllocDescs = | 240 | aed->lengthAllocDescs = |
234 | cpu_to_le32(lenalloc); | 241 | cpu_to_le32(lenalloc); |
235 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || | 242 | if (!UDF_QUERY_FLAG(sb, |
243 | UDF_FLAG_STRICT) || | ||
236 | sbi->s_udfrev >= 0x0201) | 244 | sbi->s_udfrev >= 0x0201) |
237 | udf_update_tag(epos.bh->b_data, | 245 | len += lenalloc; |
238 | lenalloc + | 246 | |
239 | sizeof(struct allocExtDesc)); | 247 | udf_update_tag(epos.bh->b_data, |
240 | else | 248 | len); |
241 | udf_update_tag(epos.bh->b_data, | 249 | mark_buffer_dirty_inode( |
242 | sizeof(struct allocExtDesc)); | 250 | epos.bh, inode); |
243 | mark_buffer_dirty_inode(epos.bh, inode); | ||
244 | } | 251 | } |
245 | } | 252 | } |
246 | brelse(epos.bh); | 253 | brelse(epos.bh); |
247 | epos.offset = sizeof(struct allocExtDesc); | 254 | epos.offset = sizeof(struct allocExtDesc); |
248 | epos.block = eloc; | 255 | epos.block = eloc; |
249 | epos.bh = udf_tread(sb, udf_get_lb_pblock(sb, eloc, 0)); | 256 | epos.bh = udf_tread(sb, |
257 | udf_get_lb_pblock(sb, eloc, 0)); | ||
250 | if (elen) | 258 | if (elen) |
251 | indirect_ext_len = (elen + sb->s_blocksize -1) >> | 259 | indirect_ext_len = |
260 | (elen + sb->s_blocksize - 1) >> | ||
252 | sb->s_blocksize_bits; | 261 | sb->s_blocksize_bits; |
253 | else | 262 | else |
254 | indirect_ext_len = 1; | 263 | indirect_ext_len = 1; |
255 | } else { | 264 | } else { |
256 | extent_trunc(inode, &epos, eloc, etype, elen, 0); | 265 | extent_trunc(inode, &epos, eloc, etype, |
266 | elen, 0); | ||
257 | epos.offset += adsize; | 267 | epos.offset += adsize; |
258 | } | 268 | } |
259 | } | 269 | } |
@@ -274,10 +284,11 @@ void udf_truncate_extents(struct inode *inode) | |||
274 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || | 284 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || |
275 | sbi->s_udfrev >= 0x0201) | 285 | sbi->s_udfrev >= 0x0201) |
276 | udf_update_tag(epos.bh->b_data, | 286 | udf_update_tag(epos.bh->b_data, |
277 | lenalloc + sizeof(struct allocExtDesc)); | 287 | lenalloc + |
288 | sizeof(struct allocExtDesc)); | ||
278 | else | 289 | else |
279 | udf_update_tag(epos.bh->b_data, | 290 | udf_update_tag(epos.bh->b_data, |
280 | sizeof(struct allocExtDesc)); | 291 | sizeof(struct allocExtDesc)); |
281 | mark_buffer_dirty_inode(epos.bh, inode); | 292 | mark_buffer_dirty_inode(epos.bh, inode); |
282 | } | 293 | } |
283 | } | 294 | } |
@@ -291,13 +302,16 @@ void udf_truncate_extents(struct inode *inode) | |||
291 | * extending the file by 'offset' blocks. | 302 | * extending the file by 'offset' blocks. |
292 | */ | 303 | */ |
293 | if ((!epos.bh && | 304 | if ((!epos.bh && |
294 | epos.offset == udf_file_entry_alloc_offset(inode)) || | 305 | epos.offset == |
295 | (epos.bh && epos.offset == sizeof(struct allocExtDesc))) { | 306 | udf_file_entry_alloc_offset(inode)) || |
307 | (epos.bh && epos.offset == | ||
308 | sizeof(struct allocExtDesc))) { | ||
296 | /* File has no extents at all or has empty last | 309 | /* File has no extents at all or has empty last |
297 | * indirect extent! Create a fake extent... */ | 310 | * indirect extent! Create a fake extent... */ |
298 | extent.extLocation.logicalBlockNum = 0; | 311 | extent.extLocation.logicalBlockNum = 0; |
299 | extent.extLocation.partitionReferenceNum = 0; | 312 | extent.extLocation.partitionReferenceNum = 0; |
300 | extent.extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; | 313 | extent.extLength = |
314 | EXT_NOT_RECORDED_NOT_ALLOCATED; | ||
301 | } else { | 315 | } else { |
302 | epos.offset -= adsize; | 316 | epos.offset -= adsize; |
303 | etype = udf_next_aext(inode, &epos, | 317 | etype = udf_next_aext(inode, &epos, |
@@ -306,7 +320,9 @@ void udf_truncate_extents(struct inode *inode) | |||
306 | extent.extLength |= etype << 30; | 320 | extent.extLength |= etype << 30; |
307 | } | 321 | } |
308 | udf_extend_file(inode, &epos, &extent, | 322 | udf_extend_file(inode, &epos, &extent, |
309 | offset + ((inode->i_size & (sb->s_blocksize - 1)) != 0)); | 323 | offset + |
324 | ((inode->i_size & | ||
325 | (sb->s_blocksize - 1)) != 0)); | ||
310 | } | 326 | } |
311 | } | 327 | } |
312 | UDF_I_LENEXTENTS(inode) = inode->i_size; | 328 | UDF_I_LENEXTENTS(inode) = inode->i_size; |