nfsd: vfs_llseek() with 32 or 64 bit offsets (hashes)
Use 32-bit or 64-bit llseek() hashes for directory offsets depending on the NFS version. NFSv2 gets 32-bit hashes only. NOTE: This patch got rather complex as Christoph asked to set the filp->f_mode flag in the open call or immediatly after dentry_open() in nfsd_open() to avoid races. Personally I still do not see a reason for that and in my opinion FMODE_32BITHASH/FMODE_64BITHASH flags could be set nfsd_readdir(), as it follows directly after nfsd_open() without a chance of races. Signed-off-by: Bernd Schubert <bernd.schubert@itwm.fraunhofer.de> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Acked-by: J. Bruce Fields<bfields@redhat.com>
This commit is contained in:
parent
999448a8c0
commit
06effdbb49
|
@ -796,9 +796,15 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type,
|
||||||
flags, current_cred());
|
flags, current_cred());
|
||||||
if (IS_ERR(*filp))
|
if (IS_ERR(*filp))
|
||||||
host_err = PTR_ERR(*filp);
|
host_err = PTR_ERR(*filp);
|
||||||
else
|
else {
|
||||||
host_err = ima_file_check(*filp, may_flags);
|
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:
|
out_nfserr:
|
||||||
err = nfserrno(host_err);
|
err = nfserrno(host_err);
|
||||||
out:
|
out:
|
||||||
|
@ -2022,8 +2028,13 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp,
|
||||||
__be32 err;
|
__be32 err;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
loff_t offset = *offsetp;
|
loff_t offset = *offsetp;
|
||||||
|
int may_flags = NFSD_MAY_READ;
|
||||||
|
|
||||||
err = nfsd_open(rqstp, fhp, S_IFDIR, NFSD_MAY_READ, &file);
|
/* NFSv2 only supports 32 bit cookies */
|
||||||
|
if (rqstp->rq_vers > 2)
|
||||||
|
may_flags |= NFSD_MAY_64BIT_COOKIE;
|
||||||
|
|
||||||
|
err = nfsd_open(rqstp, fhp, S_IFDIR, may_flags, &file);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#define NFSD_MAY_BYPASS_GSS 0x400
|
#define NFSD_MAY_BYPASS_GSS 0x400
|
||||||
#define NFSD_MAY_READ_IF_EXEC 0x800
|
#define NFSD_MAY_READ_IF_EXEC 0x800
|
||||||
|
|
||||||
|
#define NFSD_MAY_64BIT_COOKIE 0x1000 /* 64 bit readdir cookies for >= NFSv3 */
|
||||||
|
|
||||||
#define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
|
#define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
|
||||||
#define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
|
#define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue