|
@@ -45,6 +45,10 @@ static __be32 nfsacld_proc_getacl(struct svc_rqst * rqstp,
|
|
|
RETURN_STATUS(nfserr_inval);
|
|
|
resp->mask = argp->mask;
|
|
|
|
|
|
+ nfserr = fh_getattr(fh, &resp->stat);
|
|
|
+ if (nfserr)
|
|
|
+ goto fail;
|
|
|
+
|
|
|
if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {
|
|
|
acl = nfsd_get_posix_acl(fh, ACL_TYPE_ACCESS);
|
|
|
if (IS_ERR(acl)) {
|
|
@@ -115,6 +119,9 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,
|
|
|
nfserr = nfserrno( nfsd_set_posix_acl(
|
|
|
fh, ACL_TYPE_DEFAULT, argp->acl_default) );
|
|
|
}
|
|
|
+ if (!nfserr) {
|
|
|
+ nfserr = fh_getattr(fh, &resp->stat);
|
|
|
+ }
|
|
|
|
|
|
/* argp->acl_{access,default} may have been allocated in
|
|
|
nfssvc_decode_setaclargs. */
|
|
@@ -129,10 +136,15 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,
|
|
|
static __be32 nfsacld_proc_getattr(struct svc_rqst * rqstp,
|
|
|
struct nfsd_fhandle *argp, struct nfsd_attrstat *resp)
|
|
|
{
|
|
|
+ __be32 nfserr;
|
|
|
dprintk("nfsd: GETATTR %s\n", SVCFH_fmt(&argp->fh));
|
|
|
|
|
|
fh_copy(&resp->fh, &argp->fh);
|
|
|
- return fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP);
|
|
|
+ nfserr = fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP);
|
|
|
+ if (nfserr)
|
|
|
+ return nfserr;
|
|
|
+ nfserr = fh_getattr(&resp->fh, &resp->stat);
|
|
|
+ return nfserr;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -150,6 +162,9 @@ static __be32 nfsacld_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessarg
|
|
|
fh_copy(&resp->fh, &argp->fh);
|
|
|
resp->access = argp->access;
|
|
|
nfserr = nfsd_access(rqstp, &resp->fh, &resp->access, NULL);
|
|
|
+ if (nfserr)
|
|
|
+ return nfserr;
|
|
|
+ nfserr = fh_getattr(&resp->fh, &resp->stat);
|
|
|
return nfserr;
|
|
|
}
|
|
|
|
|
@@ -243,7 +258,7 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,
|
|
|
return 0;
|
|
|
inode = dentry->d_inode;
|
|
|
|
|
|
- p = nfs2svc_encode_fattr(rqstp, p, &resp->fh);
|
|
|
+ p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
|
|
|
*p++ = htonl(resp->mask);
|
|
|
if (!xdr_ressize_check(rqstp, p))
|
|
|
return 0;
|
|
@@ -274,7 +289,7 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,
|
|
|
static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p,
|
|
|
struct nfsd_attrstat *resp)
|
|
|
{
|
|
|
- p = nfs2svc_encode_fattr(rqstp, p, &resp->fh);
|
|
|
+ p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
|
|
|
return xdr_ressize_check(rqstp, p);
|
|
|
}
|
|
|
|
|
@@ -282,7 +297,7 @@ static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p,
|
|
|
static int nfsaclsvc_encode_accessres(struct svc_rqst *rqstp, __be32 *p,
|
|
|
struct nfsd3_accessres *resp)
|
|
|
{
|
|
|
- p = nfs2svc_encode_fattr(rqstp, p, &resp->fh);
|
|
|
+ p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
|
|
|
*p++ = htonl(resp->access);
|
|
|
return xdr_ressize_check(rqstp, p);
|
|
|
}
|