diff options
| -rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 6 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.h | 3 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3.c | 11 | 
3 files changed, 12 insertions, 8 deletions
diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index fbfd17d1a..f7b1bb0cd 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -591,7 +591,8 @@ nfs3_request_to_accessbits (int32_t accbits)          return acc_request;  }  void -nfs3_fill_access3res (access3res *res, nfsstat3 status, int32_t accbits) +nfs3_fill_access3res (access3res *res, nfsstat3 status, int32_t accbits, +		      int32_t reqaccbits)  {          uint32_t        accres = 0; @@ -602,7 +603,8 @@ nfs3_fill_access3res (access3res *res, nfsstat3 status, int32_t accbits)          accres = nfs3_accessbits (accbits); -        res->access3res_u.resok.access = accres; +	/* do not answer what was not asked */ +        res->access3res_u.resok.access = accres & reqaccbits;  }  void diff --git a/xlators/nfs/server/src/nfs3-helpers.h b/xlators/nfs/server/src/nfs3-helpers.h index 67935d143..cc96051e1 100644 --- a/xlators/nfs/server/src/nfs3-helpers.h +++ b/xlators/nfs/server/src/nfs3-helpers.h @@ -99,7 +99,8 @@ extern void  nfs3_prep_access3args (access3args *args, struct nfs3_fh *fh);  extern void -nfs3_fill_access3res (access3res *res, nfsstat3 status, int32_t accbits); +nfs3_fill_access3res (access3res *res, nfsstat3 status, int32_t accbits, +		      int32_t reqaccbits);  extern char *  nfs3_fhcache_getpath (struct nfs3_state *nfs3, struct nfs3_fh *fh); diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index b551d5f99..3ecd97498 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -1495,11 +1495,12 @@ rpcerr:  int -nfs3_access_reply (rpcsvc_request_t *req, nfsstat3 status, int32_t accbits) +nfs3_access_reply (rpcsvc_request_t *req, nfsstat3 status, int32_t accbits, +		   int32_t reqaccbits)  {          access3res      res; -        nfs3_fill_access3res (&res, status, accbits); +        nfs3_fill_access3res (&res, status, accbits, reqaccbits);          nfs3svc_submit_reply (req, &res,                                (nfs3_serializer)xdr_serialize_access3res);          return 0; @@ -1523,7 +1524,7 @@ nfs3svc_access_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          nfs3_log_common_res (rpcsvc_request_xid (cs->req), NFS3_ACCESS, status,                               op_errno); -        nfs3_access_reply (cs->req, status, op_errno); +        nfs3_access_reply (cs->req, status, op_errno, cs->accessbits);          nfs3_call_state_wipe (cs);          return 0; @@ -1552,7 +1553,7 @@ nfs3err:          if (ret < 0) {                  nfs3_log_common_res (rpcsvc_request_xid (cs->req), NFS3_ACCESS,                                       stat, -ret); -                nfs3_access_reply (cs->req, stat, 0); +                nfs3_access_reply (cs->req, stat, 0, 0);                  nfs3_call_state_wipe (cs);                  ret = 0;          } @@ -1588,7 +1589,7 @@ nfs3err:          if (ret < 0) {                  nfs3_log_common_res (rpcsvc_request_xid (req), NFS3_ACCESS,                                       stat, -ret); -                nfs3_access_reply (req, stat, 0); +                nfs3_access_reply (req, stat, 0, 0);                  nfs3_call_state_wipe (cs);                  ret = 0;          }  | 
