|
@@ -796,9 +796,15 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type,
|
|
|
flags, current_cred());
|
|
|
if (IS_ERR(*filp))
|
|
|
host_err = PTR_ERR(*filp);
|
|
|
- else
|
|
|
+ else {
|
|
|
host_err = ima_file_check(*filp, may_flags);
|
|
|
|
|
|
+ if (may_flags & NFSD_MAY_64BIT_COOKIE)
|
|
|
+ (*filp)->f_mode |= FMODE_64BITHASH;
|
|
|
+ else
|
|
|
+ (*filp)->f_mode |= FMODE_32BITHASH;
|
|
|
+ }
|
|
|
+
|
|
|
out_nfserr:
|
|
|
err = nfserrno(host_err);
|
|
|
out:
|
|
@@ -2022,8 +2028,13 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp,
|
|
|
__be32 err;
|
|
|
struct file *file;
|
|
|
loff_t offset = *offsetp;
|
|
|
+ int may_flags = NFSD_MAY_READ;
|
|
|
+
|
|
|
+ /* NFSv2 only supports 32 bit cookies */
|
|
|
+ if (rqstp->rq_vers > 2)
|
|
|
+ may_flags |= NFSD_MAY_64BIT_COOKIE;
|
|
|
|
|
|
- err = nfsd_open(rqstp, fhp, S_IFDIR, NFSD_MAY_READ, &file);
|
|
|
+ err = nfsd_open(rqstp, fhp, S_IFDIR, may_flags, &file);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|