/* * Truncate the last extent to match i_size. This function assumes * that preallocation extent is already truncated.
*/ void udf_truncate_tail_extent(struct inode *inode)
{ struct extent_position epos = {}; struct kernel_lb_addr eloc;
uint32_t elen, nelen;
uint64_t lbcount = 0;
int8_t etype = -1, netype; int adsize; struct udf_inode_info *iinfo = UDF_I(inode); int ret;
if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB ||
inode->i_size == iinfo->i_lenExtents) return; /* Are we going to delete the file anyway? */ if (inode->i_nlink == 0) return;
/* Find the last extent in the file */ while (1) {
ret = udf_next_aext(inode, &epos, &eloc, &elen, &tmpetype, 0); if (ret < 0) goto out; if (ret == 0) break;
brelse(prev_epos.bh);
prev_epos = epos; if (prev_epos.bh)
get_bh(prev_epos.bh);
ret = udf_next_aext(inode, &epos, &eloc, &elen, &etype, 1); if (ret < 0) goto out;
lbcount += elen;
}
if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) {
lbcount -= elen;
udf_delete_aext(inode, prev_epos);
udf_free_blocks(inode->i_sb, inode, &eloc, 0,
DIV_ROUND_UP(elen, bsize));
} /* This inode entry is in-memory only and thus we don't have to mark
* the inode dirty */
iinfo->i_lenExtents = lbcount;
out:
brelse(epos.bh);
brelse(prev_epos.bh);
}
/* * Truncate extents of inode to inode->i_size. This function can be used only * for making file shorter. For making file longer, udf_extend_file() has to * be used.
*/ int udf_truncate_extents(struct inode *inode)
{ struct extent_position epos; struct kernel_lb_addr eloc, neloc = {};
uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc;
int8_t etype; struct super_block *sb = inode->i_sb;
sector_t first_block = inode->i_size >> sb->s_blocksize_bits, offset;
loff_t byte_offset; int adsize; struct udf_inode_info *iinfo = UDF_I(inode); int ret = 0;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.