[readdir] convert 9p
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
0edf977d2a
commit
8f29843a51
|
@ -101,16 +101,15 @@ static struct p9_rdir *v9fs_alloc_rdir_buf(struct file *filp, int buflen)
|
|||
}
|
||||
|
||||
/**
|
||||
* v9fs_dir_readdir - read a directory
|
||||
* @filp: opened file structure
|
||||
* @dirent: directory structure ???
|
||||
* @filldir: function to populate directory structure ???
|
||||
* v9fs_dir_readdir - iterate through a directory
|
||||
* @file: opened file structure
|
||||
* @ctx: actor we feed the entries to
|
||||
*
|
||||
*/
|
||||
|
||||
static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||
static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
int over;
|
||||
bool over;
|
||||
struct p9_wstat st;
|
||||
int err = 0;
|
||||
struct p9_fid *fid;
|
||||
|
@ -118,19 +117,19 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|||
int reclen = 0;
|
||||
struct p9_rdir *rdir;
|
||||
|
||||
p9_debug(P9_DEBUG_VFS, "name %s\n", filp->f_path.dentry->d_name.name);
|
||||
fid = filp->private_data;
|
||||
p9_debug(P9_DEBUG_VFS, "name %s\n", file->f_path.dentry->d_name.name);
|
||||
fid = file->private_data;
|
||||
|
||||
buflen = fid->clnt->msize - P9_IOHDRSZ;
|
||||
|
||||
rdir = v9fs_alloc_rdir_buf(filp, buflen);
|
||||
rdir = v9fs_alloc_rdir_buf(file, buflen);
|
||||
if (!rdir)
|
||||
return -ENOMEM;
|
||||
|
||||
while (1) {
|
||||
if (rdir->tail == rdir->head) {
|
||||
err = v9fs_file_readn(filp, rdir->buf, NULL,
|
||||
buflen, filp->f_pos);
|
||||
err = v9fs_file_readn(file, rdir->buf, NULL,
|
||||
buflen, ctx->pos);
|
||||
if (err <= 0)
|
||||
return err;
|
||||
|
||||
|
@ -148,51 +147,45 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|||
}
|
||||
reclen = st.size+2;
|
||||
|
||||
over = filldir(dirent, st.name, strlen(st.name),
|
||||
filp->f_pos, v9fs_qid2ino(&st.qid), dt_type(&st));
|
||||
|
||||
over = !dir_emit(ctx, st.name, strlen(st.name),
|
||||
v9fs_qid2ino(&st.qid), dt_type(&st));
|
||||
p9stat_free(&st);
|
||||
|
||||
if (over)
|
||||
return 0;
|
||||
|
||||
rdir->head += reclen;
|
||||
filp->f_pos += reclen;
|
||||
ctx->pos += reclen;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_dir_readdir_dotl - read a directory
|
||||
* @filp: opened file structure
|
||||
* @dirent: buffer to fill dirent structures
|
||||
* @filldir: function to populate dirent structures
|
||||
* v9fs_dir_readdir_dotl - iterate through a directory
|
||||
* @file: opened file structure
|
||||
* @ctx: actor we feed the entries to
|
||||
*
|
||||
*/
|
||||
static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,
|
||||
filldir_t filldir)
|
||||
static int v9fs_dir_readdir_dotl(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
int over;
|
||||
int err = 0;
|
||||
struct p9_fid *fid;
|
||||
int buflen;
|
||||
struct p9_rdir *rdir;
|
||||
struct p9_dirent curdirent;
|
||||
u64 oldoffset = 0;
|
||||
|
||||
p9_debug(P9_DEBUG_VFS, "name %s\n", filp->f_path.dentry->d_name.name);
|
||||
fid = filp->private_data;
|
||||
p9_debug(P9_DEBUG_VFS, "name %s\n", file->f_path.dentry->d_name.name);
|
||||
fid = file->private_data;
|
||||
|
||||
buflen = fid->clnt->msize - P9_READDIRHDRSZ;
|
||||
|
||||
rdir = v9fs_alloc_rdir_buf(filp, buflen);
|
||||
rdir = v9fs_alloc_rdir_buf(file, buflen);
|
||||
if (!rdir)
|
||||
return -ENOMEM;
|
||||
|
||||
while (1) {
|
||||
if (rdir->tail == rdir->head) {
|
||||
err = p9_client_readdir(fid, rdir->buf, buflen,
|
||||
filp->f_pos);
|
||||
ctx->pos);
|
||||
if (err <= 0)
|
||||
return err;
|
||||
|
||||
|
@ -210,22 +203,13 @@ static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
/* d_off in dirent structure tracks the offset into
|
||||
* the next dirent in the dir. However, filldir()
|
||||
* expects offset into the current dirent. Hence
|
||||
* while calling filldir send the offset from the
|
||||
* previous dirent structure.
|
||||
*/
|
||||
over = filldir(dirent, curdirent.d_name,
|
||||
strlen(curdirent.d_name),
|
||||
oldoffset, v9fs_qid2ino(&curdirent.qid),
|
||||
curdirent.d_type);
|
||||
oldoffset = curdirent.d_off;
|
||||
|
||||
if (over)
|
||||
if (!dir_emit(ctx, curdirent.d_name,
|
||||
strlen(curdirent.d_name),
|
||||
v9fs_qid2ino(&curdirent.qid),
|
||||
curdirent.d_type))
|
||||
return 0;
|
||||
|
||||
filp->f_pos = curdirent.d_off;
|
||||
ctx->pos = curdirent.d_off;
|
||||
rdir->head += err;
|
||||
}
|
||||
}
|
||||
|
@ -254,7 +238,7 @@ int v9fs_dir_release(struct inode *inode, struct file *filp)
|
|||
const struct file_operations v9fs_dir_operations = {
|
||||
.read = generic_read_dir,
|
||||
.llseek = generic_file_llseek,
|
||||
.readdir = v9fs_dir_readdir,
|
||||
.iterate = v9fs_dir_readdir,
|
||||
.open = v9fs_file_open,
|
||||
.release = v9fs_dir_release,
|
||||
};
|
||||
|
@ -262,7 +246,7 @@ const struct file_operations v9fs_dir_operations = {
|
|||
const struct file_operations v9fs_dir_operations_dotl = {
|
||||
.read = generic_read_dir,
|
||||
.llseek = generic_file_llseek,
|
||||
.readdir = v9fs_dir_readdir_dotl,
|
||||
.iterate = v9fs_dir_readdir_dotl,
|
||||
.open = v9fs_file_open,
|
||||
.release = v9fs_dir_release,
|
||||
.fsync = v9fs_file_fsync_dotl,
|
||||
|
|
Loading…
Reference in New Issue