summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/nfs/nfs_srv.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/nfs/nfs_srv.c')
-rw-r--r--usr/src/uts/common/fs/nfs/nfs_srv.c63
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;