mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 08:26:59 +00:00
[readdir] convert exofs
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
81b9f66e6b
commit
75811d4fda
1 changed files with 16 additions and 22 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue