219
224
etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset);
220
225
byte_offset = (offset << sb->s_blocksize_bits) +
221
226
(inode->i_size & (sb->s_blocksize - 1));
223
epos.offset -= adsize;
224
extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset);
225
epos.offset += adsize;
227
lenalloc = epos.offset;
229
lenalloc = epos.offset - adsize;
232
lenalloc -= udf_file_entry_alloc_offset(inode);
234
lenalloc -= sizeof(struct allocExtDesc);
236
while ((etype = udf_current_aext(inode, &epos, &eloc,
238
if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) {
239
udf_write_aext(inode, &epos, &neloc, nelen, 0);
240
if (indirect_ext_len) {
241
/* We managed to free all extents in the
242
* indirect extent - free it too */
244
udf_free_blocks(sb, inode, &epos.block,
245
0, indirect_ext_len);
246
} else if (!epos.bh) {
247
iinfo->i_lenAlloc = lenalloc;
248
mark_inode_dirty(inode);
250
udf_update_alloc_ext_desc(inode,
253
epos.offset = sizeof(struct allocExtDesc);
255
epos.bh = udf_tread(sb,
256
udf_get_lb_pblock(sb, &eloc, 0));
259
(elen + sb->s_blocksize - 1) >>
260
sb->s_blocksize_bits;
262
indirect_ext_len = 1;
264
extent_trunc(inode, &epos, &eloc, etype,
266
epos.offset += adsize;
270
if (indirect_ext_len) {
272
udf_free_blocks(sb, inode, &epos.block, 0,
274
} else if (!epos.bh) {
275
iinfo->i_lenAlloc = lenalloc;
276
mark_inode_dirty(inode);
278
udf_update_alloc_ext_desc(inode, &epos, lenalloc);
279
} else if (inode->i_size) {
281
struct kernel_long_ad extent;
284
* OK, there is not extent covering inode->i_size and
285
* no extent above inode->i_size => truncate is
286
* extending the file by 'offset' blocks.
290
udf_file_entry_alloc_offset(inode)) ||
291
(epos.bh && epos.offset ==
292
sizeof(struct allocExtDesc))) {
293
/* File has no extents at all or has empty last
294
* indirect extent! Create a fake extent... */
295
extent.extLocation.logicalBlockNum = 0;
296
extent.extLocation.partitionReferenceNum = 0;
298
EXT_NOT_RECORDED_NOT_ALLOCATED;
300
epos.offset -= adsize;
301
etype = udf_next_aext(inode, &epos,
303
&extent.extLength, 0);
304
extent.extLength |= etype << 30;
306
udf_extend_file(inode, &epos, &extent,
309
(sb->s_blocksize - 1)) != 0));
228
/* We should extend the file? */
229
WARN_ON(byte_offset);
232
epos.offset -= adsize;
233
extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset);
234
epos.offset += adsize;
236
lenalloc = epos.offset;
238
lenalloc = epos.offset - adsize;
241
lenalloc -= udf_file_entry_alloc_offset(inode);
243
lenalloc -= sizeof(struct allocExtDesc);
245
while ((etype = udf_current_aext(inode, &epos, &eloc,
247
if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) {
248
udf_write_aext(inode, &epos, &neloc, nelen, 0);
249
if (indirect_ext_len) {
250
/* We managed to free all extents in the
251
* indirect extent - free it too */
253
udf_free_blocks(sb, inode, &epos.block,
254
0, indirect_ext_len);
255
} else if (!epos.bh) {
256
iinfo->i_lenAlloc = lenalloc;
257
mark_inode_dirty(inode);
259
udf_update_alloc_ext_desc(inode,
262
epos.offset = sizeof(struct allocExtDesc);
264
epos.bh = udf_tread(sb,
265
udf_get_lb_pblock(sb, &eloc, 0));
268
(elen + sb->s_blocksize - 1) >>
269
sb->s_blocksize_bits;
271
indirect_ext_len = 1;
273
extent_trunc(inode, &epos, &eloc, etype, elen, 0);
274
epos.offset += adsize;
278
if (indirect_ext_len) {
280
udf_free_blocks(sb, inode, &epos.block, 0, indirect_ext_len);
281
} else if (!epos.bh) {
282
iinfo->i_lenAlloc = lenalloc;
283
mark_inode_dirty(inode);
285
udf_update_alloc_ext_desc(inode, &epos, lenalloc);
312
286
iinfo->i_lenExtents = inode->i_size;