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

Commit 0de6256d authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds
Browse files

fuse: prepare lookup for nfs export



Use d_splice_alias() instead of d_add() in fuse lookup code, to allow NFS
exporting.

Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 764c76b3
Loading
Loading
Loading
Loading
+14 −10
Original line number Original line Diff line number Diff line
@@ -239,18 +239,20 @@ int fuse_valid_type(int m)
 * Add a directory inode to a dentry, ensuring that no other dentry
 * Add a directory inode to a dentry, ensuring that no other dentry
 * refers to this inode.  Called with fc->inst_mutex.
 * refers to this inode.  Called with fc->inst_mutex.
 */
 */
static int fuse_d_add_directory(struct dentry *entry, struct inode *inode)
static struct dentry *fuse_d_add_directory(struct dentry *entry,
					   struct inode *inode)
{
{
	struct dentry *alias = d_find_alias(inode);
	struct dentry *alias = d_find_alias(inode);
	if (alias) {
	if (alias && !(alias->d_flags & DCACHE_DISCONNECTED)) {
		/* This tries to shrink the subtree below alias */
		/* This tries to shrink the subtree below alias */
		fuse_invalidate_entry(alias);
		fuse_invalidate_entry(alias);
		dput(alias);
		dput(alias);
		if (!list_empty(&inode->i_dentry))
		if (!list_empty(&inode->i_dentry))
			return -EBUSY;
			return ERR_PTR(-EBUSY);
	} else {
		dput(alias);
	}
	}
	d_add(entry, inode);
	return d_splice_alias(inode, entry);
	return 0;
}
}


static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
@@ -259,6 +261,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
	int err;
	int err;
	struct fuse_entry_out outarg;
	struct fuse_entry_out outarg;
	struct inode *inode = NULL;
	struct inode *inode = NULL;
	struct dentry *newent;
	struct fuse_conn *fc = get_fuse_conn(dir);
	struct fuse_conn *fc = get_fuse_conn(dir);
	struct fuse_req *req;
	struct fuse_req *req;
	struct fuse_req *forget_req;
	struct fuse_req *forget_req;
@@ -303,21 +306,22 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,


	if (inode && S_ISDIR(inode->i_mode)) {
	if (inode && S_ISDIR(inode->i_mode)) {
		mutex_lock(&fc->inst_mutex);
		mutex_lock(&fc->inst_mutex);
		err = fuse_d_add_directory(entry, inode);
		newent = fuse_d_add_directory(entry, inode);
		mutex_unlock(&fc->inst_mutex);
		mutex_unlock(&fc->inst_mutex);
		if (err) {
		if (IS_ERR(newent)) {
			iput(inode);
			iput(inode);
			return ERR_PTR(err);
			return newent;
		}
		}
	} else
	} else
		d_add(entry, inode);
		newent = d_splice_alias(inode, entry);


	entry = newent ? newent : entry;
	entry->d_op = &fuse_dentry_operations;
	entry->d_op = &fuse_dentry_operations;
	if (!err)
	if (!err)
		fuse_change_entry_timeout(entry, &outarg);
		fuse_change_entry_timeout(entry, &outarg);
	else
	else
		fuse_invalidate_entry_cache(entry);
		fuse_invalidate_entry_cache(entry);
	return NULL;
	return newent;
}
}


/*
/*