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

Commit 03f28e3a authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Make nfs_fhget() return appropriate error values



Currently it returns NULL, which usually gets interpreted as ENOMEM. In
fact it can mean a host of issues.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 01d0ae8b
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -901,9 +901,9 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru
		res = ERR_PTR(error);
		goto out_unlock;
	}
	res = ERR_PTR(-EACCES);
	inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr);
	if (!inode)
	res = (struct dentry *)inode;
	if (IS_ERR(res))
		goto out_unlock;
no_entry:
	res = d_add_unique(dentry, inode);
@@ -1096,7 +1096,7 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc)
		return NULL;
	dentry->d_op = NFS_PROTO(dir)->dentry_ops;
	inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr);
	if (!inode) {
	if (IS_ERR(inode)) {
		dput(dentry);
		return NULL;
	}
@@ -1134,9 +1134,9 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
		if (error < 0)
			goto out_err;
	}
	error = -ENOMEM;
	inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
	if (inode == NULL)
	error = PTR_ERR(inode);
	if (IS_ERR(inode))
		goto out_err;
	d_instantiate(dentry, inode);
	return 0;
+7 −8
Original line number Diff line number Diff line
@@ -241,7 +241,6 @@ static struct inode *
nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *fsinfo)
{
	struct nfs_server	*server = NFS_SB(sb);
	struct inode *rooti;
	int			error;

	error = server->rpc_ops->getroot(server, rootfh, fsinfo);
@@ -250,10 +249,7 @@ nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *f
		return ERR_PTR(error);
	}

	rooti = nfs_fhget(sb, rootfh, fsinfo->fattr);
	if (!rooti)
		return ERR_PTR(-ENOMEM);
	return rooti;
	return nfs_fhget(sb, rootfh, fsinfo->fattr);
}

/*
@@ -853,7 +849,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
		.fh	= fh,
		.fattr	= fattr
	};
	struct inode *inode = NULL;
	struct inode *inode = ERR_PTR(-ENOENT);
	unsigned long hash;

	if ((fattr->valid & NFS_ATTR_FATTR) == 0)
@@ -866,8 +862,11 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)

	hash = nfs_fattr_to_ino_t(fattr);

	if (!(inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc)))
	inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc);
	if (inode == NULL) {
		inode = ERR_PTR(-ENOMEM);
		goto out_no_inode;
	}

	if (inode->i_state & I_NEW) {
		struct nfs_inode *nfsi = NFS_I(inode);
@@ -936,7 +935,7 @@ out:
	return inode;

out_no_inode:
	printk("nfs_fhget: iget failed\n");
	dprintk("nfs_fhget: iget failed with error %ld\n", PTR_ERR(inode));
	goto out;
}

+1 −1
Original line number Diff line number Diff line
@@ -336,7 +336,7 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data
	if (!(data->f_attr.valid & NFS_ATTR_FATTR))
		goto out;
	inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr);
	if (inode == NULL)
	if (IS_ERR(inode))
		goto out;
	state = nfs4_get_open_state(inode, data->owner);
	if (state == NULL)