Commit 75811d4f authored by Al Viro's avatar Al Viro
Browse files

[readdir] convert exofs



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 81b9f66e
Loading
Loading
Loading
Loading
+16 −22
Original line number Diff line number Diff line
@@ -239,22 +239,19 @@ void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode)
}

static int
exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
exofs_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);
	unsigned int offset = pos & ~PAGE_CACHE_MASK;
	unsigned long n = pos >> PAGE_CACHE_SHIFT;
	unsigned long npages = dir_pages(inode);
	unsigned chunk_mask = ~(exofs_chunk_size(inode)-1);
	unsigned char *types = NULL;
	int need_revalidate = (filp->f_version != inode->i_version);
	int need_revalidate = (file->f_version != inode->i_version);

	if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1))
		return 0;

	types = exofs_filetype_table;

	for ( ; n < npages; n++, offset = 0) {
		char *kaddr, *limit;
		struct exofs_dir_entry *de;
@@ -263,7 +260,7 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
		if (IS_ERR(page)) {
			EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n",
				  inode->i_ino);
			filp->f_pos += PAGE_CACHE_SIZE - offset;
			ctx->pos += PAGE_CACHE_SIZE - offset;
			return PTR_ERR(page);
		}
		kaddr = page_address(page);
@@ -271,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
			if (offset) {
				offset = exofs_validate_entry(kaddr, offset,
								chunk_mask);
				filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset;
				ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset;
			}
			filp->f_version = inode->i_version;
			file->f_version = inode->i_version;
			need_revalidate = 0;
		}
		de = (struct exofs_dir_entry *)(kaddr + offset);
@@ -288,27 +285,24 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
				return -EIO;
			}
			if (de->inode_no) {
				int over;
				unsigned char d_type = DT_UNKNOWN;
				unsigned char t;

				if (types && de->file_type < EXOFS_FT_MAX)
					d_type = types[de->file_type];
				if (de->file_type < EXOFS_FT_MAX)
					t = exofs_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,
				if (!dir_emit(ctx, de->name, de->name_len,
						le64_to_cpu(de->inode_no),
						d_type);
				if (over) {
						t)) {
					exofs_put_page(page);
					return 0;
				}
			}
			filp->f_pos += le16_to_cpu(de->rec_len);
			ctx->pos += le16_to_cpu(de->rec_len);
		}
		exofs_put_page(page);
	}

	return 0;
}

@@ -669,5 +663,5 @@ not_empty:
const struct file_operations exofs_dir_operations = {
	.llseek		= generic_file_llseek,
	.read		= generic_read_dir,
	.readdir	= exofs_readdir,
	.iterate	= exofs_readdir,
};