mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
[readdir] simple local unixlike: switch to ->iterate()
ext2, ufs, minix, sysv Signed-off-by: Al Viro <[email protected]>
This commit is contained in:
parent
bb6f619b3a
commit
80886298c0
4 changed files with 59 additions and 75 deletions
|
|
@ -18,12 +18,12 @@
|
|||
#include <linux/swap.h>
|
||||
#include "sysv.h"
|
||||
|
||||
static int sysv_readdir(struct file *, void *, filldir_t);
|
||||
static int sysv_readdir(struct file *, struct dir_context *);
|
||||
|
||||
const struct file_operations sysv_dir_operations = {
|
||||
.llseek = generic_file_llseek,
|
||||
.read = generic_read_dir,
|
||||
.readdir = sysv_readdir,
|
||||
.iterate = sysv_readdir,
|
||||
.fsync = generic_file_fsync,
|
||||
};
|
||||
|
||||
|
|
@ -65,18 +65,21 @@ static struct page * dir_get_page(struct inode *dir, unsigned long n)
|
|||
return page;
|
||||
}
|
||||
|
||||
static int sysv_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
||||
static int sysv_readdir(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
unsigned long pos = filp->f_pos;
|
||||
struct inode *inode = file_inode(filp);
|
||||
unsigned long pos = ctx->pos;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct super_block *sb = inode->i_sb;
|
||||
unsigned offset = pos & ~PAGE_CACHE_MASK;
|
||||
unsigned long n = pos >> PAGE_CACHE_SHIFT;
|
||||
unsigned long npages = dir_pages(inode);
|
||||
unsigned offset;
|
||||
unsigned long n;
|
||||
|
||||
pos = (pos + SYSV_DIRSIZE-1) & ~(SYSV_DIRSIZE-1);
|
||||
ctx->pos = pos = (pos + SYSV_DIRSIZE-1) & ~(SYSV_DIRSIZE-1);
|
||||
if (pos >= inode->i_size)
|
||||
goto done;
|
||||
return 0;
|
||||
|
||||
offset = pos & ~PAGE_CACHE_MASK;
|
||||
n = pos >> PAGE_CACHE_SHIFT;
|
||||
|
||||
for ( ; n < npages; n++, offset = 0) {
|
||||
char *kaddr, *limit;
|
||||
|
|
@ -88,29 +91,21 @@ static int sysv_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
|||
kaddr = (char *)page_address(page);
|
||||
de = (struct sysv_dir_entry *)(kaddr+offset);
|
||||
limit = kaddr + PAGE_CACHE_SIZE - SYSV_DIRSIZE;
|
||||
for ( ;(char*)de <= limit; de++) {
|
||||
for ( ;(char*)de <= limit; de++, ctx->pos += sizeof(*de)) {
|
||||
char *name = de->name;
|
||||
int over;
|
||||
|
||||
if (!de->inode)
|
||||
continue;
|
||||
|
||||
offset = (char *)de - kaddr;
|
||||
|
||||
over = filldir(dirent, name, strnlen(name,SYSV_NAMELEN),
|
||||
((loff_t)n<<PAGE_CACHE_SHIFT) | offset,
|
||||
if (!dir_emit(ctx, name, strnlen(name,SYSV_NAMELEN),
|
||||
fs16_to_cpu(SYSV_SB(sb), de->inode),
|
||||
DT_UNKNOWN);
|
||||
if (over) {
|
||||
DT_UNKNOWN)) {
|
||||
dir_put_page(page);
|
||||
goto done;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
dir_put_page(page);
|
||||
}
|
||||
|
||||
done:
|
||||
filp->f_pos = ((loff_t)n << PAGE_CACHE_SHIFT) | offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue