[PATCH v2 1/2] PMFS: [readdir] convert pmfs
Vishal Verma
vishal.l.verma at linux.intel.com
Thu Oct 24 12:16:31 EDT 2013
readdir -> iterate conversion for PMFS
Signed-off-by: Vishal Verma <vishal.l.verma at linux.intel.com>
---
fs/pmfs/dir.c | 50 +++++++++++++++++++++-----------------------------
1 files changed, 21 insertions(+), 29 deletions(-)
diff --git a/fs/pmfs/dir.c b/fs/pmfs/dir.c
index b3ddb3c..ff9cf7b 100644
--- a/fs/pmfs/dir.c
+++ b/fs/pmfs/dir.c
@@ -224,33 +224,30 @@ out:
return retval;
}
-static int pmfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
+static int pmfs_readdir(struct file *file, struct dir_context *ctx)
{
- struct inode *inode = filp->f_dentry->d_inode;
+ struct inode *inode = file_inode(file);
struct super_block *sb = inode->i_sb;
struct pmfs_inode *pi;
char *blk_base;
- int ret = 0, stored;
- int error = 0;
unsigned long offset;
struct pmfs_direntry *de;
ino_t ino;
- stored = 0;
- offset = filp->f_pos & (sb->s_blocksize - 1);
- while (!error && !stored && filp->f_pos < inode->i_size) {
- unsigned long blk = filp->f_pos >> sb->s_blocksize_bits;
+ offset = ctx->pos & (sb->s_blocksize - 1);
+ while (ctx->pos < inode->i_size) {
+ unsigned long blk = ctx->pos >> sb->s_blocksize_bits;
blk_base =
pmfs_get_block(sb, pmfs_find_data_block(inode, blk));
if (!blk_base) {
pmfs_dbg("directory %lu contains a hole at offset %lld\n",
- inode->i_ino, filp->f_pos);
- filp->f_pos += sb->s_blocksize - offset;
+ inode->i_ino, ctx->pos);
+ ctx->pos += sb->s_blocksize - offset;
continue;
}
#if 0
- if (filp->f_version != inode->i_version) {
+ if (file->f_version != inode->i_version) {
for (i = 0; i < sb->s_blocksize && i < offset; ) {
de = (struct pmfs_direntry *)(blk_base + i);
/* It's too expensive to do a full
@@ -265,43 +262,38 @@ static int pmfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
i += le16_to_cpu(de->de_len);
}
offset = i;
- filp->f_pos =
- (filp->f_pos & ~(sb->s_blocksize - 1)) | offset;
- filp->f_version = inode->i_version;
+ ctx->pos =
+ (ctx->pos & ~(sb->s_blocksize - 1)) | offset;
+ file->f_version = inode->i_version;
}
#endif
- while (!error && filp->f_pos < inode->i_size
+ while (ctx->pos < inode->i_size
&& offset < sb->s_blocksize) {
de = (struct pmfs_direntry *)(blk_base + offset);
if (!pmfs_check_dir_entry("pmfs_readdir", inode, de,
blk_base, offset)) {
- /* On error, skip the f_pos to the next block. */
- filp->f_pos = (filp->f_pos | (sb->s_blocksize - 1)) + 1;
- ret = stored;
- goto out;
+ /* On error, skip to the next block. */
+ ctx->pos = ALIGN(ctx->pos, sb->s_blocksize);
+ break;
}
offset += le16_to_cpu(de->de_len);
if (de->ino) {
ino = le64_to_cpu(de->ino);
pi = pmfs_get_inode(sb, ino);
- error = filldir(dirent, de->name, de->name_len,
- filp->f_pos, ino,
- IF2DT(le16_to_cpu(pi->i_mode)));
- if (error)
- break;
- stored++;
+ if (!dir_emit(ctx, de->name, de->name_len,
+ ino, IF2DT(le16_to_cpu(pi->i_mode))))
+ return 0;
}
- filp->f_pos += le16_to_cpu(de->de_len);
+ ctx->pos += le16_to_cpu(de->de_len);
}
offset = 0;
}
-out:
- return ret;
+ return 0;
}
const struct file_operations pmfs_dir_operations = {
.read = generic_read_dir,
- .readdir = pmfs_readdir,
+ .iterate = pmfs_readdir,
.fsync = noop_fsync,
.unlocked_ioctl = pmfs_ioctl,
#ifdef CONFIG_COMPAT
--
1.7.0.4
More information about the Linux-pmfs
mailing list