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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user