Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2de5f059 authored by Al Viro's avatar Al Viro
Browse files

[readdir] convert ecryptfs



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent e924f251
Loading
Loading
Loading
Loading
+15 −20
Original line number Diff line number Diff line
@@ -69,9 +69,8 @@ static ssize_t ecryptfs_read_update_atime(struct kiocb *iocb,

struct ecryptfs_getdents_callback {
	struct dir_context ctx;
	void *dirent;
	struct dir_context *caller;
	struct dentry *dentry;
	filldir_t filldir;
	int filldir_called;
	int entries_written;
};
@@ -97,9 +96,10 @@ ecryptfs_filldir(void *dirent, const char *lower_name, int lower_namelen,
		       rc);
		goto out;
	}
	rc = buf->filldir(buf->dirent, name, name_size, offset, ino, d_type);
	buf->caller->pos = buf->ctx.pos;
	rc = !dir_emit(buf->caller, name, name_size, ino, d_type);
	kfree(name);
	if (rc >= 0)
	if (!rc)
		buf->entries_written++;
out:
	return rc;
@@ -108,28 +108,23 @@ ecryptfs_filldir(void *dirent, const char *lower_name, int lower_namelen,
/**
 * ecryptfs_readdir
 * @file: The eCryptfs directory file
 * @dirent: Directory entry handle
 * @filldir: The filldir callback function
 * @ctx: The actor to feed the entries to
 */
static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)
static int ecryptfs_readdir(struct file *file, struct dir_context *ctx)
{
	int rc;
	struct file *lower_file;
	struct inode *inode;
	struct ecryptfs_getdents_callback buf;

	struct ecryptfs_getdents_callback buf = {
		.ctx.actor = ecryptfs_filldir,
		.caller = ctx,
		.dentry = file->f_path.dentry
	};
	lower_file = ecryptfs_file_to_lower(file);
	lower_file->f_pos = file->f_pos;
	lower_file->f_pos = ctx->pos;
	inode = file_inode(file);
	memset(&buf, 0, sizeof(buf));
	buf.dirent = dirent;
	buf.dentry = file->f_path.dentry;
	buf.filldir = filldir;
	buf.filldir_called = 0;
	buf.entries_written = 0;
	buf.ctx.actor = ecryptfs_filldir;
	rc = iterate_dir(lower_file, &buf.ctx);
	file->f_pos = lower_file->f_pos;
	ctx->pos = buf.ctx.pos;
	if (rc < 0)
		goto out;
	if (buf.filldir_called && !buf.entries_written)
@@ -346,7 +341,7 @@ ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
#endif

const struct file_operations ecryptfs_dir_fops = {
	.readdir = ecryptfs_readdir,
	.iterate = ecryptfs_readdir,
	.read = generic_read_dir,
	.unlocked_ioctl = ecryptfs_unlocked_ioctl,
#ifdef CONFIG_COMPAT
@@ -367,7 +362,7 @@ const struct file_operations ecryptfs_main_fops = {
	.aio_read = ecryptfs_read_update_atime,
	.write = do_sync_write,
	.aio_write = generic_file_aio_write,
	.readdir = ecryptfs_readdir,
	.iterate = ecryptfs_readdir,
	.unlocked_ioctl = ecryptfs_unlocked_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl = ecryptfs_compat_ioctl,