]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/nfsd/nfs4proc.c
nfsd: unsupported nfs4 ops should fail with nfserr_opnotsupp
[linux-2.6-omap-h63xx.git] / fs / nfsd / nfs4proc.c
index 18ead1790bb388461b08d42e3e5fcc5c1d1807cd..5c3683cfd59e2b097dc160545f892042116601c0 100644 (file)
@@ -71,11 +71,11 @@ do_open_permission(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfs
                return nfserr_inval;
 
        if (open->op_share_access & NFS4_SHARE_ACCESS_READ)
-               accmode |= MAY_READ;
+               accmode |= NFSD_MAY_READ;
        if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE)
-               accmode |= (MAY_WRITE | MAY_TRUNC);
+               accmode |= (NFSD_MAY_WRITE | NFSD_MAY_TRUNC);
        if (open->op_share_deny & NFS4_SHARE_DENY_WRITE)
-               accmode |= MAY_WRITE;
+               accmode |= NFSD_MAY_WRITE;
 
        status = fh_verify(rqstp, current_fh, S_IFREG, accmode);
 
@@ -126,7 +126,8 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
                        &resfh.fh_handle.fh_base, resfh.fh_handle.fh_size);
 
        if (!created)
-               status = do_open_permission(rqstp, current_fh, open, MAY_NOP);
+               status = do_open_permission(rqstp, current_fh, open,
+                                           NFSD_MAY_NOP);
 
 out:
        fh_put(&resfh);
@@ -157,7 +158,8 @@ do_open_fhandle(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_
        open->op_truncate = (open->op_iattr.ia_valid & ATTR_SIZE) &&
                (open->op_iattr.ia_size == 0);
 
-       status = do_open_permission(rqstp, current_fh, open, MAY_OWNER_OVERRIDE);
+       status = do_open_permission(rqstp, current_fh, open,
+                                   NFSD_MAY_OWNER_OVERRIDE);
 
        return status;
 }
@@ -186,7 +188,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                cstate->current_fh.fh_handle.fh_size = rp->rp_openfh_len;
                memcpy(&cstate->current_fh.fh_handle.fh_base, rp->rp_openfh,
                                rp->rp_openfh_len);
-               status = fh_verify(rqstp, &cstate->current_fh, 0, MAY_NOP);
+               status = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_NOP);
                if (status)
                        dprintk("nfsd4_open: replay failed"
                                " restoring previous filehandle\n");
@@ -285,7 +287,7 @@ nfsd4_putfh(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        cstate->current_fh.fh_handle.fh_size = putfh->pf_fhlen;
        memcpy(&cstate->current_fh.fh_handle.fh_base, putfh->pf_fhval,
               putfh->pf_fhlen);
-       return fh_verify(rqstp, &cstate->current_fh, 0, MAY_NOP);
+       return fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_NOP);
 }
 
 static __be32
@@ -363,7 +365,8 @@ nfsd4_create(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        fh_init(&resfh, NFS4_FHSIZE);
 
-       status = fh_verify(rqstp, &cstate->current_fh, S_IFDIR, MAY_CREATE);
+       status = fh_verify(rqstp, &cstate->current_fh, S_IFDIR,
+                          NFSD_MAY_CREATE);
        if (status == nfserr_symlink)
                status = nfserr_notdir;
        if (status)
@@ -445,7 +448,7 @@ nfsd4_getattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 {
        __be32 status;
 
-       status = fh_verify(rqstp, &cstate->current_fh, 0, MAY_NOP);
+       status = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_NOP);
        if (status)
                return status;
 
@@ -658,14 +661,19 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                        return status;
                }
        }
+       status = mnt_want_write(cstate->current_fh.fh_export->ex_path.mnt);
+       if (status)
+               return status;
        status = nfs_ok;
        if (setattr->sa_acl != NULL)
                status = nfsd4_set_nfs4_acl(rqstp, &cstate->current_fh,
                                            setattr->sa_acl);
        if (status)
-               return status;
+               goto out;
        status = nfsd_setattr(rqstp, &cstate->current_fh, &setattr->sa_iattr,
                                0, (time_t)0);
+out:
+       mnt_drop_write(cstate->current_fh.fh_export->ex_path.mnt);
        return status;
 }
 
@@ -725,7 +733,7 @@ _nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        int count;
        __be32 status;
 
-       status = fh_verify(rqstp, &cstate->current_fh, 0, MAY_NOP);
+       status = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_NOP);
        if (status)
                return status;
 
@@ -750,7 +758,7 @@ _nfsd4_verify(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                                    cstate->current_fh.fh_export,
                                    cstate->current_fh.fh_dentry, buf,
                                    &count, verify->ve_bmval,
-                                   rqstp);
+                                   rqstp, 0);
 
        /* this means that nfsd4_encode_fattr() ran out of space */
        if (status == nfserr_resource && count == 0)
@@ -947,6 +955,7 @@ encode_op:
 out:
        nfsd4_release_compoundargs(args);
        cstate_free(cstate);
+       dprintk("nfsv4 compound returned %d\n", ntohl(status));
        return status;
 }