diff options
Diffstat (limited to 'sys/nfs4client/nfs4_socket.c')
-rw-r--r-- | sys/nfs4client/nfs4_socket.c | 118 |
1 files changed, 65 insertions, 53 deletions
diff --git a/sys/nfs4client/nfs4_socket.c b/sys/nfs4client/nfs4_socket.c index f997d52..0fb1237 100644 --- a/sys/nfs4client/nfs4_socket.c +++ b/sys/nfs4client/nfs4_socket.c @@ -113,6 +113,62 @@ static struct rpc_program nfs_program = { #endif +static struct { + short nfserr; + short syserr; +} nfs_errtbl[] = { + { NFS_OK, 0 }, + { NFSERR_PERM, EPERM }, + { NFSERR_NOENT, ENOENT }, + { NFSERR_IO, EIO }, + { NFSERR_NXIO, ENXIO }, + { NFSERR_ACCES, EACCES }, + { NFSERR_EXIST, EEXIST }, + { NFSERR_XDEV, EXDEV }, + { NFSERR_MLINK, EMLINK }, + { 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_NAMETOL, ENAMETOOLONG }, + { NFSERR_NOTEMPTY, ENOTEMPTY }, + { NFSERR_NOTSUPP, EOPNOTSUPP }, +#ifdef EDQUOT + { NFSERR_DQUOT, EDQUOT }, +#endif + { NFSERR_STALE, ESTALE }, + { NFSERR_DENIED, EAGAIN }, + { NFSERR_SYMLINK, ELOOP }, + { NFSERR_BADXDR, EBADRPC }, + { NFSERR_WRONGSEC, EPERM }, + { -1, EIO } +}; + +static int +nfs4_nfserr_to_syserr(int nfserr) +{ + int i, syserr; + + /* XXX : not the optimal algorithm, but will do for now! */ + for (i = 0; nfs_errtbl[i].nfserr != -1; i++) { + if (nfs_errtbl[i].nfserr == nfserr) + break; + } +#ifdef NFS4_MAP_UNKNOWN_ERR + syserr = nfs_errtbl[i].syserr; +#else + if (nfs_errtbl[i].nfserr != -1) + syserr = nfs_errtbl[i].syserr; + else + syserr = nfserr; +#endif + return syserr; +} + int nfs4_connect(struct nfsmount *nmp) { @@ -198,61 +254,17 @@ nfs4_request(struct vnode *vp, struct mbuf *mrest, int procnum, struct mbuf **mdp, caddr_t *dposp) { int error; - u_int32_t *tl; - struct nfsmount * nmp = VFSTONFS(vp->v_mount); - struct rpcclnt * clnt = &nmp->nm_rpcclnt; - struct mbuf *md, *mrep; - caddr_t dpos; - struct rpc_reply reply; - if ((error = rpcclnt_request(clnt, mrest, procnum, td, cred, - &reply)) != 0) { - goto out; - } - - /* XXX: don't free mrest if an error occured, to allow caller to retry*/ - m_freem(mrest); - mrep = reply.mrep; - md = reply.result_md; - dpos = reply.result_dpos; - - tl = nfsm_dissect(u_int32_t *, NFSX_UNSIGNED); - if (*tl != 0) { - error = fxdr_unsigned(int, *tl); + error = nfs4_request_mnt(VFSTONFS(vp->v_mount), mrest, procnum, + td, cred, mrp, mdp, dposp); - #if 0 - if ((nmp->nm_flag & NFSMNT_NFSV3) && - error == NFSERR_TRYLATER) { - m_freem(mrep); - error = 0; - waituntil = time_second + trylater_delay; - while (time_second < waituntil) - (void) tsleep(&lbolt, PSOCK, "nqnfstry", 0); - trylater_delay *= nfs_backoff[trylater_cnt]; - if (trylater_cnt < NFS_NBACKOFF - 1) - trylater_cnt++; - goto tryagain; - } - #endif - - /* - ** If the File Handle was stale, invalidate the - ** lookup cache, just in case. - **/ - if (error == ESTALE) - cache_purge(vp); - goto out; - } + /* + ** If the File Handle was stale, invalidate the + ** lookup cache, just in case. + **/ + if (error == ESTALE) + cache_purge(vp); - *mrp = mrep; - *mdp = md; - *dposp = dpos; - return (0); -nfsmout: -out: - m_freem(reply.mrep); - *mrp = NULL; - *mdp = NULL; return (error); } @@ -309,7 +321,7 @@ out: m_freem(reply.mrep); *mrp = NULL; *mdp = NULL; - return (error); + return (nfs4_nfserr_to_syserr(error)); } |