diff options
Diffstat (limited to 'fs/ext4/dir.c')
-rw-r--r-- | fs/ext4/dir.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index ef1bed66c14f..0bb3f9ea0832 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
@@ -571,6 +571,31 @@ static int ext4_release_dir(struct inode *inode, struct file *filp) | |||
571 | return 0; | 571 | return 0; |
572 | } | 572 | } |
573 | 573 | ||
574 | int ext4_check_all_de(struct inode *dir, struct buffer_head *bh, void *buf, | ||
575 | int buf_size) | ||
576 | { | ||
577 | struct ext4_dir_entry_2 *de; | ||
578 | int nlen, rlen; | ||
579 | unsigned int offset = 0; | ||
580 | char *top; | ||
581 | |||
582 | de = (struct ext4_dir_entry_2 *)buf; | ||
583 | top = buf + buf_size; | ||
584 | while ((char *) de < top) { | ||
585 | if (ext4_check_dir_entry(dir, NULL, de, bh, | ||
586 | buf, buf_size, offset)) | ||
587 | return -EIO; | ||
588 | nlen = EXT4_DIR_REC_LEN(de->name_len); | ||
589 | rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); | ||
590 | de = (struct ext4_dir_entry_2 *)((char *)de + rlen); | ||
591 | offset += rlen; | ||
592 | } | ||
593 | if ((char *) de > top) | ||
594 | return -EIO; | ||
595 | |||
596 | return 0; | ||
597 | } | ||
598 | |||
574 | const struct file_operations ext4_dir_operations = { | 599 | const struct file_operations ext4_dir_operations = { |
575 | .llseek = ext4_dir_llseek, | 600 | .llseek = ext4_dir_llseek, |
576 | .read = generic_read_dir, | 601 | .read = generic_read_dir, |