struct fileIdentDesc * udf_fileident_read(struct inode *dir, loff_t *nf_pos, struct udf_fileident_bh *fibh, struct fileIdentDesc *cfi, struct extent_position *epos, kernel_lb_addr *eloc, uint32_t *elen, sector_t *offset) { struct fileIdentDesc *fi; int i, num, block; struct buffer_head * tmp, * bha[16]; fibh->soffset = fibh->eoffset; if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { fi = udf_get_fileident(UDF_I_DATA(dir) - (UDF_I_EFE(dir) ? sizeof(struct extendedFileEntry) : sizeof(struct fileEntry)), dir->i_sb->s_blocksize, &(fibh->eoffset)); if (!fi) return NULL; *nf_pos += ((fibh->eoffset - fibh->soffset) >> 2); memcpy((uint8_t *)cfi, (uint8_t *)fi, sizeof(struct fileIdentDesc)); return fi; }
struct FileIdentDesc * udf_fileident_read(struct inode *dir, loff_t *nf_pos, struct udf_fileident_bh *fibh, struct FileIdentDesc *cfi, lb_addr *bloc, Uint32 *extoffset, lb_addr *eloc, Uint32 *elen, Uint32 *offset, struct buffer_head **bh) { struct FileIdentDesc *fi; int block; fibh->soffset = fibh->eoffset; if (fibh->eoffset == dir->i_sb->s_blocksize) { int lextoffset = *extoffset; if (udf_next_aext(dir, bloc, extoffset, eloc, elen, bh, 1) != EXTENT_RECORDED_ALLOCATED) { return NULL; } block = udf_get_lb_pblock(dir->i_sb, *eloc, *offset); (*offset) ++; if ((*offset << dir->i_sb->s_blocksize_bits) >= *elen) *offset = 0; else *extoffset = lextoffset; udf_release_data(fibh->sbh); if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block, dir->i_sb->s_blocksize))) return NULL; fibh->soffset = fibh->eoffset = 0; } else if (fibh->sbh != fibh->ebh) { udf_release_data(fibh->sbh); fibh->sbh = fibh->ebh; } fi = udf_get_fileident(fibh->sbh->b_data, dir->i_sb->s_blocksize, &(fibh->eoffset)); if (!fi) return NULL; *nf_pos += ((fibh->eoffset - fibh->soffset) >> 2); if (fibh->eoffset <= dir->i_sb->s_blocksize) { memcpy((Uint8 *)cfi, (Uint8 *)fi, sizeof(struct FileIdentDesc)); } else if (fibh->eoffset > dir->i_sb->s_blocksize) { int lextoffset = *extoffset; if (udf_next_aext(dir, bloc, extoffset, eloc, elen, bh, 1) != EXTENT_RECORDED_ALLOCATED) { return NULL; } block = udf_get_lb_pblock(dir->i_sb, *eloc, *offset); (*offset) ++; if ((*offset << dir->i_sb->s_blocksize_bits) >= *elen) *offset = 0; else *extoffset = lextoffset; fibh->soffset -= dir->i_sb->s_blocksize; fibh->eoffset -= dir->i_sb->s_blocksize; if (!(fibh->ebh = udf_tread(dir->i_sb, block, dir->i_sb->s_blocksize))) return NULL; if (sizeof(struct FileIdentDesc) > - fibh->soffset) { int fi_len; memcpy((Uint8 *)cfi, (Uint8 *)fi, - fibh->soffset); memcpy((Uint8 *)cfi - fibh->soffset, fibh->ebh->b_data, sizeof(struct FileIdentDesc) + fibh->soffset); fi_len = (sizeof(struct FileIdentDesc) + cfi->lengthFileIdent + le16_to_cpu(cfi->lengthOfImpUse) + 3) & ~3; *nf_pos += ((fi_len - (fibh->eoffset - fibh->soffset)) >> 2); fibh->eoffset = fibh->soffset + fi_len; }