]> git.hungrycats.org Git - linux/commitdiff
[PATCH] kNFSd: NFSv4: new argument to nfsd_access()
authorKendrick M. Smith <kmsmith@umich.edu>
Fri, 23 Aug 2002 04:38:25 +0000 (21:38 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 23 Aug 2002 04:38:25 +0000 (21:38 -0700)
NFSv4 defines a new field in the ACCESS response: a bitmap to indicate
which access bits requested by the client are "supported", i.e. meaningful
for the object in question.

This patch adds a new parameter @supported to nfsd_access(), so that
nfsd_access() can set the value of this bitmap.

fs/nfsd/nfs3proc.c
fs/nfsd/vfs.c
include/linux/nfsd/nfsd.h

index 58f5e069d9a904cc55cdf225bd4c570d790d2bcb..65f4d7109f981f86f5058c028fc20823edc7611b 100644 (file)
@@ -134,7 +134,7 @@ nfsd3_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessargs *argp,
 
        fh_copy(&resp->fh, &argp->fh);
        resp->access = argp->access;
-       nfserr = nfsd_access(rqstp, &resp->fh, &resp->access);
+       nfserr = nfsd_access(rqstp, &resp->fh, &resp->access, NULL);
        RETURN_STATUS(nfserr);
 }
 
index bfb9ef7eab474177304d2eb330ce70ddf8939164..118e3532affb3ce3f907c90d91465ddd2e822606 100644 (file)
@@ -348,12 +348,12 @@ static struct accessmap   nfs3_anyaccess[] = {
 };
 
 int
-nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access)
+nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *supported)
 {
        struct accessmap        *map;
        struct svc_export       *export;
        struct dentry           *dentry;
-       u32                     query, result = 0;
+       u32                     query, result = 0, sresult = 0;
        unsigned int            error;
 
        error = fh_verify(rqstp, fhp, 0, MAY_NOP);
@@ -375,6 +375,9 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access)
        for  (; map->access; map++) {
                if (map->access & query) {
                        unsigned int err2;
+
+                       sresult |= map->access;
+
                        err2 = nfsd_permission(export, dentry, map->how);
                        switch (err2) {
                        case nfs_ok:
@@ -395,6 +398,8 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access)
                }
        }
        *access = result;
+       if (supported)
+               *supported = sresult;
 
  out:
        return error;
index 81077dfc144441d14e8c61d470b81aa403062a42..badb54a83eb322b103803e592e7e4e42c26b7ea6 100644 (file)
@@ -86,7 +86,7 @@ int           nfsd_create(struct svc_rqst *, struct svc_fh *,
                                char *name, int len, struct iattr *attrs,
                                int type, dev_t rdev, struct svc_fh *res);
 #ifdef CONFIG_NFSD_V3
-int            nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *);
+int            nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *);
 int            nfsd_create_v3(struct svc_rqst *, struct svc_fh *,
                                char *name, int len, struct iattr *attrs,
                                struct svc_fh *res, int createmode,