Loading fs/nilfs2/dir.c +18 −30 Original line number Diff line number Diff line Loading @@ -256,22 +256,18 @@ static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode) de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; } static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir) static int nilfs_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); struct super_block *sb = inode->i_sb; unsigned int offset = pos & ~PAGE_CACHE_MASK; unsigned long n = pos >> PAGE_CACHE_SHIFT; unsigned long npages = dir_pages(inode); /* unsigned chunk_mask = ~(nilfs_chunk_size(inode)-1); */ unsigned char *types = NULL; int ret; if (pos > inode->i_size - NILFS_DIR_REC_LEN(1)) goto success; types = nilfs_filetype_table; return 0; for ( ; n < npages; n++, offset = 0) { char *kaddr, *limit; Loading @@ -281,9 +277,8 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (IS_ERR(page)) { nilfs_error(sb, __func__, "bad page in #%lu", inode->i_ino); filp->f_pos += PAGE_CACHE_SIZE - offset; ret = -EIO; goto done; ctx->pos += PAGE_CACHE_SIZE - offset; return -EIO; } kaddr = page_address(page); de = (struct nilfs_dir_entry *)(kaddr + offset); Loading @@ -293,35 +288,28 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (de->rec_len == 0) { nilfs_error(sb, __func__, "zero-length directory entry"); ret = -EIO; nilfs_put_page(page); goto done; return -EIO; } if (de->inode) { int over; unsigned char d_type = DT_UNKNOWN; unsigned char t; if (types && de->file_type < NILFS_FT_MAX) d_type = types[de->file_type]; if (de->file_type < NILFS_FT_MAX) t = nilfs_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, le64_to_cpu(de->inode), d_type); if (over) { if (!dir_emit(ctx, de->name, de->name_len, le64_to_cpu(de->inode), t)) { nilfs_put_page(page); goto success; return 0; } } filp->f_pos += nilfs_rec_len_from_disk(de->rec_len); ctx->pos += nilfs_rec_len_from_disk(de->rec_len); } nilfs_put_page(page); } success: ret = 0; done: return ret; return 0; } /* Loading Loading @@ -678,7 +666,7 @@ int nilfs_empty_dir(struct inode *inode) const struct file_operations nilfs_dir_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, .readdir = nilfs_readdir, .iterate = nilfs_readdir, .unlocked_ioctl = nilfs_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = nilfs_compat_ioctl, Loading Loading
fs/nilfs2/dir.c +18 −30 Original line number Diff line number Diff line Loading @@ -256,22 +256,18 @@ static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode) de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; } static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir) static int nilfs_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); struct super_block *sb = inode->i_sb; unsigned int offset = pos & ~PAGE_CACHE_MASK; unsigned long n = pos >> PAGE_CACHE_SHIFT; unsigned long npages = dir_pages(inode); /* unsigned chunk_mask = ~(nilfs_chunk_size(inode)-1); */ unsigned char *types = NULL; int ret; if (pos > inode->i_size - NILFS_DIR_REC_LEN(1)) goto success; types = nilfs_filetype_table; return 0; for ( ; n < npages; n++, offset = 0) { char *kaddr, *limit; Loading @@ -281,9 +277,8 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (IS_ERR(page)) { nilfs_error(sb, __func__, "bad page in #%lu", inode->i_ino); filp->f_pos += PAGE_CACHE_SIZE - offset; ret = -EIO; goto done; ctx->pos += PAGE_CACHE_SIZE - offset; return -EIO; } kaddr = page_address(page); de = (struct nilfs_dir_entry *)(kaddr + offset); Loading @@ -293,35 +288,28 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir) if (de->rec_len == 0) { nilfs_error(sb, __func__, "zero-length directory entry"); ret = -EIO; nilfs_put_page(page); goto done; return -EIO; } if (de->inode) { int over; unsigned char d_type = DT_UNKNOWN; unsigned char t; if (types && de->file_type < NILFS_FT_MAX) d_type = types[de->file_type]; if (de->file_type < NILFS_FT_MAX) t = nilfs_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, le64_to_cpu(de->inode), d_type); if (over) { if (!dir_emit(ctx, de->name, de->name_len, le64_to_cpu(de->inode), t)) { nilfs_put_page(page); goto success; return 0; } } filp->f_pos += nilfs_rec_len_from_disk(de->rec_len); ctx->pos += nilfs_rec_len_from_disk(de->rec_len); } nilfs_put_page(page); } success: ret = 0; done: return ret; return 0; } /* Loading Loading @@ -678,7 +666,7 @@ int nilfs_empty_dir(struct inode *inode) const struct file_operations nilfs_dir_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, .readdir = nilfs_readdir, .iterate = nilfs_readdir, .unlocked_ioctl = nilfs_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = nilfs_compat_ioctl, Loading