Commit 070a0ebf authored by Al Viro's avatar Al Viro

[readdir] convert jfs

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 77acfa29
...@@ -3002,9 +3002,9 @@ static inline struct jfs_dirent *next_jfs_dirent(struct jfs_dirent *dirent) ...@@ -3002,9 +3002,9 @@ static inline struct jfs_dirent *next_jfs_dirent(struct jfs_dirent *dirent)
* return: offset = (pn, index) of start entry * return: offset = (pn, index) of start entry
* of next jfs_readdir()/dtRead() * of next jfs_readdir()/dtRead()
*/ */
int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) int jfs_readdir(struct file *file, struct dir_context *ctx)
{ {
struct inode *ip = file_inode(filp); struct inode *ip = file_inode(file);
struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab; struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab;
int rc = 0; int rc = 0;
loff_t dtpos; /* legacy OS/2 style position */ loff_t dtpos; /* legacy OS/2 style position */
...@@ -3033,7 +3033,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3033,7 +3033,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
int overflow, fix_page, page_fixed = 0; int overflow, fix_page, page_fixed = 0;
static int unique_pos = 2; /* If we can't fix broken index */ static int unique_pos = 2; /* If we can't fix broken index */
if (filp->f_pos == DIREND) if (ctx->pos == DIREND)
return 0; return 0;
if (DO_INDEX(ip)) { if (DO_INDEX(ip)) {
...@@ -3045,7 +3045,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3045,7 +3045,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
*/ */
do_index = 1; do_index = 1;
dir_index = (u32) filp->f_pos; dir_index = (u32) ctx->pos;
if (dir_index > 1) { if (dir_index > 1) {
struct dir_table_slot dirtab_slot; struct dir_table_slot dirtab_slot;
...@@ -3053,25 +3053,25 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3053,25 +3053,25 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if (dtEmpty(ip) || if (dtEmpty(ip) ||
(dir_index >= JFS_IP(ip)->next_index)) { (dir_index >= JFS_IP(ip)->next_index)) {
/* Stale position. Directory has shrunk */ /* Stale position. Directory has shrunk */
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
repeat: repeat:
rc = read_index(ip, dir_index, &dirtab_slot); rc = read_index(ip, dir_index, &dirtab_slot);
if (rc) { if (rc) {
filp->f_pos = DIREND; ctx->pos = DIREND;
return rc; return rc;
} }
if (dirtab_slot.flag == DIR_INDEX_FREE) { if (dirtab_slot.flag == DIR_INDEX_FREE) {
if (loop_count++ > JFS_IP(ip)->next_index) { if (loop_count++ > JFS_IP(ip)->next_index) {
jfs_err("jfs_readdir detected " jfs_err("jfs_readdir detected "
"infinite loop!"); "infinite loop!");
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
dir_index = le32_to_cpu(dirtab_slot.addr2); dir_index = le32_to_cpu(dirtab_slot.addr2);
if (dir_index == -1) { if (dir_index == -1) {
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
goto repeat; goto repeat;
...@@ -3080,13 +3080,13 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3080,13 +3080,13 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
index = dirtab_slot.slot; index = dirtab_slot.slot;
DT_GETPAGE(ip, bn, mp, PSIZE, p, rc); DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
if (rc) { if (rc) {
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
if (p->header.flag & BT_INTERNAL) { if (p->header.flag & BT_INTERNAL) {
jfs_err("jfs_readdir: bad index table"); jfs_err("jfs_readdir: bad index table");
DT_PUTPAGE(mp); DT_PUTPAGE(mp);
filp->f_pos = -1; ctx->pos = -1;
return 0; return 0;
} }
} else { } else {
...@@ -3094,23 +3094,22 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3094,23 +3094,22 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
/* /*
* self "." * self "."
*/ */
filp->f_pos = 0; ctx->pos = 0;
if (filldir(dirent, ".", 1, 0, ip->i_ino, if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
DT_DIR))
return 0; return 0;
} }
/* /*
* parent ".." * parent ".."
*/ */
filp->f_pos = 1; ctx->pos = 1;
if (filldir(dirent, "..", 2, 1, PARENT(ip), DT_DIR)) if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
return 0; return 0;
/* /*
* Find first entry of left-most leaf * Find first entry of left-most leaf
*/ */
if (dtEmpty(ip)) { if (dtEmpty(ip)) {
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
...@@ -3128,23 +3127,19 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3128,23 +3127,19 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
* pn > 0: Real entries, pn=1 -> leftmost page * pn > 0: Real entries, pn=1 -> leftmost page
* pn = index = -1: No more entries * pn = index = -1: No more entries
*/ */
dtpos = filp->f_pos; dtpos = ctx->pos;
if (dtpos == 0) { if (dtpos == 0) {
/* build "." entry */ /* build "." entry */
if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
if (filldir(dirent, ".", 1, filp->f_pos, ip->i_ino,
DT_DIR))
return 0; return 0;
dtoffset->index = 1; dtoffset->index = 1;
filp->f_pos = dtpos; ctx->pos = dtpos;
} }
if (dtoffset->pn == 0) { if (dtoffset->pn == 0) {
if (dtoffset->index == 1) { if (dtoffset->index == 1) {
/* build ".." entry */ /* build ".." entry */
if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
if (filldir(dirent, "..", 2, filp->f_pos,
PARENT(ip), DT_DIR))
return 0; return 0;
} else { } else {
jfs_err("jfs_readdir called with " jfs_err("jfs_readdir called with "
...@@ -3152,18 +3147,18 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3152,18 +3147,18 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
} }
dtoffset->pn = 1; dtoffset->pn = 1;
dtoffset->index = 0; dtoffset->index = 0;
filp->f_pos = dtpos; ctx->pos = dtpos;
} }
if (dtEmpty(ip)) { if (dtEmpty(ip)) {
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
if ((rc = dtReadNext(ip, &filp->f_pos, &btstack))) { if ((rc = dtReadNext(ip, &ctx->pos, &btstack))) {
jfs_err("jfs_readdir: unexpected rc = %d " jfs_err("jfs_readdir: unexpected rc = %d "
"from dtReadNext", rc); "from dtReadNext", rc);
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
/* get start leaf page and index */ /* get start leaf page and index */
...@@ -3171,7 +3166,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3171,7 +3166,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
/* offset beyond directory eof ? */ /* offset beyond directory eof ? */
if (bn < 0) { if (bn < 0) {
filp->f_pos = DIREND; ctx->pos = DIREND;
return 0; return 0;
} }
} }
...@@ -3180,7 +3175,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3180,7 +3175,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if (dirent_buf == 0) { if (dirent_buf == 0) {
DT_PUTPAGE(mp); DT_PUTPAGE(mp);
jfs_warn("jfs_readdir: __get_free_page failed!"); jfs_warn("jfs_readdir: __get_free_page failed!");
filp->f_pos = DIREND; ctx->pos = DIREND;
return -ENOMEM; return -ENOMEM;
} }
...@@ -3295,9 +3290,9 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3295,9 +3290,9 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
jfs_dirent = (struct jfs_dirent *) dirent_buf; jfs_dirent = (struct jfs_dirent *) dirent_buf;
while (jfs_dirents--) { while (jfs_dirents--) {
filp->f_pos = jfs_dirent->position; ctx->pos = jfs_dirent->position;
if (filldir(dirent, jfs_dirent->name, if (!dir_emit(ctx, jfs_dirent->name,
jfs_dirent->name_len, filp->f_pos, jfs_dirent->name_len,
jfs_dirent->ino, DT_UNKNOWN)) jfs_dirent->ino, DT_UNKNOWN))
goto out; goto out;
jfs_dirent = next_jfs_dirent(jfs_dirent); jfs_dirent = next_jfs_dirent(jfs_dirent);
...@@ -3309,7 +3304,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -3309,7 +3304,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
} }
if (!overflow && (bn == 0)) { if (!overflow && (bn == 0)) {
filp->f_pos = DIREND; ctx->pos = DIREND;
break; break;
} }
......
...@@ -265,5 +265,5 @@ extern int dtDelete(tid_t tid, struct inode *ip, struct component_name * key, ...@@ -265,5 +265,5 @@ extern int dtDelete(tid_t tid, struct inode *ip, struct component_name * key,
extern int dtModify(tid_t tid, struct inode *ip, struct component_name * key, extern int dtModify(tid_t tid, struct inode *ip, struct component_name * key,
ino_t * orig_ino, ino_t new_ino, int flag); ino_t * orig_ino, ino_t new_ino, int flag);
extern int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir); extern int jfs_readdir(struct file *file, struct dir_context *ctx);
#endif /* !_H_JFS_DTREE */ #endif /* !_H_JFS_DTREE */
...@@ -1529,7 +1529,7 @@ const struct inode_operations jfs_dir_inode_operations = { ...@@ -1529,7 +1529,7 @@ const struct inode_operations jfs_dir_inode_operations = {
const struct file_operations jfs_dir_operations = { const struct file_operations jfs_dir_operations = {
.read = generic_read_dir, .read = generic_read_dir,
.readdir = jfs_readdir, .iterate = jfs_readdir,
.fsync = jfs_fsync, .fsync = jfs_fsync,
.unlocked_ioctl = jfs_ioctl, .unlocked_ioctl = jfs_ioctl,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
......
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