forked from Minki/linux
[readdir] convert nilfs2
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
d55fea8ddb
commit
1616abe841
@ -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;
|
||||
@ -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);
|
||||
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -678,7 +666,7 @@ not_empty:
|
||||
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…
Reference in New Issue
Block a user