提交 75811d4f 编写于 作者: A Al Viro

[readdir] convert exofs

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 81b9f66e
...@@ -239,22 +239,19 @@ void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode) ...@@ -239,22 +239,19 @@ void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode)
} }
static int 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; loff_t pos = ctx->pos;
struct inode *inode = file_inode(filp); struct inode *inode = file_inode(file);
unsigned int offset = pos & ~PAGE_CACHE_MASK; unsigned int offset = pos & ~PAGE_CACHE_MASK;
unsigned long n = pos >> PAGE_CACHE_SHIFT; unsigned long n = pos >> PAGE_CACHE_SHIFT;
unsigned long npages = dir_pages(inode); unsigned long npages = dir_pages(inode);
unsigned chunk_mask = ~(exofs_chunk_size(inode)-1); unsigned chunk_mask = ~(exofs_chunk_size(inode)-1);
unsigned char *types = NULL; int need_revalidate = (file->f_version != inode->i_version);
int need_revalidate = (filp->f_version != inode->i_version);
if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1)) if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1))
return 0; return 0;
types = exofs_filetype_table;
for ( ; n < npages; n++, offset = 0) { for ( ; n < npages; n++, offset = 0) {
char *kaddr, *limit; char *kaddr, *limit;
struct exofs_dir_entry *de; struct exofs_dir_entry *de;
...@@ -263,7 +260,7 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -263,7 +260,7 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if (IS_ERR(page)) { if (IS_ERR(page)) {
EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n", EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n",
inode->i_ino); inode->i_ino);
filp->f_pos += PAGE_CACHE_SIZE - offset; ctx->pos += PAGE_CACHE_SIZE - offset;
return PTR_ERR(page); return PTR_ERR(page);
} }
kaddr = page_address(page); kaddr = page_address(page);
...@@ -271,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -271,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if (offset) { if (offset) {
offset = exofs_validate_entry(kaddr, offset, offset = exofs_validate_entry(kaddr, offset,
chunk_mask); 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; need_revalidate = 0;
} }
de = (struct exofs_dir_entry *)(kaddr + offset); de = (struct exofs_dir_entry *)(kaddr + offset);
...@@ -288,27 +285,24 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -288,27 +285,24 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
return -EIO; return -EIO;
} }
if (de->inode_no) { if (de->inode_no) {
int over; unsigned char t;
unsigned char d_type = DT_UNKNOWN;
if (types && de->file_type < EXOFS_FT_MAX) if (de->file_type < EXOFS_FT_MAX)
d_type = types[de->file_type]; t = exofs_filetype_table[de->file_type];
else
t = DT_UNKNOWN;
offset = (char *)de - kaddr; if (!dir_emit(ctx, de->name, de->name_len,
over = filldir(dirent, de->name, de->name_len,
(n<<PAGE_CACHE_SHIFT) | offset,
le64_to_cpu(de->inode_no), le64_to_cpu(de->inode_no),
d_type); t)) {
if (over) {
exofs_put_page(page); exofs_put_page(page);
return 0; return 0;
} }
} }
filp->f_pos += le16_to_cpu(de->rec_len); ctx->pos += le16_to_cpu(de->rec_len);
} }
exofs_put_page(page); exofs_put_page(page);
} }
return 0; return 0;
} }
...@@ -669,5 +663,5 @@ int exofs_empty_dir(struct inode *inode) ...@@ -669,5 +663,5 @@ int exofs_empty_dir(struct inode *inode)
const struct file_operations exofs_dir_operations = { const struct file_operations exofs_dir_operations = {
.llseek = generic_file_llseek, .llseek = generic_file_llseek,
.read = generic_read_dir, .read = generic_read_dir,
.readdir = exofs_readdir, .iterate = exofs_readdir,
}; };
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册