|
@@ -86,6 +86,8 @@
|
|
|
XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
|
|
|
#define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz)
|
|
|
|
|
|
+static int nfs3_stat_to_errno(enum nfs_stat);
|
|
|
+
|
|
|
/*
|
|
|
* Map file type to S_IFMT bits
|
|
|
*/
|
|
@@ -1388,7 +1390,7 @@ static int nfs3_xdr_dec_getattr3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_default:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1427,7 +1429,7 @@ static int nfs3_xdr_dec_setattr3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1475,7 +1477,7 @@ out_default:
|
|
|
error = decode_post_op_attr(xdr, result->dir_attr);
|
|
|
if (unlikely(error))
|
|
|
goto out;
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1516,7 +1518,7 @@ static int nfs3_xdr_dec_access3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_default:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1557,7 +1559,7 @@ static int nfs3_xdr_dec_readlink3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_default:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1639,7 +1641,7 @@ static int nfs3_xdr_dec_read3res(struct rpc_rqst *req, struct xdr_stream *xdr,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1709,7 +1711,7 @@ static int nfs3_xdr_dec_write3res(struct rpc_rqst *req, struct xdr_stream *xdr,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1773,7 +1775,7 @@ out_default:
|
|
|
error = decode_wcc_data(xdr, result->dir_attr);
|
|
|
if (unlikely(error))
|
|
|
goto out;
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1812,7 +1814,7 @@ static int nfs3_xdr_dec_remove3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1856,7 +1858,7 @@ static int nfs3_xdr_dec_rename3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1899,7 +1901,7 @@ static int nfs3_xdr_dec_link3res(struct rpc_rqst *req, struct xdr_stream *xdr,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -2091,7 +2093,7 @@ out_default:
|
|
|
error = decode_post_op_attr(xdr, result->dir_attr);
|
|
|
if (unlikely(error))
|
|
|
goto out;
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2159,7 +2161,7 @@ static int nfs3_xdr_dec_fsstat3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2235,7 +2237,7 @@ static int nfs3_xdr_dec_fsinfo3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2298,7 +2300,7 @@ static int nfs3_xdr_dec_pathconf3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2339,7 +2341,7 @@ static int nfs3_xdr_dec_commit3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_status:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_NFS_V3_ACL
|
|
@@ -2404,7 +2406,7 @@ static int nfs3_xdr_dec_getacl3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_default:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req,
|
|
@@ -2423,11 +2425,76 @@ static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req,
|
|
|
out:
|
|
|
return error;
|
|
|
out_default:
|
|
|
- return nfs_stat_to_errno(status);
|
|
|
+ return nfs3_stat_to_errno(status);
|
|
|
}
|
|
|
|
|
|
#endif /* CONFIG_NFS_V3_ACL */
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * We need to translate between nfs status return values and
|
|
|
+ * the local errno values which may not be the same.
|
|
|
+ */
|
|
|
+static const struct {
|
|
|
+ int stat;
|
|
|
+ int errno;
|
|
|
+} nfs_errtbl[] = {
|
|
|
+ { NFS_OK, 0 },
|
|
|
+ { NFSERR_PERM, -EPERM },
|
|
|
+ { NFSERR_NOENT, -ENOENT },
|
|
|
+ { NFSERR_IO, -errno_NFSERR_IO},
|
|
|
+ { NFSERR_NXIO, -ENXIO },
|
|
|
+/* { NFSERR_EAGAIN, -EAGAIN }, */
|
|
|
+ { NFSERR_ACCES, -EACCES },
|
|
|
+ { NFSERR_EXIST, -EEXIST },
|
|
|
+ { NFSERR_XDEV, -EXDEV },
|
|
|
+ { NFSERR_NODEV, -ENODEV },
|
|
|
+ { NFSERR_NOTDIR, -ENOTDIR },
|
|
|
+ { NFSERR_ISDIR, -EISDIR },
|
|
|
+ { NFSERR_INVAL, -EINVAL },
|
|
|
+ { NFSERR_FBIG, -EFBIG },
|
|
|
+ { NFSERR_NOSPC, -ENOSPC },
|
|
|
+ { NFSERR_ROFS, -EROFS },
|
|
|
+ { NFSERR_MLINK, -EMLINK },
|
|
|
+ { NFSERR_NAMETOOLONG, -ENAMETOOLONG },
|
|
|
+ { NFSERR_NOTEMPTY, -ENOTEMPTY },
|
|
|
+ { NFSERR_DQUOT, -EDQUOT },
|
|
|
+ { NFSERR_STALE, -ESTALE },
|
|
|
+ { NFSERR_REMOTE, -EREMOTE },
|
|
|
+#ifdef EWFLUSH
|
|
|
+ { NFSERR_WFLUSH, -EWFLUSH },
|
|
|
+#endif
|
|
|
+ { NFSERR_BADHANDLE, -EBADHANDLE },
|
|
|
+ { NFSERR_NOT_SYNC, -ENOTSYNC },
|
|
|
+ { NFSERR_BAD_COOKIE, -EBADCOOKIE },
|
|
|
+ { NFSERR_NOTSUPP, -ENOTSUPP },
|
|
|
+ { NFSERR_TOOSMALL, -ETOOSMALL },
|
|
|
+ { NFSERR_SERVERFAULT, -EREMOTEIO },
|
|
|
+ { NFSERR_BADTYPE, -EBADTYPE },
|
|
|
+ { NFSERR_JUKEBOX, -EJUKEBOX },
|
|
|
+ { -1, -EIO }
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * nfs3_stat_to_errno - convert an NFS status code to a local errno
|
|
|
+ * @status: NFS status code to convert
|
|
|
+ *
|
|
|
+ * Returns a local errno value, or -EIO if the NFS status code is
|
|
|
+ * not recognized. This function is used jointly by NFSv2 and NFSv3.
|
|
|
+ */
|
|
|
+static int nfs3_stat_to_errno(enum nfs_stat status)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; nfs_errtbl[i].stat != -1; i++) {
|
|
|
+ if (nfs_errtbl[i].stat == (int)status)
|
|
|
+ return nfs_errtbl[i].errno;
|
|
|
+ }
|
|
|
+ dprintk("NFS: Unrecognized nfs status value: %u\n", status);
|
|
|
+ return nfs_errtbl[i].errno;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
#define PROC(proc, argtype, restype, timer) \
|
|
|
[NFS3PROC_##proc] = { \
|
|
|
.p_proc = NFS3PROC_##proc, \
|