Loading fs/exofs/dir.c +16 −22 Original line number Diff line number Diff line Loading @@ -239,22 +239,19 @@ void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode) } static int exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) exofs_readdir(struct file *file, struct dir_context *ctx) { loff_t pos = filp->f_pos; struct inode *inode = file_inode(filp); loff_t pos = ctx->pos; struct inode *inode = file_inode(file); unsigned int offset = pos & ~PAGE_CACHE_MASK; unsigned long n = pos >> PAGE_CACHE_SHIFT; unsigned long npages = dir_pages(inode); unsigned chunk_mask = ~(exofs_chunk_size(inode)-1); unsigned char *types = NULL; int need_revalidate = (filp->f_version != inode->i_version); int need_revalidate = (file->f_version != inode->i_version); if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1)) return 0; types = exofs_filetype_table; for ( ; n < npages; n++, offset = 0) { char *kaddr, *limit; struct exofs_dir_entry *de; Loading @@ -263,7 +260,7 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (IS_ERR(page)) { EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n", inode->i_ino); filp->f_pos += PAGE_CACHE_SIZE - offset; ctx->pos += PAGE_CACHE_SIZE - offset; return PTR_ERR(page); } kaddr = page_address(page); Loading @@ -271,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (offset) { offset = exofs_validate_entry(kaddr, offset, chunk_mask); filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset; ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset; } filp->f_version = inode->i_version; file->f_version = inode->i_version; need_revalidate = 0; } de = (struct exofs_dir_entry *)(kaddr + offset); Loading @@ -288,27 +285,24 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) return -EIO; } if (de->inode_no) { int over; unsigned char d_type = DT_UNKNOWN; unsigned char t; if (types && de->file_type < EXOFS_FT_MAX) d_type = types[de->file_type]; if (de->file_type < EXOFS_FT_MAX) t = exofs_filetype_table[de->file_type]; else t = DT_UNKNOWN; offset = (char *)de - kaddr; over = filldir(dirent, de->name, de->name_len, (n<<PAGE_CACHE_SHIFT) | offset, if (!dir_emit(ctx, de->name, de->name_len, le64_to_cpu(de->inode_no), d_type); if (over) { t)) { exofs_put_page(page); return 0; } } filp->f_pos += le16_to_cpu(de->rec_len); ctx->pos += le16_to_cpu(de->rec_len); } exofs_put_page(page); } return 0; } Loading Loading @@ -669,5 +663,5 @@ int exofs_empty_dir(struct inode *inode) const struct file_operations exofs_dir_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, .readdir = exofs_readdir, .iterate = exofs_readdir, }; Loading
fs/exofs/dir.c +16 −22 Original line number Diff line number Diff line Loading @@ -239,22 +239,19 @@ void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode) } static int exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) exofs_readdir(struct file *file, struct dir_context *ctx) { loff_t pos = filp->f_pos; struct inode *inode = file_inode(filp); loff_t pos = ctx->pos; struct inode *inode = file_inode(file); unsigned int offset = pos & ~PAGE_CACHE_MASK; unsigned long n = pos >> PAGE_CACHE_SHIFT; unsigned long npages = dir_pages(inode); unsigned chunk_mask = ~(exofs_chunk_size(inode)-1); unsigned char *types = NULL; int need_revalidate = (filp->f_version != inode->i_version); int need_revalidate = (file->f_version != inode->i_version); if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1)) return 0; types = exofs_filetype_table; for ( ; n < npages; n++, offset = 0) { char *kaddr, *limit; struct exofs_dir_entry *de; Loading @@ -263,7 +260,7 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (IS_ERR(page)) { EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n", inode->i_ino); filp->f_pos += PAGE_CACHE_SIZE - offset; ctx->pos += PAGE_CACHE_SIZE - offset; return PTR_ERR(page); } kaddr = page_address(page); Loading @@ -271,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (offset) { offset = exofs_validate_entry(kaddr, offset, chunk_mask); filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset; ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset; } filp->f_version = inode->i_version; file->f_version = inode->i_version; need_revalidate = 0; } de = (struct exofs_dir_entry *)(kaddr + offset); Loading @@ -288,27 +285,24 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) return -EIO; } if (de->inode_no) { int over; unsigned char d_type = DT_UNKNOWN; unsigned char t; if (types && de->file_type < EXOFS_FT_MAX) d_type = types[de->file_type]; if (de->file_type < EXOFS_FT_MAX) t = exofs_filetype_table[de->file_type]; else t = DT_UNKNOWN; offset = (char *)de - kaddr; over = filldir(dirent, de->name, de->name_len, (n<<PAGE_CACHE_SHIFT) | offset, if (!dir_emit(ctx, de->name, de->name_len, le64_to_cpu(de->inode_no), d_type); if (over) { t)) { exofs_put_page(page); return 0; } } filp->f_pos += le16_to_cpu(de->rec_len); ctx->pos += le16_to_cpu(de->rec_len); } exofs_put_page(page); } return 0; } Loading Loading @@ -669,5 +663,5 @@ int exofs_empty_dir(struct inode *inode) const struct file_operations exofs_dir_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, .readdir = exofs_readdir, .iterate = exofs_readdir, };