Commit 76f582a8 authored by Al Viro's avatar Al Viro

[readdir] convert ncpfs

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent e72514e7
...@@ -23,12 +23,12 @@ ...@@ -23,12 +23,12 @@
#include "ncp_fs.h" #include "ncp_fs.h"
static void ncp_read_volume_list(struct file *, void *, filldir_t, static void ncp_read_volume_list(struct file *, struct dir_context *,
struct ncp_cache_control *); struct ncp_cache_control *);
static void ncp_do_readdir(struct file *, void *, filldir_t, static void ncp_do_readdir(struct file *, struct dir_context *,
struct ncp_cache_control *); struct ncp_cache_control *);
static int ncp_readdir(struct file *, void *, filldir_t); static int ncp_readdir(struct file *, struct dir_context *);
static int ncp_create(struct inode *, struct dentry *, umode_t, bool); static int ncp_create(struct inode *, struct dentry *, umode_t, bool);
static struct dentry *ncp_lookup(struct inode *, struct dentry *, unsigned int); static struct dentry *ncp_lookup(struct inode *, struct dentry *, unsigned int);
...@@ -49,7 +49,7 @@ const struct file_operations ncp_dir_operations = ...@@ -49,7 +49,7 @@ const struct file_operations ncp_dir_operations =
{ {
.llseek = generic_file_llseek, .llseek = generic_file_llseek,
.read = generic_read_dir, .read = generic_read_dir,
.readdir = ncp_readdir, .iterate = ncp_readdir,
.unlocked_ioctl = ncp_ioctl, .unlocked_ioctl = ncp_ioctl,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.compat_ioctl = ncp_compat_ioctl, .compat_ioctl = ncp_compat_ioctl,
...@@ -424,9 +424,9 @@ static time_t ncp_obtain_mtime(struct dentry *dentry) ...@@ -424,9 +424,9 @@ static time_t ncp_obtain_mtime(struct dentry *dentry)
return ncp_date_dos2unix(i.modifyTime, i.modifyDate); return ncp_date_dos2unix(i.modifyTime, i.modifyDate);
} }
static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) static int ncp_readdir(struct file *file, struct dir_context *ctx)
{ {
struct dentry *dentry = filp->f_path.dentry; struct dentry *dentry = file->f_path.dentry;
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
struct page *page = NULL; struct page *page = NULL;
struct ncp_server *server = NCP_SERVER(inode); struct ncp_server *server = NCP_SERVER(inode);
...@@ -440,7 +440,7 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -440,7 +440,7 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
DDPRINTK("ncp_readdir: reading %s/%s, pos=%d\n", DDPRINTK("ncp_readdir: reading %s/%s, pos=%d\n",
dentry->d_parent->d_name.name, dentry->d_name.name, dentry->d_parent->d_name.name, dentry->d_name.name,
(int) filp->f_pos); (int) ctx->pos);
result = -EIO; result = -EIO;
/* Do not generate '.' and '..' when server is dead. */ /* Do not generate '.' and '..' when server is dead. */
...@@ -448,16 +448,8 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -448,16 +448,8 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
goto out; goto out;
result = 0; result = 0;
if (filp->f_pos == 0) { if (!dir_emit_dots(file, ctx))
if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR)) goto out;
goto out;
filp->f_pos = 1;
}
if (filp->f_pos == 1) {
if (filldir(dirent, "..", 2, 1, parent_ino(dentry), DT_DIR))
goto out;
filp->f_pos = 2;
}
page = grab_cache_page(&inode->i_data, 0); page = grab_cache_page(&inode->i_data, 0);
if (!page) if (!page)
...@@ -469,7 +461,7 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -469,7 +461,7 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
if (!PageUptodate(page) || !ctl.head.eof) if (!PageUptodate(page) || !ctl.head.eof)
goto init_cache; goto init_cache;
if (filp->f_pos == 2) { if (ctx->pos == 2) {
if (jiffies - ctl.head.time >= NCP_MAX_AGE(server)) if (jiffies - ctl.head.time >= NCP_MAX_AGE(server))
goto init_cache; goto init_cache;
...@@ -479,10 +471,10 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -479,10 +471,10 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
goto init_cache; goto init_cache;
} }
if (filp->f_pos > ctl.head.end) if (ctx->pos > ctl.head.end)
goto finished; goto finished;
ctl.fpos = filp->f_pos + (NCP_DIRCACHE_START - 2); ctl.fpos = ctx->pos + (NCP_DIRCACHE_START - 2);
ctl.ofs = ctl.fpos / NCP_DIRCACHE_SIZE; ctl.ofs = ctl.fpos / NCP_DIRCACHE_SIZE;
ctl.idx = ctl.fpos % NCP_DIRCACHE_SIZE; ctl.idx = ctl.fpos % NCP_DIRCACHE_SIZE;
...@@ -497,21 +489,21 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -497,21 +489,21 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
} }
while (ctl.idx < NCP_DIRCACHE_SIZE) { while (ctl.idx < NCP_DIRCACHE_SIZE) {
struct dentry *dent; struct dentry *dent;
int res; bool over;
dent = ncp_dget_fpos(ctl.cache->dentry[ctl.idx], dent = ncp_dget_fpos(ctl.cache->dentry[ctl.idx],
dentry, filp->f_pos); dentry, ctx->pos);
if (!dent) if (!dent)
goto invalid_cache; goto invalid_cache;
res = filldir(dirent, dent->d_name.name, over = !dir_emit(ctx, dent->d_name.name,
dent->d_name.len, filp->f_pos, dent->d_name.len,
dent->d_inode->i_ino, DT_UNKNOWN); dent->d_inode->i_ino, DT_UNKNOWN);
dput(dent); dput(dent);
if (res) if (over)
goto finished; goto finished;
filp->f_pos += 1; ctx->pos += 1;
ctl.idx += 1; ctl.idx += 1;
if (filp->f_pos > ctl.head.end) if (ctx->pos > ctl.head.end)
goto finished; goto finished;
} }
if (ctl.page) { if (ctl.page) {
...@@ -548,9 +540,9 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -548,9 +540,9 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
ctl.valid = 1; ctl.valid = 1;
read_really: read_really:
if (ncp_is_server_root(inode)) { if (ncp_is_server_root(inode)) {
ncp_read_volume_list(filp, dirent, filldir, &ctl); ncp_read_volume_list(file, ctx, &ctl);
} else { } else {
ncp_do_readdir(filp, dirent, filldir, &ctl); ncp_do_readdir(file, ctx, &ctl);
} }
ctl.head.end = ctl.fpos - 1; ctl.head.end = ctl.fpos - 1;
ctl.head.eof = ctl.valid; ctl.head.eof = ctl.valid;
...@@ -573,11 +565,11 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -573,11 +565,11 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
} }
static int static int
ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, ncp_fill_cache(struct file *file, struct dir_context *ctx,
struct ncp_cache_control *ctrl, struct ncp_entry_info *entry, struct ncp_cache_control *ctrl, struct ncp_entry_info *entry,
int inval_childs) int inval_childs)
{ {
struct dentry *newdent, *dentry = filp->f_path.dentry; struct dentry *newdent, *dentry = file->f_path.dentry;
struct inode *dir = dentry->d_inode; struct inode *dir = dentry->d_inode;
struct ncp_cache_control ctl = *ctrl; struct ncp_cache_control ctl = *ctrl;
struct qstr qname; struct qstr qname;
...@@ -666,15 +658,15 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, ...@@ -666,15 +658,15 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
end_advance: end_advance:
if (!valid) if (!valid)
ctl.valid = 0; ctl.valid = 0;
if (!ctl.filled && (ctl.fpos == filp->f_pos)) { if (!ctl.filled && (ctl.fpos == ctx->pos)) {
if (!ino) if (!ino)
ino = find_inode_number(dentry, &qname); ino = find_inode_number(dentry, &qname);
if (!ino) if (!ino)
ino = iunique(dir->i_sb, 2); ino = iunique(dir->i_sb, 2);
ctl.filled = filldir(dirent, qname.name, qname.len, ctl.filled = !dir_emit(ctx, qname.name, qname.len,
filp->f_pos, ino, DT_UNKNOWN); ino, DT_UNKNOWN);
if (!ctl.filled) if (!ctl.filled)
filp->f_pos += 1; ctx->pos += 1;
} }
ctl.fpos += 1; ctl.fpos += 1;
ctl.idx += 1; ctl.idx += 1;
...@@ -683,10 +675,10 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, ...@@ -683,10 +675,10 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
} }
static void static void
ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir, ncp_read_volume_list(struct file *file, struct dir_context *ctx,
struct ncp_cache_control *ctl) struct ncp_cache_control *ctl)
{ {
struct dentry *dentry = filp->f_path.dentry; struct dentry *dentry = file->f_path.dentry;
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
struct ncp_server *server = NCP_SERVER(inode); struct ncp_server *server = NCP_SERVER(inode);
struct ncp_volume_info info; struct ncp_volume_info info;
...@@ -694,7 +686,7 @@ ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir, ...@@ -694,7 +686,7 @@ ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir,
int i; int i;
DPRINTK("ncp_read_volume_list: pos=%ld\n", DPRINTK("ncp_read_volume_list: pos=%ld\n",
(unsigned long) filp->f_pos); (unsigned long) ctx->pos);
for (i = 0; i < NCP_NUMBER_OF_VOLUMES; i++) { for (i = 0; i < NCP_NUMBER_OF_VOLUMES; i++) {
int inval_dentry; int inval_dentry;
...@@ -715,16 +707,16 @@ ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir, ...@@ -715,16 +707,16 @@ ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir,
} }
inval_dentry = ncp_update_known_namespace(server, entry.i.volNumber, NULL); inval_dentry = ncp_update_known_namespace(server, entry.i.volNumber, NULL);
entry.volume = entry.i.volNumber; entry.volume = entry.i.volNumber;
if (!ncp_fill_cache(filp, dirent, filldir, ctl, &entry, inval_dentry)) if (!ncp_fill_cache(file, ctx, ctl, &entry, inval_dentry))
return; return;
} }
} }
static void static void
ncp_do_readdir(struct file *filp, void *dirent, filldir_t filldir, ncp_do_readdir(struct file *file, struct dir_context *ctx,
struct ncp_cache_control *ctl) struct ncp_cache_control *ctl)
{ {
struct dentry *dentry = filp->f_path.dentry; struct dentry *dentry = file->f_path.dentry;
struct inode *dir = dentry->d_inode; struct inode *dir = dentry->d_inode;
struct ncp_server *server = NCP_SERVER(dir); struct ncp_server *server = NCP_SERVER(dir);
struct nw_search_sequence seq; struct nw_search_sequence seq;
...@@ -736,7 +728,7 @@ ncp_do_readdir(struct file *filp, void *dirent, filldir_t filldir, ...@@ -736,7 +728,7 @@ ncp_do_readdir(struct file *filp, void *dirent, filldir_t filldir,
DPRINTK("ncp_do_readdir: %s/%s, fpos=%ld\n", DPRINTK("ncp_do_readdir: %s/%s, fpos=%ld\n",
dentry->d_parent->d_name.name, dentry->d_name.name, dentry->d_parent->d_name.name, dentry->d_name.name,
(unsigned long) filp->f_pos); (unsigned long) ctx->pos);
PPRINTK("ncp_do_readdir: init %s, volnum=%d, dirent=%u\n", PPRINTK("ncp_do_readdir: init %s, volnum=%d, dirent=%u\n",
dentry->d_name.name, NCP_FINFO(dir)->volNumber, dentry->d_name.name, NCP_FINFO(dir)->volNumber,
NCP_FINFO(dir)->dirEntNum); NCP_FINFO(dir)->dirEntNum);
...@@ -778,7 +770,7 @@ ncp_do_readdir(struct file *filp, void *dirent, filldir_t filldir, ...@@ -778,7 +770,7 @@ ncp_do_readdir(struct file *filp, void *dirent, filldir_t filldir,
rpl += onerpl; rpl += onerpl;
rpls -= onerpl; rpls -= onerpl;
entry.volume = entry.i.volNumber; entry.volume = entry.i.volNumber;
if (!ncp_fill_cache(filp, dirent, filldir, ctl, &entry, 0)) if (!ncp_fill_cache(file, ctx, ctl, &entry, 0))
break; break;
} }
} while (more); } while (more);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment