32 #include <linux/slab.h>
39 static const unsigned char squashfs_filetype_table[] = {
52 u64 *next_block,
int *next_offset,
u64 index_start,
int index_offset,
53 int i_count,
u64 f_pos)
59 TRACE(
"Entered get_dir_index_using_offset, i_count %d, f_pos %lld\n",
71 for (i = 0; i < i_count; i++) {
73 &index_offset,
sizeof(dir_index));
105 struct inode *
inode = file->f_dentry->d_inode;
110 unsigned int inode_number;
114 TRACE(
"Entered squashfs_readdir [%llx:%x]\n", block, offset);
118 ERROR(
"Failed to allocate squashfs_dir_entry\n");
130 while (file->
f_pos < 3) {
134 if (file->
f_pos == 0) {
137 i_ino = inode->
i_ino;
141 i_ino = squashfs_i(inode)->parent;
144 TRACE(
"Calling filldir(%p, %s, %d, %lld, %d, %d)\n",
145 dirent, name, size, file->
f_pos, i_ino,
146 squashfs_filetype_table[1]);
148 if (filldir(dirent, name, size, file->
f_pos, i_ino,
149 squashfs_filetype_table[1]) < 0) {
150 TRACE(
"Filldir returned less than 0\n");
157 length = get_dir_index_using_offset(inode->
i_sb, &block, &offset,
158 squashfs_i(inode)->dir_idx_start,
159 squashfs_i(inode)->dir_idx_offset,
160 squashfs_i(inode)->dir_idx_cnt,
163 while (length < i_size_read(inode)) {
168 &offset,
sizeof(dirh));
172 length +=
sizeof(dirh);
179 while (dir_count--) {
184 &offset,
sizeof(*dire));
195 &block, &offset, size);
199 length +=
sizeof(*dire) +
size;
201 if (file->
f_pos >= length)
209 TRACE(
"Calling filldir(%p, %s, %d, %lld, %x:%x, %d, %d)"
210 "\n", dirent, dire->
name, size,
215 squashfs_filetype_table[type]);
217 if (filldir(dirent, dire->
name, size, file->
f_pos,
219 squashfs_filetype_table[type]) < 0) {
220 TRACE(
"Filldir returned less than 0\n");
233 ERROR(
"Unable to read directory block [%llx:%x]\n", block, offset);
241 .readdir = squashfs_readdir,