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

Commit d7dd618a authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Linus Torvalds
Browse files

knfsd: exportfs: untangle ISDIR logic in find_exported_dentry



Rework some logic in find_exported_dentry so that we only have a single
S_ISDIR check and logic that makes clear to the reader what we're really doing
here.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 10f11c34
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -116,30 +116,23 @@ find_exported_dentry(struct super_block *sb, void *obj, void *parent,
	if (IS_ERR(result))
		return result;

	if (S_ISDIR(result->d_inode->i_mode) &&
	    (result->d_flags & DCACHE_DISCONNECTED)) {
		/* it is an unconnected directory, we must connect it */
		;
	} else {
	if (S_ISDIR(result->d_inode->i_mode)) {
		if (!(result->d_flags & DCACHE_DISCONNECTED)) {
			if (acceptable(context, result))
				return result;
		if (S_ISDIR(result->d_inode->i_mode)) {
			err = -EACCES;
			goto err_result;
		}

		target_dir = dget(result);
	} else {
		if (acceptable(context, result))
			return result;

		alias = find_acceptable_alias(result, acceptable, context);
		if (alias)
			return alias;
	}			

	/* It's a directory, or we are required to confirm the file's
	 * location in the tree based on the parent information
 	 */
	dprintk("find_exported_dentry: need to look harder for %s/%d\n",sb->s_id,*(int*)obj);
	if (S_ISDIR(result->d_inode->i_mode))
		target_dir = dget(result);
	else {
		if (parent == NULL)
			goto err_result;

@@ -149,6 +142,7 @@ find_exported_dentry(struct super_block *sb, void *obj, void *parent,
			goto err_result;
		}
	}

	/*
	 * Now we need to make sure that target_dir is properly connected.
	 * It may already be, as the flag isn't always updated when connection