mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 00:51:35 +00:00
udf: cache struct udf_inode_info
cache UDF_I(struct inode *) return values when there are at least 2 uses in one function Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Acked-by: Jan Kara <jack@suse.cz> Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
c0b344385f
commit
48d6d8ff7d
11 changed files with 338 additions and 290 deletions
|
@ -51,17 +51,18 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
|
|||
uint8_t *ea = NULL, *ad = NULL;
|
||||
int offset;
|
||||
uint16_t crclen;
|
||||
struct udf_inode_info *iinfo = UDF_I(inode);
|
||||
|
||||
ea = UDF_I(inode)->i_ext.i_data;
|
||||
if (UDF_I(inode)->i_lenEAttr) {
|
||||
ad = UDF_I(inode)->i_ext.i_data + UDF_I(inode)->i_lenEAttr;
|
||||
ea = iinfo->i_ext.i_data;
|
||||
if (iinfo->i_lenEAttr) {
|
||||
ad = iinfo->i_ext.i_data + iinfo->i_lenEAttr;
|
||||
} else {
|
||||
ad = ea;
|
||||
size += sizeof(struct extendedAttrHeaderDesc);
|
||||
}
|
||||
|
||||
offset = inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode) -
|
||||
UDF_I(inode)->i_lenAlloc;
|
||||
iinfo->i_lenAlloc;
|
||||
|
||||
/* TODO - Check for FreeEASpace */
|
||||
|
||||
|
@ -69,21 +70,21 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
|
|||
struct extendedAttrHeaderDesc *eahd;
|
||||
eahd = (struct extendedAttrHeaderDesc *)ea;
|
||||
|
||||
if (UDF_I(inode)->i_lenAlloc)
|
||||
memmove(&ad[size], ad, UDF_I(inode)->i_lenAlloc);
|
||||
if (iinfo->i_lenAlloc)
|
||||
memmove(&ad[size], ad, iinfo->i_lenAlloc);
|
||||
|
||||
if (UDF_I(inode)->i_lenEAttr) {
|
||||
if (iinfo->i_lenEAttr) {
|
||||
/* check checksum/crc */
|
||||
if (eahd->descTag.tagIdent !=
|
||||
cpu_to_le16(TAG_IDENT_EAHD) ||
|
||||
le32_to_cpu(eahd->descTag.tagLocation) !=
|
||||
UDF_I(inode)->i_location.logicalBlockNum)
|
||||
iinfo->i_location.logicalBlockNum)
|
||||
return NULL;
|
||||
} else {
|
||||
struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
|
||||
|
||||
size -= sizeof(struct extendedAttrHeaderDesc);
|
||||
UDF_I(inode)->i_lenEAttr +=
|
||||
iinfo->i_lenEAttr +=
|
||||
sizeof(struct extendedAttrHeaderDesc);
|
||||
eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD);
|
||||
if (sbi->s_udfrev >= 0x0200)
|
||||
|
@ -93,15 +94,15 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
|
|||
eahd->descTag.tagSerialNum =
|
||||
cpu_to_le16(sbi->s_serial_number);
|
||||
eahd->descTag.tagLocation = cpu_to_le32(
|
||||
UDF_I(inode)->i_location.logicalBlockNum);
|
||||
iinfo->i_location.logicalBlockNum);
|
||||
eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF);
|
||||
eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF);
|
||||
}
|
||||
|
||||
offset = UDF_I(inode)->i_lenEAttr;
|
||||
offset = iinfo->i_lenEAttr;
|
||||
if (type < 2048) {
|
||||
if (le32_to_cpu(eahd->appAttrLocation) <
|
||||
UDF_I(inode)->i_lenEAttr) {
|
||||
iinfo->i_lenEAttr) {
|
||||
uint32_t aal =
|
||||
le32_to_cpu(eahd->appAttrLocation);
|
||||
memmove(&ea[offset - aal + size],
|
||||
|
@ -111,7 +112,7 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
|
|||
cpu_to_le32(aal + size);
|
||||
}
|
||||
if (le32_to_cpu(eahd->impAttrLocation) <
|
||||
UDF_I(inode)->i_lenEAttr) {
|
||||
iinfo->i_lenEAttr) {
|
||||
uint32_t ial =
|
||||
le32_to_cpu(eahd->impAttrLocation);
|
||||
memmove(&ea[offset - ial + size],
|
||||
|
@ -122,7 +123,7 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
|
|||
}
|
||||
} else if (type < 65536) {
|
||||
if (le32_to_cpu(eahd->appAttrLocation) <
|
||||
UDF_I(inode)->i_lenEAttr) {
|
||||
iinfo->i_lenEAttr) {
|
||||
uint32_t aal =
|
||||
le32_to_cpu(eahd->appAttrLocation);
|
||||
memmove(&ea[offset - aal + size],
|
||||
|
@ -138,7 +139,7 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
|
|||
eahd->descTag.descCRC = cpu_to_le16(udf_crc((char *)eahd +
|
||||
sizeof(tag), crclen, 0));
|
||||
eahd->descTag.tagChecksum = udf_tag_checksum(&eahd->descTag);
|
||||
UDF_I(inode)->i_lenEAttr += size;
|
||||
iinfo->i_lenEAttr += size;
|
||||
return (struct genericFormat *)&ea[offset];
|
||||
}
|
||||
if (loc & 0x02)
|
||||
|
@ -153,10 +154,11 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
|
|||
struct genericFormat *gaf;
|
||||
uint8_t *ea = NULL;
|
||||
uint32_t offset;
|
||||
struct udf_inode_info *iinfo = UDF_I(inode);
|
||||
|
||||
ea = UDF_I(inode)->i_ext.i_data;
|
||||
ea = iinfo->i_ext.i_data;
|
||||
|
||||
if (UDF_I(inode)->i_lenEAttr) {
|
||||
if (iinfo->i_lenEAttr) {
|
||||
struct extendedAttrHeaderDesc *eahd;
|
||||
eahd = (struct extendedAttrHeaderDesc *)ea;
|
||||
|
||||
|
@ -164,7 +166,7 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
|
|||
if (eahd->descTag.tagIdent !=
|
||||
cpu_to_le16(TAG_IDENT_EAHD) ||
|
||||
le32_to_cpu(eahd->descTag.tagLocation) !=
|
||||
UDF_I(inode)->i_location.logicalBlockNum)
|
||||
iinfo->i_location.logicalBlockNum)
|
||||
return NULL;
|
||||
|
||||
if (type < 2048)
|
||||
|
@ -174,7 +176,7 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
|
|||
else
|
||||
offset = le32_to_cpu(eahd->appAttrLocation);
|
||||
|
||||
while (offset < UDF_I(inode)->i_lenEAttr) {
|
||||
while (offset < iinfo->i_lenEAttr) {
|
||||
gaf = (struct genericFormat *)&ea[offset];
|
||||
if (le32_to_cpu(gaf->attrType) == type &&
|
||||
gaf->attrSubtype == subtype)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue