aboutsummaryrefslogtreecommitdiffstats
path: root/fs/squashfs/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/squashfs/dir.c')
-rw-r--r--fs/squashfs/dir.c40
1 files changed, 12 insertions, 28 deletions
diff --git a/fs/squashfs/dir.c b/fs/squashfs/dir.c
index 57dc70ebbb19..f7f527bf8c10 100644
--- a/fs/squashfs/dir.c
+++ b/fs/squashfs/dir.c
@@ -100,7 +100,7 @@ static int get_dir_index_using_offset(struct super_block *sb,
100} 100}
101 101
102 102
103static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir) 103static int squashfs_readdir(struct file *file, struct dir_context *ctx)
104{ 104{
105 struct inode *inode = file_inode(file); 105 struct inode *inode = file_inode(file);
106 struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; 106 struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
@@ -127,11 +127,11 @@ static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
127 * It also means that the external f_pos is offset by 3 from the 127 * It also means that the external f_pos is offset by 3 from the
128 * on-disk directory f_pos. 128 * on-disk directory f_pos.
129 */ 129 */
130 while (file->f_pos < 3) { 130 while (ctx->pos < 3) {
131 char *name; 131 char *name;
132 int i_ino; 132 int i_ino;
133 133
134 if (file->f_pos == 0) { 134 if (ctx->pos == 0) {
135 name = "."; 135 name = ".";
136 size = 1; 136 size = 1;
137 i_ino = inode->i_ino; 137 i_ino = inode->i_ino;
@@ -141,24 +141,18 @@ static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
141 i_ino = squashfs_i(inode)->parent; 141 i_ino = squashfs_i(inode)->parent;
142 } 142 }
143 143
144 TRACE("Calling filldir(%p, %s, %d, %lld, %d, %d)\n", 144 if (!dir_emit(ctx, name, size, i_ino,
145 dirent, name, size, file->f_pos, i_ino, 145 squashfs_filetype_table[1]))
146 squashfs_filetype_table[1]);
147
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");
151 goto finish; 146 goto finish;
152 }
153 147
154 file->f_pos += size; 148 ctx->pos += size;
155 } 149 }
156 150
157 length = get_dir_index_using_offset(inode->i_sb, &block, &offset, 151 length = get_dir_index_using_offset(inode->i_sb, &block, &offset,
158 squashfs_i(inode)->dir_idx_start, 152 squashfs_i(inode)->dir_idx_start,
159 squashfs_i(inode)->dir_idx_offset, 153 squashfs_i(inode)->dir_idx_offset,
160 squashfs_i(inode)->dir_idx_cnt, 154 squashfs_i(inode)->dir_idx_cnt,
161 file->f_pos); 155 ctx->pos);
162 156
163 while (length < i_size_read(inode)) { 157 while (length < i_size_read(inode)) {
164 /* 158 /*
@@ -198,7 +192,7 @@ static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
198 192
199 length += sizeof(*dire) + size; 193 length += sizeof(*dire) + size;
200 194
201 if (file->f_pos >= length) 195 if (ctx->pos >= length)
202 continue; 196 continue;
203 197
204 dire->name[size] = '\0'; 198 dire->name[size] = '\0';
@@ -206,22 +200,12 @@ static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
206 ((short) le16_to_cpu(dire->inode_number)); 200 ((short) le16_to_cpu(dire->inode_number));
207 type = le16_to_cpu(dire->type); 201 type = le16_to_cpu(dire->type);
208 202
209 TRACE("Calling filldir(%p, %s, %d, %lld, %x:%x, %d, %d)" 203 if (!dir_emit(ctx, dire->name, size,
210 "\n", dirent, dire->name, size,
211 file->f_pos,
212 le32_to_cpu(dirh.start_block),
213 le16_to_cpu(dire->offset),
214 inode_number,
215 squashfs_filetype_table[type]);
216
217 if (filldir(dirent, dire->name, size, file->f_pos,
218 inode_number, 204 inode_number,
219 squashfs_filetype_table[type]) < 0) { 205 squashfs_filetype_table[type]))
220 TRACE("Filldir returned less than 0\n");
221 goto finish; 206 goto finish;
222 }
223 207
224 file->f_pos = length; 208 ctx->pos = length;
225 } 209 }
226 } 210 }
227 211
@@ -238,6 +222,6 @@ failed_read:
238 222
239const struct file_operations squashfs_dir_ops = { 223const struct file_operations squashfs_dir_ops = {
240 .read = generic_read_dir, 224 .read = generic_read_dir,
241 .readdir = squashfs_readdir, 225 .iterate = squashfs_readdir,
242 .llseek = default_llseek, 226 .llseek = default_llseek,
243}; 227};