diff options
Diffstat (limited to 'fs/cramfs/inode.c')
-rw-r--r-- | fs/cramfs/inode.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 35b1c7bd18b7..e501ac3a49ff 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -349,18 +349,17 @@ static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
349 | /* | 349 | /* |
350 | * Read a cramfs directory entry. | 350 | * Read a cramfs directory entry. |
351 | */ | 351 | */ |
352 | static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | 352 | static int cramfs_readdir(struct file *file, struct dir_context *ctx) |
353 | { | 353 | { |
354 | struct inode *inode = file_inode(filp); | 354 | struct inode *inode = file_inode(file); |
355 | struct super_block *sb = inode->i_sb; | 355 | struct super_block *sb = inode->i_sb; |
356 | char *buf; | 356 | char *buf; |
357 | unsigned int offset; | 357 | unsigned int offset; |
358 | int copied; | ||
359 | 358 | ||
360 | /* Offset within the thing. */ | 359 | /* Offset within the thing. */ |
361 | offset = filp->f_pos; | 360 | if (ctx->pos >= inode->i_size) |
362 | if (offset >= inode->i_size) | ||
363 | return 0; | 361 | return 0; |
362 | offset = ctx->pos; | ||
364 | /* Directory entries are always 4-byte aligned */ | 363 | /* Directory entries are always 4-byte aligned */ |
365 | if (offset & 3) | 364 | if (offset & 3) |
366 | return -EINVAL; | 365 | return -EINVAL; |
@@ -369,14 +368,13 @@ static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
369 | if (!buf) | 368 | if (!buf) |
370 | return -ENOMEM; | 369 | return -ENOMEM; |
371 | 370 | ||
372 | copied = 0; | ||
373 | while (offset < inode->i_size) { | 371 | while (offset < inode->i_size) { |
374 | struct cramfs_inode *de; | 372 | struct cramfs_inode *de; |
375 | unsigned long nextoffset; | 373 | unsigned long nextoffset; |
376 | char *name; | 374 | char *name; |
377 | ino_t ino; | 375 | ino_t ino; |
378 | umode_t mode; | 376 | umode_t mode; |
379 | int namelen, error; | 377 | int namelen; |
380 | 378 | ||
381 | mutex_lock(&read_mutex); | 379 | mutex_lock(&read_mutex); |
382 | de = cramfs_read(sb, OFFSET(inode) + offset, sizeof(*de)+CRAMFS_MAXPATHLEN); | 380 | de = cramfs_read(sb, OFFSET(inode) + offset, sizeof(*de)+CRAMFS_MAXPATHLEN); |
@@ -402,13 +400,10 @@ static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
402 | break; | 400 | break; |
403 | namelen--; | 401 | namelen--; |
404 | } | 402 | } |
405 | error = filldir(dirent, buf, namelen, offset, ino, mode >> 12); | 403 | if (!dir_emit(ctx, buf, namelen, ino, mode >> 12)) |
406 | if (error) | ||
407 | break; | 404 | break; |
408 | 405 | ||
409 | offset = nextoffset; | 406 | ctx->pos = offset = nextoffset; |
410 | filp->f_pos = offset; | ||
411 | copied++; | ||
412 | } | 407 | } |
413 | kfree(buf); | 408 | kfree(buf); |
414 | return 0; | 409 | return 0; |
@@ -547,7 +542,7 @@ static const struct address_space_operations cramfs_aops = { | |||
547 | static const struct file_operations cramfs_directory_operations = { | 542 | static const struct file_operations cramfs_directory_operations = { |
548 | .llseek = generic_file_llseek, | 543 | .llseek = generic_file_llseek, |
549 | .read = generic_read_dir, | 544 | .read = generic_read_dir, |
550 | .readdir = cramfs_readdir, | 545 | .iterate = cramfs_readdir, |
551 | }; | 546 | }; |
552 | 547 | ||
553 | static const struct inode_operations cramfs_dir_inode_operations = { | 548 | static const struct inode_operations cramfs_dir_inode_operations = { |