Commit bfee7169 authored by Al Viro's avatar Al Viro
Browse files

[readdir] convert isofs



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 0312fa7c
Loading
Loading
Loading
Loading
+20 −22
Original line number Diff line number Diff line
@@ -78,8 +78,8 @@ int get_acorn_filename(struct iso_directory_record *de,
/*
 * This should _really_ be cleaned up some day..
 */
static int do_isofs_readdir(struct inode *inode, struct file *filp,
		void *dirent, filldir_t filldir,
static int do_isofs_readdir(struct inode *inode, struct file *file,
		struct dir_context *ctx,
		char *tmpname, struct iso_directory_record *tmpde)
{
	unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
@@ -94,10 +94,10 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
	struct iso_directory_record *de;
	struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb);

	offset = filp->f_pos & (bufsize - 1);
	block = filp->f_pos >> bufbits;
	offset = ctx->pos & (bufsize - 1);
	block = ctx->pos >> bufbits;

	while (filp->f_pos < inode->i_size) {
	while (ctx->pos < inode->i_size) {
		int de_len;

		if (!bh) {
@@ -119,8 +119,8 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
		if (de_len == 0) {
			brelse(bh);
			bh = NULL;
			filp->f_pos = (filp->f_pos + ISOFS_BLOCK_SIZE) & ~(ISOFS_BLOCK_SIZE - 1);
			block = filp->f_pos >> bufbits;
			ctx->pos = (ctx->pos + ISOFS_BLOCK_SIZE) & ~(ISOFS_BLOCK_SIZE - 1);
			block = ctx->pos >> bufbits;
			offset = 0;
			continue;
		}
@@ -164,16 +164,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,

		if (de->flags[-sbi->s_high_sierra] & 0x80) {
			first_de = 0;
			filp->f_pos += de_len;
			ctx->pos += de_len;
			continue;
		}
		first_de = 1;

		/* Handle the case of the '.' directory */
		if (de->name_len[0] == 1 && de->name[0] == 0) {
			if (filldir(dirent, ".", 1, filp->f_pos, inode->i_ino, DT_DIR) < 0)
			if (!dir_emit_dot(file, ctx))
				break;
			filp->f_pos += de_len;
			ctx->pos += de_len;
			continue;
		}

@@ -181,10 +181,9 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,

		/* Handle the case of the '..' directory */
		if (de->name_len[0] == 1 && de->name[0] == 1) {
			inode_number = parent_ino(filp->f_path.dentry);
			if (filldir(dirent, "..", 2, filp->f_pos, inode_number, DT_DIR) < 0)
			if (!dir_emit_dotdot(file, ctx))
				break;
			filp->f_pos += de_len;
			ctx->pos += de_len;
			continue;
		}

@@ -198,7 +197,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
		if ((sbi->s_hide && (de->flags[-sbi->s_high_sierra] & 1)) ||
		    (!sbi->s_showassoc &&
				(de->flags[-sbi->s_high_sierra] & 4))) {
			filp->f_pos += de_len;
			ctx->pos += de_len;
			continue;
		}

@@ -230,10 +229,10 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
			}
		}
		if (len > 0) {
			if (filldir(dirent, p, len, filp->f_pos, inode_number, DT_UNKNOWN) < 0)
			if (!dir_emit(ctx, p, len, inode_number, DT_UNKNOWN))
				break;
		}
		filp->f_pos += de_len;
		ctx->pos += de_len;

		continue;
	}
@@ -247,13 +246,12 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
 * handling split directory entries.. The real work is done by
 * "do_isofs_readdir()".
 */
static int isofs_readdir(struct file *filp,
		void *dirent, filldir_t filldir)
static int isofs_readdir(struct file *file, struct dir_context *ctx)
{
	int result;
	char *tmpname;
	struct iso_directory_record *tmpde;
	struct inode *inode = file_inode(filp);
	struct inode *inode = file_inode(file);

	tmpname = (char *)__get_free_page(GFP_KERNEL);
	if (tmpname == NULL)
@@ -261,7 +259,7 @@ static int isofs_readdir(struct file *filp,

	tmpde = (struct iso_directory_record *) (tmpname+1024);

	result = do_isofs_readdir(inode, filp, dirent, filldir, tmpname, tmpde);
	result = do_isofs_readdir(inode, file, ctx, tmpname, tmpde);

	free_page((unsigned long) tmpname);
	return result;
@@ -271,7 +269,7 @@ const struct file_operations isofs_dir_operations =
{
	.llseek = generic_file_llseek,
	.read = generic_read_dir,
	.readdir = isofs_readdir,
	.iterate = isofs_readdir,
};

/*