diff options
Diffstat (limited to 'fs/squashfs/dir.c')
-rw-r--r-- | fs/squashfs/dir.c | 40 |
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 | ||
103 | static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir) | 103 | static 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 | ||
239 | const struct file_operations squashfs_dir_ops = { | 223 | const 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 | }; |