diff options
| author | Sage Weil <sage@inktank.com> | 2013-08-15 11:11:45 -0700 | 
|---|---|---|
| committer | Sage Weil <sage@inktank.com> | 2013-08-15 11:11:45 -0700 | 
| commit | ee3e542fec6e69bc9fb668698889a37d93950ddf (patch) | |
| tree | e74ee766a4764769ef1d3d45d266b4dea64101d3 /fs/openpromfs/inode.c | |
| parent | fe2a801b50c0bb8039d627e5ae1fec249d10ff39 (diff) | |
| parent | f1d6e17f540af37bb1891480143669ba7636c4cf (diff) | |
Merge remote-tracking branch 'linus/master' into testing
Diffstat (limited to 'fs/openpromfs/inode.c')
| -rw-r--r-- | fs/openpromfs/inode.c | 91 | 
1 files changed, 42 insertions, 49 deletions
| diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index 75885ffde44e..8c0ceb8dd1f7 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -162,11 +162,11 @@ static const struct file_operations openpromfs_prop_ops = {  	.release	= seq_release,  }; -static int openpromfs_readdir(struct file *, void *, filldir_t); +static int openpromfs_readdir(struct file *, struct dir_context *);  static const struct file_operations openprom_operations = {  	.read		= generic_read_dir, -	.readdir	= openpromfs_readdir, +	.iterate	= openpromfs_readdir,  	.llseek		= generic_file_llseek,  }; @@ -260,71 +260,64 @@ found:  	return NULL;  } -static int openpromfs_readdir(struct file * filp, void * dirent, filldir_t filldir) +static int openpromfs_readdir(struct file *file, struct dir_context *ctx)  { -	struct inode *inode = file_inode(filp); +	struct inode *inode = file_inode(file);  	struct op_inode_info *oi = OP_I(inode);  	struct device_node *dp = oi->u.node;  	struct device_node *child;  	struct property *prop; -	unsigned int ino;  	int i;  	mutex_lock(&op_mutex); -	ino = inode->i_ino; -	i = filp->f_pos; -	switch (i) { -	case 0: -		if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) +	if (ctx->pos == 0) { +		if (!dir_emit(ctx, ".", 1, inode->i_ino, DT_DIR))  			goto out; -		i++; -		filp->f_pos++; -		/* fall thru */ -	case 1: -		if (filldir(dirent, "..", 2, i, +		ctx->pos = 1; +	} +	if (ctx->pos == 1) { +		if (!dir_emit(ctx, "..", 2,  			    (dp->parent == NULL ?  			     OPENPROM_ROOT_INO : -			     dp->parent->unique_id), DT_DIR) < 0)  +			     dp->parent->unique_id), DT_DIR))  			goto out; -		i++; -		filp->f_pos++; -		/* fall thru */ -	default: -		i -= 2; +		ctx->pos = 2; +	} +	i = ctx->pos - 2; -		/* First, the children nodes as directories.  */ -		child = dp->child; -		while (i && child) { -			child = child->sibling; -			i--; -		} -		while (child) { -			if (filldir(dirent, -				    child->path_component_name, -				    strlen(child->path_component_name), -				    filp->f_pos, child->unique_id, DT_DIR) < 0) -				goto out; +	/* First, the children nodes as directories.  */ +	child = dp->child; +	while (i && child) { +		child = child->sibling; +		i--; +	} +	while (child) { +		if (!dir_emit(ctx, +			    child->path_component_name, +			    strlen(child->path_component_name), +			    child->unique_id, DT_DIR)) +			goto out; -			filp->f_pos++; -			child = child->sibling; -		} +		ctx->pos++; +		child = child->sibling; +	} -		/* Next, the properties as files.  */ -		prop = dp->properties; -		while (i && prop) { -			prop = prop->next; -			i--; -		} -		while (prop) { -			if (filldir(dirent, prop->name, strlen(prop->name), -				    filp->f_pos, prop->unique_id, DT_REG) < 0) -				goto out; +	/* Next, the properties as files.  */ +	prop = dp->properties; +	while (i && prop) { +		prop = prop->next; +		i--; +	} +	while (prop) { +		if (!dir_emit(ctx, prop->name, strlen(prop->name), +			    prop->unique_id, DT_REG)) +			goto out; -			filp->f_pos++; -			prop = prop->next; -		} +		ctx->pos++; +		prop = prop->next;  	} +  out:  	mutex_unlock(&op_mutex);  	return 0; | 
