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 | |
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>
-rw-r--r-- | fs/nfs/dir.c | 10 | ||||
-rw-r--r-- | fs/nfs/inode.c | 15 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 2 |
3 files changed, 13 insertions, 14 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 609185a15c99..06c48b385c94 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -901,9 +901,9 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru | |||
901 | res = ERR_PTR(error); | 901 | res = ERR_PTR(error); |
902 | goto out_unlock; | 902 | goto out_unlock; |
903 | } | 903 | } |
904 | res = ERR_PTR(-EACCES); | ||
905 | inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr); | 904 | inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr); |
906 | if (!inode) | 905 | res = (struct dentry *)inode; |
906 | if (IS_ERR(res)) | ||
907 | goto out_unlock; | 907 | goto out_unlock; |
908 | no_entry: | 908 | no_entry: |
909 | res = d_add_unique(dentry, inode); | 909 | res = d_add_unique(dentry, inode); |
@@ -1096,7 +1096,7 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) | |||
1096 | return NULL; | 1096 | return NULL; |
1097 | dentry->d_op = NFS_PROTO(dir)->dentry_ops; | 1097 | dentry->d_op = NFS_PROTO(dir)->dentry_ops; |
1098 | inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); | 1098 | inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); |
1099 | if (!inode) { | 1099 | if (IS_ERR(inode)) { |
1100 | dput(dentry); | 1100 | dput(dentry); |
1101 | return NULL; | 1101 | return NULL; |
1102 | } | 1102 | } |
@@ -1134,9 +1134,9 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle, | |||
1134 | if (error < 0) | 1134 | if (error < 0) |
1135 | goto out_err; | 1135 | goto out_err; |
1136 | } | 1136 | } |
1137 | error = -ENOMEM; | ||
1138 | inode = nfs_fhget(dentry->d_sb, fhandle, fattr); | 1137 | inode = nfs_fhget(dentry->d_sb, fhandle, fattr); |
1139 | if (inode == NULL) | 1138 | error = PTR_ERR(inode); |
1139 | if (IS_ERR(inode)) | ||
1140 | goto out_err; | 1140 | goto out_err; |
1141 | d_instantiate(dentry, inode); | 1141 | d_instantiate(dentry, inode); |
1142 | return 0; | 1142 | return 0; |
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 | ||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 31000326aba4..02c7d8c04c58 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -336,7 +336,7 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data | |||
336 | if (!(data->f_attr.valid & NFS_ATTR_FATTR)) | 336 | if (!(data->f_attr.valid & NFS_ATTR_FATTR)) |
337 | goto out; | 337 | goto out; |
338 | inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr); | 338 | inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr); |
339 | if (inode == NULL) | 339 | if (IS_ERR(inode)) |
340 | goto out; | 340 | goto out; |
341 | state = nfs4_get_open_state(inode, data->owner); | 341 | state = nfs4_get_open_state(inode, data->owner); |
342 | if (state == NULL) | 342 | if (state == NULL) |