Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 456390de authored by marcin.slusarz@gmail.com's avatar marcin.slusarz@gmail.com Committed by Jan Kara
Browse files

udf: truncate: create function for updating of Allocation Ext Descriptor



Signed-off-by: default avatarMarcin Slusarz <marcin.slusarz@gmail.com>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 9de90b76
Loading
Loading
Loading
Loading
+23 −33
Original line number Diff line number Diff line
@@ -179,6 +179,24 @@ void udf_discard_prealloc(struct inode *inode)
	brelse(epos.bh);
}

static void udf_update_alloc_ext_desc(struct inode *inode,
				      struct extent_position *epos,
				      u32 lenalloc)
{
	struct super_block *sb = inode->i_sb;
	struct udf_sb_info *sbi = UDF_SB(sb);

	struct allocExtDesc *aed = (struct allocExtDesc *) (epos->bh->b_data);
	int len = sizeof(struct allocExtDesc);

	aed->lengthAllocDescs =	cpu_to_le32(lenalloc);
	if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || sbi->s_udfrev >= 0x0201)
		len += lenalloc;

	udf_update_tag(epos->bh->b_data, len);
	mark_buffer_dirty_inode(epos->bh, inode);
}

void udf_truncate_extents(struct inode *inode)
{
	struct extent_position epos;
@@ -186,7 +204,6 @@ void udf_truncate_extents(struct inode *inode)
	uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc;
	int8_t etype;
	struct super_block *sb = inode->i_sb;
	struct udf_sb_info *sbi = UDF_SB(sb);
	sector_t first_block = inode->i_size >> sb->s_blocksize_bits, offset;
	loff_t byte_offset;
	int adsize;
@@ -229,24 +246,9 @@ void udf_truncate_extents(struct inode *inode)
				} else if (!epos.bh) {
					iinfo->i_lenAlloc = lenalloc;
					mark_inode_dirty(inode);
				} else {
					struct allocExtDesc *aed =
						(struct allocExtDesc *)
						(epos.bh->b_data);
					int len = sizeof(struct allocExtDesc);

					aed->lengthAllocDescs =
						cpu_to_le32(lenalloc);
					if (!UDF_QUERY_FLAG(sb,
						UDF_FLAG_STRICT) ||
						sbi->s_udfrev >= 0x0201)
						len += lenalloc;

					udf_update_tag(epos.bh->b_data,
							len);
					mark_buffer_dirty_inode(
							epos.bh, inode);
				}
				} else
					udf_update_alloc_ext_desc(inode,
							&epos, lenalloc);
				brelse(epos.bh);
				epos.offset = sizeof(struct allocExtDesc);
				epos.block = eloc;
@@ -272,20 +274,8 @@ void udf_truncate_extents(struct inode *inode)
		} else if (!epos.bh) {
			iinfo->i_lenAlloc = lenalloc;
			mark_inode_dirty(inode);
		} else {
			struct allocExtDesc *aed =
				(struct allocExtDesc *)(epos.bh->b_data);
			aed->lengthAllocDescs = cpu_to_le32(lenalloc);
			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) ||
				sbi->s_udfrev >= 0x0201)
				udf_update_tag(epos.bh->b_data,
					lenalloc +
					sizeof(struct allocExtDesc));
			else
				udf_update_tag(epos.bh->b_data,
					sizeof(struct allocExtDesc));
			mark_buffer_dirty_inode(epos.bh, inode);
		}
		} else
			udf_update_alloc_ext_desc(inode, &epos, lenalloc);
	} else if (inode->i_size) {
		if (byte_offset) {
			kernel_long_ad extent;