Decontext-alize the nfsserver module.
Now, only some few places still require thread passing (mostly the ones which access to VOP_* functions) and will be fixed once the primitive also will be. Tested by: Giovanni Trematerra <giovanni dot trematerra at gmail dot com>
This commit is contained in:
parent
2f23d207d3
commit
a9873f87a6
@ -155,8 +155,7 @@ extern u_int32_t nfsrv_rpc_auth_unix, nfsrv_rpc_msgaccepted, nfsrv_rpc_call,
|
||||
extern const int nfsrvv2_procid[NFS_NPROCS];
|
||||
extern const int nfsrv_nfsv3_procid[NFS_NPROCS];
|
||||
extern int32_t (*nfsrv3_procs[NFS_NPROCS])(struct nfsrv_descript *nd,
|
||||
struct nfssvc_sock *slp, struct thread *td,
|
||||
struct mbuf **mreqp);
|
||||
struct nfssvc_sock *slp, struct mbuf **mreqp);
|
||||
|
||||
/*
|
||||
* A list of nfssvc_sock structures is maintained with all the sockets
|
||||
@ -225,7 +224,6 @@ struct nfsd {
|
||||
u_char nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
|
||||
int nfsd_verflen; /* and the Verifier */
|
||||
u_char nfsd_verfstr[RPCVERF_MAXSIZ];
|
||||
struct thread *nfsd_td; /* daemon thread ptr */
|
||||
struct nfsrv_descript *nfsd_nd; /* Associated nfsrv_descript */
|
||||
};
|
||||
|
||||
@ -332,8 +330,7 @@ void nfsm_srvpostopattr(struct nfsrv_descript *, int, struct vattr *,
|
||||
int netaddr_match(int, union nethostaddr *, struct sockaddr *);
|
||||
int nfs_namei(struct nameidata *, fhandle_t *, int,
|
||||
struct nfssvc_sock *, struct sockaddr *, struct mbuf **,
|
||||
caddr_t *, struct vnode **, int, struct vattr *, int *,
|
||||
struct thread *, int);
|
||||
caddr_t *, struct vnode **, int, struct vattr *, int *, int);
|
||||
void nfsm_adj(struct mbuf *, int, int);
|
||||
int nfsm_mbuftouio(struct mbuf **, struct uio *, int, caddr_t *);
|
||||
void nfsrv_initcache(void);
|
||||
@ -349,59 +346,59 @@ int nfsrv_errmap(struct nfsrv_descript *, int);
|
||||
void nfsrvw_sort(gid_t *, int);
|
||||
void nfsrv_wakenfsd(struct nfssvc_sock *slp);
|
||||
int nfsrv_writegather(struct nfsrv_descript **, struct nfssvc_sock *,
|
||||
struct thread *, struct mbuf **);
|
||||
struct mbuf **);
|
||||
|
||||
int nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_fhtovp(fhandle_t *, int, struct vnode **, int *, struct ucred *,
|
||||
struct nfssvc_sock *, struct sockaddr *, int *, int);
|
||||
int nfsrv_setpublicfs(struct mount *, struct netexport *,
|
||||
struct export_args *);
|
||||
int nfs_ispublicfh(fhandle_t *);
|
||||
int nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
int nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq);
|
||||
struct mbuf **mrq);
|
||||
void nfsrv_rcv(struct socket *so, void *arg, int waitflag);
|
||||
void nfsrv_slpderef(struct nfssvc_sock *slp);
|
||||
#endif /* _KERNEL */
|
||||
|
@ -138,8 +138,7 @@ struct nfsrvstats nfsrvstats;
|
||||
SYSCTL_STRUCT(_vfs_nfsrv, NFS_NFSRVSTATS, nfsrvstats, CTLFLAG_RW,
|
||||
&nfsrvstats, nfsrvstats, "S,nfsrvstats");
|
||||
|
||||
static int nfsrv_access(struct vnode *, int, struct ucred *, int,
|
||||
struct thread *, int);
|
||||
static int nfsrv_access(struct vnode *, int, struct ucred *, int, int);
|
||||
static void nfsrvw_coalesce(struct nfsrv_descript *,
|
||||
struct nfsrv_descript *);
|
||||
|
||||
@ -189,7 +188,7 @@ nfsrv_lockedpair_nd(int vfs1, struct nameidata *nd)
|
||||
*/
|
||||
int
|
||||
nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -224,7 +223,7 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
}
|
||||
nfsmode = fxdr_unsigned(u_int32_t, *tl);
|
||||
if ((nfsmode & NFSV3ACCESS_READ) &&
|
||||
nfsrv_access(vp, VREAD, cred, rdonly, td, 0))
|
||||
nfsrv_access(vp, VREAD, cred, rdonly, 0))
|
||||
nfsmode &= ~NFSV3ACCESS_READ;
|
||||
if (vp->v_type == VDIR)
|
||||
testmode = (NFSV3ACCESS_MODIFY | NFSV3ACCESS_EXTEND |
|
||||
@ -232,14 +231,14 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
else
|
||||
testmode = (NFSV3ACCESS_MODIFY | NFSV3ACCESS_EXTEND);
|
||||
if ((nfsmode & testmode) &&
|
||||
nfsrv_access(vp, VWRITE, cred, rdonly, td, 0))
|
||||
nfsrv_access(vp, VWRITE, cred, rdonly, 0))
|
||||
nfsmode &= ~testmode;
|
||||
if (vp->v_type == VDIR)
|
||||
testmode = NFSV3ACCESS_LOOKUP;
|
||||
else
|
||||
testmode = NFSV3ACCESS_EXECUTE;
|
||||
if ((nfsmode & testmode) &&
|
||||
nfsrv_access(vp, VEXEC, cred, rdonly, td, 0))
|
||||
nfsrv_access(vp, VEXEC, cred, rdonly, 0))
|
||||
nfsmode &= ~testmode;
|
||||
getret = VOP_GETATTR(vp, vap, cred);
|
||||
vput(vp);
|
||||
@ -260,7 +259,7 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -313,7 +312,7 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -435,7 +434,7 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
error = EISDIR;
|
||||
goto out;
|
||||
} else if ((error = nfsrv_access(vp, VWRITE, cred, rdonly,
|
||||
td, 0)) != 0)
|
||||
0)) != 0)
|
||||
goto out;
|
||||
}
|
||||
error = VOP_SETATTR(vp, vap, cred);
|
||||
@ -471,7 +470,7 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -504,7 +503,7 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_nameiop = LOOKUP;
|
||||
nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART | MPSAFE;
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirattr, &dirattr_ret, td, pubflag);
|
||||
&dirp, v3, &dirattr, &dirattr_ret, pubflag);
|
||||
vfslocked = NDHASGIANT(&nd);
|
||||
|
||||
/*
|
||||
@ -655,7 +654,7 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -762,7 +761,7 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -827,10 +826,8 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
error = (vp->v_type == VDIR) ? EISDIR : EACCES;
|
||||
}
|
||||
if (!error) {
|
||||
if ((error = nfsrv_access(vp, VREAD, cred, rdonly,
|
||||
td, 1)) != 0)
|
||||
error = nfsrv_access(vp, VEXEC, cred,
|
||||
rdonly, td, 1);
|
||||
if ((error = nfsrv_access(vp, VREAD, cred, rdonly, 1)) != 0)
|
||||
error = nfsrv_access(vp, VEXEC, cred, rdonly, 1);
|
||||
}
|
||||
getret = VOP_GETATTR(vp, vap, cred);
|
||||
if (!error)
|
||||
@ -1014,7 +1011,7 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -1132,7 +1129,7 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
error = (vp->v_type == VDIR) ? EISDIR : EACCES;
|
||||
}
|
||||
if (!error)
|
||||
error = nfsrv_access(vp, VWRITE, cred, rdonly, td, 1);
|
||||
error = nfsrv_access(vp, VWRITE, cred, rdonly, 1);
|
||||
if (error) {
|
||||
vput(vp);
|
||||
vp = NULL;
|
||||
@ -1258,7 +1255,7 @@ nfsrv_samecred(struct ucred *cr1, struct ucred *cr2)
|
||||
*/
|
||||
int
|
||||
nfsrv_writegather(struct nfsrv_descript **ndp, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct iovec *ivp;
|
||||
struct mbuf *mp;
|
||||
@ -1447,8 +1444,7 @@ nfsrv_writegather(struct nfsrv_descript **ndp, struct nfssvc_sock *slp,
|
||||
vp = NULL;
|
||||
}
|
||||
if (!error)
|
||||
error = nfsrv_access(vp, VWRITE, cred, rdonly,
|
||||
td, 1);
|
||||
error = nfsrv_access(vp, VWRITE, cred, rdonly, 1);
|
||||
if (nfsd->nd_stable == NFSV3WRITE_UNSTABLE)
|
||||
ioflags = IO_NODELOCKED;
|
||||
else if (nfsd->nd_stable == NFSV3WRITE_DATASYNC)
|
||||
@ -1641,7 +1637,7 @@ nfsrvw_coalesce(struct nfsrv_descript *owp, struct nfsrv_descript *nfsd)
|
||||
*/
|
||||
int
|
||||
nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -1699,7 +1695,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
* prior to calling nfsm_reply ( which might goto nfsmout ).
|
||||
*/
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (dirp && !v3) {
|
||||
vrele(dirp);
|
||||
@ -1831,7 +1827,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
nd.ni_cnd.cn_nameiop = LOOKUP;
|
||||
nd.ni_cnd.cn_flags &= ~(LOCKPARENT);
|
||||
nd.ni_cnd.cn_thread = td;
|
||||
nd.ni_cnd.cn_thread = curthread;
|
||||
nd.ni_cnd.cn_cred = cred;
|
||||
tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount);
|
||||
if (tvfslocked)
|
||||
@ -1853,7 +1849,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
} else {
|
||||
if (vap->va_size != -1) {
|
||||
error = nfsrv_access(nd.ni_vp, VWRITE,
|
||||
cred, (nd.ni_cnd.cn_flags & RDONLY), td, 0);
|
||||
cred, (nd.ni_cnd.cn_flags & RDONLY), 0);
|
||||
if (!error) {
|
||||
tempsize = vap->va_size;
|
||||
VATTR_NULL(vap);
|
||||
@ -1936,7 +1932,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -1944,6 +1940,7 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct ucred *cred = nfsd->nd_cr;
|
||||
struct vattr va, dirfor, diraft;
|
||||
struct vattr *vap = &va;
|
||||
struct thread *td = curthread;
|
||||
u_int32_t *tl;
|
||||
struct nameidata nd;
|
||||
caddr_t bpos;
|
||||
@ -1987,7 +1984,7 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (error) {
|
||||
nfsm_reply(NFSX_WCCDATA(1));
|
||||
@ -2131,7 +2128,7 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -2168,7 +2165,7 @@ nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_nameiop = DELETE;
|
||||
nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | MPSAFE;
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (dirp && !v3) {
|
||||
vrele(dirp);
|
||||
@ -2241,7 +2238,7 @@ nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -2295,7 +2292,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
fromnd.ni_cnd.cn_nameiop = DELETE;
|
||||
fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART | MPSAFE;
|
||||
error = nfs_namei(&fromnd, ffhp, len, slp, nam, &md,
|
||||
&dpos, &fdirp, v3, &fdirfor, &fdirfor_ret, td, FALSE);
|
||||
&dpos, &fdirp, v3, &fdirfor, &fdirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &fromnd);
|
||||
if (fdirp && !v3) {
|
||||
vrele(fdirp);
|
||||
@ -2318,7 +2315,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
tond.ni_cnd.cn_nameiop = RENAME;
|
||||
tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART | MPSAFE;
|
||||
error = nfs_namei(&tond, tfhp, len2, slp, nam, &md,
|
||||
&dpos, &tdirp, v3, &tdirfor, &tdirfor_ret, td, FALSE);
|
||||
&dpos, &tdirp, v3, &tdirfor, &tdirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &tond);
|
||||
if (tdirp && !v3) {
|
||||
vrele(tdirp);
|
||||
@ -2474,7 +2471,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -2534,7 +2531,7 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_nameiop = CREATE;
|
||||
nd.ni_cnd.cn_flags = LOCKPARENT | MPSAFE | MPSAFE;
|
||||
error = nfs_namei(&nd, dfhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (dirp && !v3) {
|
||||
vrele(dirp);
|
||||
@ -2622,7 +2619,7 @@ nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -2663,7 +2660,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_nameiop = CREATE;
|
||||
nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART | MPSAFE;
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (error == 0) {
|
||||
VATTR_NULL(vap);
|
||||
@ -2728,7 +2725,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_nameiop = LOOKUP;
|
||||
nd.ni_cnd.cn_flags &= ~(LOCKPARENT | FOLLOW);
|
||||
nd.ni_cnd.cn_flags |= (NOFOLLOW | LOCKLEAF);
|
||||
nd.ni_cnd.cn_thread = td;
|
||||
nd.ni_cnd.cn_thread = curthread;
|
||||
nd.ni_cnd.cn_cred = cred;
|
||||
tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount);
|
||||
if (tvfslocked)
|
||||
@ -2805,7 +2802,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -2846,7 +2843,7 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_flags = LOCKPARENT | MPSAFE;
|
||||
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (dirp && !v3) {
|
||||
vrele(dirp);
|
||||
@ -2968,7 +2965,7 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -3004,7 +3001,7 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
nd.ni_cnd.cn_nameiop = DELETE;
|
||||
nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | MPSAFE;
|
||||
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
|
||||
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
|
||||
&dirp, v3, &dirfor, &dirfor_ret, FALSE);
|
||||
vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
|
||||
if (dirp && !v3) {
|
||||
vrele(dirp);
|
||||
@ -3127,7 +3124,7 @@ struct flrep {
|
||||
|
||||
int
|
||||
nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -3207,7 +3204,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
#endif
|
||||
}
|
||||
if (!error)
|
||||
error = nfsrv_access(vp, VEXEC, cred, rdonly, td, 0);
|
||||
error = nfsrv_access(vp, VEXEC, cred, rdonly, 0);
|
||||
if (error) {
|
||||
vput(vp);
|
||||
vp = NULL;
|
||||
@ -3422,7 +3419,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
|
||||
int
|
||||
nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -3494,7 +3491,7 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
error = NFSERR_BAD_COOKIE;
|
||||
#endif
|
||||
if (!error)
|
||||
error = nfsrv_access(vp, VEXEC, cred, rdonly, td, 0);
|
||||
error = nfsrv_access(vp, VEXEC, cred, rdonly, 0);
|
||||
if (error) {
|
||||
vput(vp);
|
||||
vp = NULL;
|
||||
@ -3771,7 +3768,7 @@ nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -3834,7 +3831,7 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
vm_object_page_clean(vp->v_object, 0, 0, OBJPC_SYNC);
|
||||
VM_OBJECT_UNLOCK(vp->v_object);
|
||||
}
|
||||
error = VOP_FSYNC(vp, MNT_WAIT, td);
|
||||
error = VOP_FSYNC(vp, MNT_WAIT, curthread);
|
||||
} else {
|
||||
/*
|
||||
* Locate and synchronously write any buffers that fall
|
||||
@ -3934,7 +3931,7 @@ nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -3968,7 +3965,7 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
goto nfsmout;
|
||||
}
|
||||
sf = &statfs;
|
||||
error = VFS_STATFS(vp->v_mount, sf, td);
|
||||
error = VFS_STATFS(vp->v_mount, sf, curthread);
|
||||
getret = VOP_GETATTR(vp, &at, cred);
|
||||
vput(vp);
|
||||
vp = NULL;
|
||||
@ -4028,7 +4025,7 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -4063,7 +4060,7 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
}
|
||||
|
||||
/* XXX Try to make a guess on the max file size. */
|
||||
VFS_STATFS(vp->v_mount, &sb, td);
|
||||
VFS_STATFS(vp->v_mount, &sb, curthread);
|
||||
maxfsize = (u_quad_t)0x80000000 * sb.f_bsize - 1;
|
||||
|
||||
getret = VOP_GETATTR(vp, &at, cred);
|
||||
@ -4107,7 +4104,7 @@ nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
*/
|
||||
int
|
||||
nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;
|
||||
struct sockaddr *nam = nfsd->nd_nam;
|
||||
@ -4182,7 +4179,7 @@ nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
/* ARGSUSED */
|
||||
int
|
||||
nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep;
|
||||
caddr_t bpos;
|
||||
@ -4201,7 +4198,7 @@ nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
/* ARGSUSED */
|
||||
int
|
||||
nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
struct thread *td, struct mbuf **mrq)
|
||||
struct mbuf **mrq)
|
||||
{
|
||||
struct mbuf *mrep = nfsd->nd_mrep;
|
||||
caddr_t bpos;
|
||||
@ -4235,8 +4232,8 @@ nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
|
||||
* will return EPERM instead of EACCESS. EPERM is always an error.
|
||||
*/
|
||||
static int
|
||||
nfsrv_access(struct vnode *vp, int flags, struct ucred *cred,
|
||||
int rdonly, struct thread *td, int override)
|
||||
nfsrv_access(struct vnode *vp, int flags, struct ucred *cred, int rdonly,
|
||||
int override)
|
||||
{
|
||||
struct vattr vattr;
|
||||
int error;
|
||||
@ -4273,7 +4270,7 @@ nfsrv_access(struct vnode *vp, int flags, struct ucred *cred,
|
||||
error = VOP_GETATTR(vp, &vattr, cred);
|
||||
if (error)
|
||||
return (error);
|
||||
error = VOP_ACCESS(vp, flags, cred, td);
|
||||
error = VOP_ACCESS(vp, flags, cred, curthread);
|
||||
/*
|
||||
* Allow certain operations for the owner (reads and writes
|
||||
* on files that are already open).
|
||||
|
@ -104,7 +104,6 @@ static int nfsrv_getstream(struct nfssvc_sock *, int);
|
||||
|
||||
int32_t (*nfsrv3_procs[NFS_NPROCS])(struct nfsrv_descript *nd,
|
||||
struct nfssvc_sock *slp,
|
||||
struct thread *td,
|
||||
struct mbuf **mreqp) = {
|
||||
nfsrv_null,
|
||||
nfsrv_getattr,
|
||||
|
@ -607,7 +607,7 @@ int
|
||||
nfs_namei(struct nameidata *ndp, fhandle_t *fhp, int len,
|
||||
struct nfssvc_sock *slp, struct sockaddr *nam, struct mbuf **mdp,
|
||||
caddr_t *dposp, struct vnode **retdirp, int v3, struct vattr *retdirattrp,
|
||||
int *retdirattr_retp, struct thread *td, int pubflag)
|
||||
int *retdirattr_retp, int pubflag)
|
||||
{
|
||||
int i, rem;
|
||||
struct mbuf *md;
|
||||
@ -765,7 +765,7 @@ nfs_namei(struct nameidata *ndp, fhandle_t *fhp, int len,
|
||||
* because lookup() will dereference ni_startdir.
|
||||
*/
|
||||
|
||||
cnp->cn_thread = td;
|
||||
cnp->cn_thread = curthread;
|
||||
VREF(dp);
|
||||
ndp->ni_startdir = dp;
|
||||
|
||||
|
@ -95,10 +95,9 @@ SYSCTL_INT(_vfs_nfsrv, OID_AUTO, gatherdelay, CTLFLAG_RW,
|
||||
SYSCTL_INT(_vfs_nfsrv, OID_AUTO, gatherdelay_v3, CTLFLAG_RW,
|
||||
&nfsrvw_procrastinate_v3, 0, "");
|
||||
|
||||
static int nfssvc_addsock(struct file *, struct sockaddr *,
|
||||
struct thread *);
|
||||
static int nfssvc_addsock(struct file *, struct sockaddr *);
|
||||
static void nfsrv_zapsock(struct nfssvc_sock *slp);
|
||||
static int nfssvc_nfsd(struct thread *);
|
||||
static int nfssvc_nfsd(void);
|
||||
|
||||
extern u_long sb_max_adj;
|
||||
|
||||
@ -166,10 +165,10 @@ nfssvc(struct thread *td, struct nfssvc_args *uap)
|
||||
return (error);
|
||||
}
|
||||
}
|
||||
error = nfssvc_addsock(fp, nam, td);
|
||||
error = nfssvc_addsock(fp, nam);
|
||||
fdrop(fp, td);
|
||||
} else if (uap->flag & NFSSVC_NFSD) {
|
||||
error = nfssvc_nfsd(td);
|
||||
error = nfssvc_nfsd();
|
||||
} else {
|
||||
error = ENXIO;
|
||||
}
|
||||
@ -182,7 +181,7 @@ nfssvc(struct thread *td, struct nfssvc_args *uap)
|
||||
* Adds a socket to the list for servicing by nfsds.
|
||||
*/
|
||||
static int
|
||||
nfssvc_addsock(struct file *fp, struct sockaddr *mynam, struct thread *td)
|
||||
nfssvc_addsock(struct file *fp, struct sockaddr *mynam)
|
||||
{
|
||||
int siz;
|
||||
struct nfssvc_sock *slp;
|
||||
@ -283,7 +282,7 @@ nfssvc_addsock(struct file *fp, struct sockaddr *mynam, struct thread *td)
|
||||
* until it is killed by a signal.
|
||||
*/
|
||||
static int
|
||||
nfssvc_nfsd(struct thread *td)
|
||||
nfssvc_nfsd()
|
||||
{
|
||||
int siz;
|
||||
struct nfssvc_sock *slp;
|
||||
@ -303,7 +302,6 @@ nfssvc_nfsd(struct thread *td)
|
||||
s = splnet();
|
||||
NFSD_LOCK();
|
||||
|
||||
nfsd->nfsd_td = td;
|
||||
TAILQ_INSERT_TAIL(&nfsd_head, nfsd, nfsd_chain);
|
||||
nfsrv_numnfsd++;
|
||||
|
||||
@ -450,11 +448,10 @@ nfssvc_nfsd(struct thread *td)
|
||||
if (writes_todo || (!(nd->nd_flag & ND_NFSV3) &&
|
||||
nd->nd_procnum == NFSPROC_WRITE &&
|
||||
procrastinate > 0 && !notstarted))
|
||||
error = nfsrv_writegather(&nd, slp,
|
||||
nfsd->nfsd_td, &mreq);
|
||||
error = nfsrv_writegather(&nd, slp, &mreq);
|
||||
else
|
||||
error = (*(nfsrv3_procs[nd->nd_procnum]))(nd,
|
||||
slp, nfsd->nfsd_td, &mreq);
|
||||
slp, &mreq);
|
||||
NFSD_LOCK();
|
||||
if (mreq == NULL)
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user