Commit 5e7e5a0d authored by Bryan Schumaker's avatar Bryan Schumaker Committed by Trond Myklebust
Browse files

NFS: Create an NFS v3 stat_to_errno()



In theory, NFS v3 can have different error versions than NFS v2. v4 is
already using its own nfs4_stat_to_errno() to map error codes, so
rather than create something in the generic client for v2 and v3 to
share I instead give v3 its own function.

Signed-off-by: default avatarBryan Schumaker <bjschuma@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 87c7083d
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -208,7 +208,6 @@ extern void nfs_pgheader_init(struct nfs_pageio_descriptor *desc,
void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos);
void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos);


/* nfs2xdr.c */
/* nfs2xdr.c */
extern int nfs_stat_to_errno(enum nfs_stat);
extern struct rpc_procinfo nfs_procedures[];
extern struct rpc_procinfo nfs_procedures[];
extern int nfs2_decode_dirent(struct xdr_stream *,
extern int nfs2_decode_dirent(struct xdr_stream *,
				struct nfs_entry *, int);
				struct nfs_entry *, int);
+2 −1
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@
#define NFS_readdirres_sz	(1)
#define NFS_readdirres_sz	(1)
#define NFS_statfsres_sz	(1+NFS_info_sz)
#define NFS_statfsres_sz	(1+NFS_info_sz)


static int nfs_stat_to_errno(enum nfs_stat);


/*
/*
 * While encoding arguments, set up the reply buffer in advance to
 * While encoding arguments, set up the reply buffer in advance to
@@ -1111,7 +1112,7 @@ static const struct {
 * Returns a local errno value, or -EIO if the NFS status code is
 * Returns a local errno value, or -EIO if the NFS status code is
 * not recognized.  This function is used jointly by NFSv2 and NFSv3.
 * not recognized.  This function is used jointly by NFSv2 and NFSv3.
 */
 */
int nfs_stat_to_errno(enum nfs_stat status)
static int nfs_stat_to_errno(enum nfs_stat status)
{
{
	int i;
	int i;


+85 −18
Original line number Original line Diff line number Diff line
@@ -86,6 +86,8 @@
				XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
				XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
#define ACL3_setaclres_sz	(1+NFS3_post_op_attr_sz)
#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
 * Map file type to S_IFMT bits
 */
 */
@@ -1388,7 +1390,7 @@ static int nfs3_xdr_dec_getattr3res(struct rpc_rqst *req,
out:
out:
	return error;
	return error;
out_default:
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:
out:
	return error;
	return error;
out_status:
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);
	error = decode_post_op_attr(xdr, result->dir_attr);
	if (unlikely(error))
	if (unlikely(error))
		goto out;
		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:
out:
	return error;
	return error;
out_default:
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:
out:
	return error;
	return error;
out_default:
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:
out:
	return error;
	return error;
out_status:
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:
out:
	return error;
	return error;
out_status:
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);
	error = decode_wcc_data(xdr, result->dir_attr);
	if (unlikely(error))
	if (unlikely(error))
		goto out;
		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:
out:
	return error;
	return error;
out_status:
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:
out:
	return error;
	return error;
out_status:
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:
out:
	return error;
	return error;
out_status:
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);
	error = decode_post_op_attr(xdr, result->dir_attr);
	if (unlikely(error))
	if (unlikely(error))
		goto out;
		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:
out:
	return error;
	return error;
out_status:
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:
out:
	return error;
	return error;
out_status:
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:
out:
	return error;
	return error;
out_status:
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:
out:
	return error;
	return error;
out_status:
out_status:
	return nfs_stat_to_errno(status);
	return nfs3_stat_to_errno(status);
}
}


#ifdef CONFIG_NFS_V3_ACL
#ifdef CONFIG_NFS_V3_ACL
@@ -2404,7 +2406,7 @@ static int nfs3_xdr_dec_getacl3res(struct rpc_rqst *req,
out:
out:
	return error;
	return error;
out_default:
out_default:
	return nfs_stat_to_errno(status);
	return nfs3_stat_to_errno(status);
}
}


static int nfs3_xdr_dec_setacl3res(struct rpc_rqst *req,
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:
out:
	return error;
	return error;
out_default:
out_default:
	return nfs_stat_to_errno(status);
	return nfs3_stat_to_errno(status);
}
}


#endif  /* CONFIG_NFS_V3_ACL */
#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)				\
#define PROC(proc, argtype, restype, timer)				\
[NFS3PROC_##proc] = {							\
[NFS3PROC_##proc] = {							\
	.p_proc      = NFS3PROC_##proc,					\
	.p_proc      = NFS3PROC_##proc,					\