diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-03-20 13:44:48 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-03-20 13:44:48 -0500 |
commit | 03f28e3a2059fc466761d872122f30acb7be61ae (patch) | |
tree | d478e553b79520c34bb3d06e75b59609de2993f4 /fs/nfs/inode.c | |
parent | 01d0ae8beaee75d954900109619b700fe68707d9 (diff) |
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>
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r-- | fs/nfs/inode.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 17654bffc3c6..a0cda53461b3 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -241,7 +241,6 @@ static struct inode * | |||
241 | nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *fsinfo) | 241 | nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *fsinfo) |
242 | { | 242 | { |
243 | struct nfs_server *server = NFS_SB(sb); | 243 | struct nfs_server *server = NFS_SB(sb); |
244 | struct inode *rooti; | ||
245 | int error; | 244 | int error; |
246 | 245 | ||
247 | error = server->rpc_ops->getroot(server, rootfh, fsinfo); | 246 | 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 | |||
250 | return ERR_PTR(error); | 249 | return ERR_PTR(error); |
251 | } | 250 | } |
252 | 251 | ||
253 | rooti = nfs_fhget(sb, rootfh, fsinfo->fattr); | 252 | return nfs_fhget(sb, rootfh, fsinfo->fattr); |
254 | if (!rooti) | ||
255 | return ERR_PTR(-ENOMEM); | ||
256 | return rooti; | ||
257 | } | 253 | } |
258 | 254 | ||
259 | /* | 255 | /* |
@@ -853,7 +849,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) | |||
853 | .fh = fh, | 849 | .fh = fh, |
854 | .fattr = fattr | 850 | .fattr = fattr |
855 | }; | 851 | }; |
856 | struct inode *inode = NULL; | 852 | struct inode *inode = ERR_PTR(-ENOENT); |
857 | unsigned long hash; | 853 | unsigned long hash; |
858 | 854 | ||
859 | if ((fattr->valid & NFS_ATTR_FATTR) == 0) | 855 | 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) | |||
866 | 862 | ||
867 | hash = nfs_fattr_to_ino_t(fattr); | 863 | hash = nfs_fattr_to_ino_t(fattr); |
868 | 864 | ||
869 | if (!(inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc))) | 865 | inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc); |
866 | if (inode == NULL) { | ||
867 | inode = ERR_PTR(-ENOMEM); | ||
870 | goto out_no_inode; | 868 | goto out_no_inode; |
869 | } | ||
871 | 870 | ||
872 | if (inode->i_state & I_NEW) { | 871 | if (inode->i_state & I_NEW) { |
873 | struct nfs_inode *nfsi = NFS_I(inode); | 872 | struct nfs_inode *nfsi = NFS_I(inode); |
@@ -936,7 +935,7 @@ out: | |||
936 | return inode; | 935 | return inode; |
937 | 936 | ||
938 | out_no_inode: | 937 | out_no_inode: |
939 | printk("nfs_fhget: iget failed\n"); | 938 | dprintk("nfs_fhget: iget failed with error %ld\n", PTR_ERR(inode)); |
940 | goto out; | 939 | goto out; |
941 | } | 940 | } |
942 | 941 | ||