Commit 1616abe8 authored by Al Viro's avatar Al Viro
Browse files

[readdir] convert nilfs2



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent d55fea8d
Loading
Loading
Loading
Loading
+18 −30
Original line number Diff line number Diff line
@@ -256,22 +256,18 @@ static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode)
	de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
}

static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
static int nilfs_readdir(struct file *file, struct dir_context *ctx)
{
	loff_t pos = filp->f_pos;
	struct inode *inode = file_inode(filp);
	loff_t pos = ctx->pos;
	struct inode *inode = file_inode(file);
	struct super_block *sb = inode->i_sb;
	unsigned int offset = pos & ~PAGE_CACHE_MASK;
	unsigned long n = pos >> PAGE_CACHE_SHIFT;
	unsigned long npages = dir_pages(inode);
/*	unsigned chunk_mask = ~(nilfs_chunk_size(inode)-1); */
	unsigned char *types = NULL;
	int ret;

	if (pos > inode->i_size - NILFS_DIR_REC_LEN(1))
		goto success;

	types = nilfs_filetype_table;
		return 0;

	for ( ; n < npages; n++, offset = 0) {
		char *kaddr, *limit;
@@ -281,9 +277,8 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
		if (IS_ERR(page)) {
			nilfs_error(sb, __func__, "bad page in #%lu",
				    inode->i_ino);
			filp->f_pos += PAGE_CACHE_SIZE - offset;
			ret = -EIO;
			goto done;
			ctx->pos += PAGE_CACHE_SIZE - offset;
			return -EIO;
		}
		kaddr = page_address(page);
		de = (struct nilfs_dir_entry *)(kaddr + offset);
@@ -293,35 +288,28 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
			if (de->rec_len == 0) {
				nilfs_error(sb, __func__,
					    "zero-length directory entry");
				ret = -EIO;
				nilfs_put_page(page);
				goto done;
				return -EIO;
			}
			if (de->inode) {
				int over;
				unsigned char d_type = DT_UNKNOWN;
				unsigned char t;

				if (types && de->file_type < NILFS_FT_MAX)
					d_type = types[de->file_type];
				if (de->file_type < NILFS_FT_MAX)
					t = nilfs_filetype_table[de->file_type];
				else
					t = DT_UNKNOWN;

				offset = (char *)de - kaddr;
				over = filldir(dirent, de->name, de->name_len,
						(n<<PAGE_CACHE_SHIFT) | offset,
						le64_to_cpu(de->inode), d_type);
				if (over) {
				if (!dir_emit(ctx, de->name, de->name_len,
						le64_to_cpu(de->inode), t)) {
					nilfs_put_page(page);
					goto success;
					return 0;
				}
			}
			filp->f_pos += nilfs_rec_len_from_disk(de->rec_len);
			ctx->pos += nilfs_rec_len_from_disk(de->rec_len);
		}
		nilfs_put_page(page);
	}

success:
	ret = 0;
done:
	return ret;
	return 0;
}

/*
@@ -678,7 +666,7 @@ not_empty:
const struct file_operations nilfs_dir_operations = {
	.llseek		= generic_file_llseek,
	.read		= generic_read_dir,
	.readdir	= nilfs_readdir,
	.iterate	= nilfs_readdir,
	.unlocked_ioctl	= nilfs_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl	= nilfs_compat_ioctl,