Lines Matching +full:block +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0-only
6 * Miscellaneous routines for the OSTA-UDF(tm) filesystem.
10 * (C) 1998-2004 Ben Fennema
11 * (C) 1999-2000 Stelias Computing Inc
22 #include <linux/crc-itu-t.h>
31 int offset; in udf_add_extendedattr() local
35 ea = iinfo->i_data; in udf_add_extendedattr()
36 if (iinfo->i_lenEAttr) { in udf_add_extendedattr()
37 ad = iinfo->i_data + iinfo->i_lenEAttr; in udf_add_extendedattr()
43 offset = inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode) - in udf_add_extendedattr()
44 iinfo->i_lenAlloc; in udf_add_extendedattr()
46 /* TODO - Check for FreeEASpace */ in udf_add_extendedattr()
48 if (loc & 0x01 && offset >= size) { in udf_add_extendedattr()
52 if (iinfo->i_lenAlloc) in udf_add_extendedattr()
53 memmove(&ad[size], ad, iinfo->i_lenAlloc); in udf_add_extendedattr()
55 if (iinfo->i_lenEAttr) { in udf_add_extendedattr()
57 if (eahd->descTag.tagIdent != in udf_add_extendedattr()
59 le32_to_cpu(eahd->descTag.tagLocation) != in udf_add_extendedattr()
60 iinfo->i_location.logicalBlockNum) in udf_add_extendedattr()
63 struct udf_sb_info *sbi = UDF_SB(inode->i_sb); in udf_add_extendedattr()
65 size -= sizeof(struct extendedAttrHeaderDesc); in udf_add_extendedattr()
66 iinfo->i_lenEAttr += in udf_add_extendedattr()
68 eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD); in udf_add_extendedattr()
69 if (sbi->s_udfrev >= 0x0200) in udf_add_extendedattr()
70 eahd->descTag.descVersion = cpu_to_le16(3); in udf_add_extendedattr()
72 eahd->descTag.descVersion = cpu_to_le16(2); in udf_add_extendedattr()
73 eahd->descTag.tagSerialNum = in udf_add_extendedattr()
74 cpu_to_le16(sbi->s_serial_number); in udf_add_extendedattr()
75 eahd->descTag.tagLocation = cpu_to_le32( in udf_add_extendedattr()
76 iinfo->i_location.logicalBlockNum); in udf_add_extendedattr()
77 eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF); in udf_add_extendedattr()
78 eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF); in udf_add_extendedattr()
81 offset = iinfo->i_lenEAttr; in udf_add_extendedattr()
83 if (le32_to_cpu(eahd->appAttrLocation) < in udf_add_extendedattr()
84 iinfo->i_lenEAttr) { in udf_add_extendedattr()
86 le32_to_cpu(eahd->appAttrLocation); in udf_add_extendedattr()
87 memmove(&ea[offset - aal + size], in udf_add_extendedattr()
88 &ea[aal], offset - aal); in udf_add_extendedattr()
89 offset -= aal; in udf_add_extendedattr()
90 eahd->appAttrLocation = in udf_add_extendedattr()
93 if (le32_to_cpu(eahd->impAttrLocation) < in udf_add_extendedattr()
94 iinfo->i_lenEAttr) { in udf_add_extendedattr()
96 le32_to_cpu(eahd->impAttrLocation); in udf_add_extendedattr()
97 memmove(&ea[offset - ial + size], in udf_add_extendedattr()
98 &ea[ial], offset - ial); in udf_add_extendedattr()
99 offset -= ial; in udf_add_extendedattr()
100 eahd->impAttrLocation = in udf_add_extendedattr()
104 if (le32_to_cpu(eahd->appAttrLocation) < in udf_add_extendedattr()
105 iinfo->i_lenEAttr) { in udf_add_extendedattr()
107 le32_to_cpu(eahd->appAttrLocation); in udf_add_extendedattr()
108 memmove(&ea[offset - aal + size], in udf_add_extendedattr()
109 &ea[aal], offset - aal); in udf_add_extendedattr()
110 offset -= aal; in udf_add_extendedattr()
111 eahd->appAttrLocation = in udf_add_extendedattr()
116 crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(struct tag); in udf_add_extendedattr()
117 eahd->descTag.descCRCLength = cpu_to_le16(crclen); in udf_add_extendedattr()
118 eahd->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)eahd + in udf_add_extendedattr()
120 eahd->descTag.tagChecksum = udf_tag_checksum(&eahd->descTag); in udf_add_extendedattr()
121 iinfo->i_lenEAttr += size; in udf_add_extendedattr()
122 return (struct genericFormat *)&ea[offset]; in udf_add_extendedattr()
133 uint32_t offset; in udf_get_extendedattr() local
136 ea = iinfo->i_data; in udf_get_extendedattr()
138 if (iinfo->i_lenEAttr) { in udf_get_extendedattr()
143 if (eahd->descTag.tagIdent != in udf_get_extendedattr()
145 le32_to_cpu(eahd->descTag.tagLocation) != in udf_get_extendedattr()
146 iinfo->i_location.logicalBlockNum) in udf_get_extendedattr()
150 offset = sizeof(struct extendedAttrHeaderDesc); in udf_get_extendedattr()
152 offset = le32_to_cpu(eahd->impAttrLocation); in udf_get_extendedattr()
154 offset = le32_to_cpu(eahd->appAttrLocation); in udf_get_extendedattr()
156 while (offset + sizeof(*gaf) < iinfo->i_lenEAttr) { in udf_get_extendedattr()
159 gaf = (struct genericFormat *)&ea[offset]; in udf_get_extendedattr()
160 attrLength = le32_to_cpu(gaf->attrLength); in udf_get_extendedattr()
164 (attrLength > (iinfo->i_lenEAttr - offset))) in udf_get_extendedattr()
167 if (le32_to_cpu(gaf->attrType) == type && in udf_get_extendedattr()
168 gaf->attrSubtype == subtype) in udf_get_extendedattr()
171 offset += attrLength; in udf_get_extendedattr()
182 * Read the first block of a tagged descriptor.
185 * July 1, 1997 - Andrew E. Mileski
188 struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, in udf_read_tagged() argument
195 /* Read the block */ in udf_read_tagged()
196 if (block == 0xFFFFFFFF) in udf_read_tagged()
199 bh = sb_bread(sb, block); in udf_read_tagged()
201 udf_err(sb, "read failed, block=%u, location=%u\n", in udf_read_tagged()
202 block, location); in udf_read_tagged()
206 tag_p = (struct tag *)(bh->b_data); in udf_read_tagged()
208 *ident = le16_to_cpu(tag_p->tagIdent); in udf_read_tagged()
210 if (location != le32_to_cpu(tag_p->tagLocation)) { in udf_read_tagged()
211 udf_debug("location mismatch block %u, tag %u != %u\n", in udf_read_tagged()
212 block, le32_to_cpu(tag_p->tagLocation), location); in udf_read_tagged()
218 if (checksum != tag_p->tagChecksum) { in udf_read_tagged()
219 udf_err(sb, "tag checksum failed, block %u: 0x%02x != 0x%02x\n", in udf_read_tagged()
220 block, checksum, tag_p->tagChecksum); in udf_read_tagged()
225 if (tag_p->descVersion != cpu_to_le16(0x0002U) && in udf_read_tagged()
226 tag_p->descVersion != cpu_to_le16(0x0003U)) { in udf_read_tagged()
227 udf_err(sb, "tag version 0x%04x != 0x0002 || 0x0003, block %u\n", in udf_read_tagged()
228 le16_to_cpu(tag_p->descVersion), block); in udf_read_tagged()
233 if (le16_to_cpu(tag_p->descCRCLength) + sizeof(struct tag) > sb->s_blocksize || in udf_read_tagged()
234 le16_to_cpu(tag_p->descCRC) == crc_itu_t(0, in udf_read_tagged()
235 bh->b_data + sizeof(struct tag), in udf_read_tagged()
236 le16_to_cpu(tag_p->descCRCLength))) in udf_read_tagged()
239 udf_debug("Crc failure block %u: crc = %u, crclen = %u\n", block, in udf_read_tagged()
240 le16_to_cpu(tag_p->descCRC), in udf_read_tagged()
241 le16_to_cpu(tag_p->descCRCLength)); in udf_read_tagged()
249 uint32_t offset, uint16_t *ident) in udf_read_ptagged() argument
251 return udf_read_tagged(sb, udf_get_lb_pblock(sb, loc, offset), in udf_read_ptagged()
252 loc->logicalBlockNum + offset, ident); in udf_read_ptagged()
258 length -= sizeof(struct tag); in udf_update_tag()
260 tptr->descCRCLength = cpu_to_le16(length); in udf_update_tag()
261 tptr->descCRC = cpu_to_le16(crc_itu_t(0, data + sizeof(struct tag), length)); in udf_update_tag()
262 tptr->tagChecksum = udf_tag_checksum(tptr); in udf_update_tag()
269 tptr->tagIdent = cpu_to_le16(ident); in udf_new_tag()
270 tptr->descVersion = cpu_to_le16(version); in udf_new_tag()
271 tptr->tagSerialNum = cpu_to_le16(snum); in udf_new_tag()
272 tptr->tagLocation = cpu_to_le32(loc); in udf_new_tag()