diff options
Diffstat (limited to 'usr/src/uts/common/fs/nfs/nfs_srv.c')
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs_srv.c | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs_srv.c b/usr/src/uts/common/fs/nfs/nfs_srv.c index b7f96d5cec..054a6d1233 100644 --- a/usr/src/uts/common/fs/nfs/nfs_srv.c +++ b/usr/src/uts/common/fs/nfs/nfs_srv.c @@ -96,7 +96,7 @@ u_longlong_t nfs2_srv_caller_id; /* ARGSUSED */ void rfs_getattr(fhandle_t *fhp, struct nfsattrstat *ns, struct exportinfo *exi, - struct svc_req *req, cred_t *cr) + struct svc_req *req, cred_t *cr, bool_t ro) { int error; vnode_t *vp; @@ -140,9 +140,10 @@ rfs_getattr_getfh(fhandle_t *fhp) * Sets the attributes of the file with the given fhandle. Returns * the new attributes. */ +/* ARGSUSED */ void rfs_setattr(struct nfssaargs *args, struct nfsattrstat *ns, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; int flag; @@ -160,7 +161,7 @@ rfs_setattr(struct nfssaargs *args, struct nfsattrstat *ns, return; } - if (rdonly(exi, vp, req)) { + if (rdonly(ro, vp)) { VN_RELE(vp); ns->ns_status = NFSERR_ROFS; return; @@ -334,7 +335,7 @@ rfs_setattr_getfh(struct nfssaargs *args) /* ARGSUSED */ void rfs_lookup(struct nfsdiropargs *da, struct nfsdiropres *dr, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; vnode_t *dvp; @@ -484,7 +485,7 @@ rfs_lookup_getfh(struct nfsdiropargs *da) /* ARGSUSED */ void rfs_readlink(fhandle_t *fhp, struct nfsrdlnres *rl, struct exportinfo *exi, - struct svc_req *req, cred_t *cr) + struct svc_req *req, cred_t *cr, bool_t ro) { int error; struct iovec iov; @@ -631,7 +632,7 @@ static int rdma_setup_read_data2(struct nfsreadargs *, struct nfsrdresult *); /* ARGSUSED */ void rfs_read(struct nfsreadargs *ra, struct nfsrdresult *rr, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { vnode_t *vp; int error; @@ -912,9 +913,10 @@ static int rfs_write_sync_misses = 0; * Any changes made here, especially in error handling might have * to also be done in rfs_write (which clusters write requests). */ +/* ARGSUSED */ void rfs_write_sync(struct nfswriteargs *wa, struct nfsattrstat *ns, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; vnode_t *vp; @@ -935,7 +937,7 @@ rfs_write_sync(struct nfswriteargs *wa, struct nfsattrstat *ns, return; } - if (rdonly(exi, vp, req)) { + if (rdonly(ro, vp)) { VN_RELE(vp); ns->ns_status = NFSERR_ROFS; return; @@ -1134,6 +1136,7 @@ struct rfs_async_write { struct nfsattrstat *ns; struct svc_req *req; cred_t *cr; + bool_t ro; kthread_t *thread; struct rfs_async_write *list; }; @@ -1163,7 +1166,7 @@ static int rfs_write_misses = 0; */ void rfs_write(struct nfswriteargs *wa, struct nfsattrstat *ns, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; vnode_t *vp; @@ -1194,7 +1197,7 @@ rfs_write(struct nfswriteargs *wa, struct nfsattrstat *ns, caller_context_t ct; if (!rfs_write_async) { - rfs_write_sync(wa, ns, exi, req, cr); + rfs_write_sync(wa, ns, exi, req, cr, ro); return; } @@ -1209,6 +1212,7 @@ rfs_write(struct nfswriteargs *wa, struct nfsattrstat *ns, nrp->ns = ns; nrp->req = req; nrp->cr = cr; + nrp->ro = ro; nrp->thread = curthread; ASSERT(curthread->t_schedflag & TS_DONT_SWAP); @@ -1415,7 +1419,7 @@ rfs_write(struct nfswriteargs *wa, struct nfsattrstat *ns, off = rp->wa->wa_offset; len = (uint_t)0; do { - if (rdonly(exi, vp, rp->req)) { + if (rdonly(rp->ro, vp)) { rp->ns->ns_status = NFSERR_ROFS; t_flag = curthread->t_flag & T_WOULDBLOCK; rp->thread->t_flag |= t_flag; @@ -1668,7 +1672,7 @@ rfs_write_getfh(struct nfswriteargs *wa) */ void rfs_create(struct nfscreatargs *args, struct nfsdiropres *dr, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; int lookuperr; @@ -1787,7 +1791,7 @@ rfs_create(struct nfscreatargs *args, struct nfsdiropres *dr, } if (!lookup_ok) { - if (rdonly(exi, dvp, req)) { + if (rdonly(ro, dvp)) { error = EROFS; } else if (va.va_type != VREG && va.va_type != VFIFO && va.va_type != VSOCK && secpolicy_sys_devices(cr) != 0) { @@ -1933,9 +1937,10 @@ rfs_create_getfh(struct nfscreatargs *args) * Remove a file. * Remove named file from parent directory. */ +/* ARGSUSED */ void rfs_remove(struct nfsdiropargs *da, enum nfsstat *status, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error = 0; vnode_t *vp; @@ -1956,7 +1961,7 @@ rfs_remove(struct nfsdiropargs *da, enum nfsstat *status, return; } - if (rdonly(exi, vp, req)) { + if (rdonly(ro, vp)) { VN_RELE(vp); *status = NFSERR_ROFS; return; @@ -2024,9 +2029,10 @@ rfs_remove_getfh(struct nfsdiropargs *da) * rename a file * Give a file (from) a new name (to). */ +/* ARGSUSED */ void rfs_rename(struct nfsrnmargs *args, enum nfsstat *status, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error = 0; vnode_t *fromvp; @@ -2083,7 +2089,7 @@ rfs_rename(struct nfsrnmargs *args, enum nfsstat *status, return; } - if (rdonly(exi, tovp, req)) { + if (rdonly(ro, tovp)) { VN_RELE(tovp); VN_RELE(fromvp); *status = NFSERR_ROFS; @@ -2172,9 +2178,10 @@ rfs_rename_getfh(struct nfsrnmargs *args) * Link to a file. * Create a file (to) which is a hard link to the given file (from). */ +/* ARGSUSED */ void rfs_link(struct nfslinkargs *args, enum nfsstat *status, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; vnode_t *fromvp; @@ -2226,7 +2233,7 @@ rfs_link(struct nfslinkargs *args, enum nfsstat *status, return; } - if (rdonly(exi, tovp, req)) { + if (rdonly(ro, tovp)) { VN_RELE(tovp); VN_RELE(fromvp); *status = NFSERR_ROFS; @@ -2260,7 +2267,7 @@ rfs_link_getfh(struct nfslinkargs *args) */ void rfs_symlink(struct nfsslargs *args, enum nfsstat *status, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; struct vattr va; @@ -2284,7 +2291,7 @@ rfs_symlink(struct nfsslargs *args, enum nfsstat *status, return; } - if (rdonly(exi, vp, req)) { + if (rdonly(ro, vp)) { VN_RELE(vp); *status = NFSERR_ROFS; return; @@ -2351,9 +2358,10 @@ rfs_symlink_getfh(struct nfsslargs *args) * Create a directory with the given name, parent directory, and attributes. * Returns a file handle and attributes for the new directory. */ +/* ARGSUSED */ void rfs_mkdir(struct nfscreatargs *args, struct nfsdiropres *dr, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; struct vattr va; @@ -2375,7 +2383,7 @@ rfs_mkdir(struct nfscreatargs *args, struct nfsdiropres *dr, return; } - if (rdonly(exi, vp, req)) { + if (rdonly(ro, vp)) { VN_RELE(vp); dr->dr_status = NFSERR_ROFS; return; @@ -2442,9 +2450,10 @@ rfs_mkdir_getfh(struct nfscreatargs *args) * Remove a directory. * Remove the given directory name from the given parent directory. */ +/* ARGSUSED */ void rfs_rmdir(struct nfsdiropargs *da, enum nfsstat *status, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; vnode_t *vp; @@ -2463,7 +2472,7 @@ rfs_rmdir(struct nfsdiropargs *da, enum nfsstat *status, return; } - if (rdonly(exi, vp, req)) { + if (rdonly(ro, vp)) { VN_RELE(vp); *status = NFSERR_ROFS; return; @@ -2508,7 +2517,7 @@ rfs_rmdir_getfh(struct nfsdiropargs *da) /* ARGSUSED */ void rfs_readdir(struct nfsrddirargs *rda, struct nfsrddirres *rd, - struct exportinfo *exi, struct svc_req *req, cred_t *cr) + struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { int error; int iseof; @@ -2653,7 +2662,7 @@ rfs_rddirfree(struct nfsrddirres *rd) /* ARGSUSED */ void rfs_statfs(fhandle_t *fh, struct nfsstatfs *fs, struct exportinfo *exi, - struct svc_req *req, cred_t *cr) + struct svc_req *req, cred_t *cr, bool_t ro) { int error; struct statvfs64 sb; |