Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3f52af3 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Fix the initialisation of the readdir 'cookieverf' array

When the NFS_COOKIEVERF helper macro was converted into a static
inline function in commit 99fadcd7 (nfs: convert NFS_*(inode)
helpers to static inline), we broke the initialisation of the
readdir cookies, since that depended on doing a memset with an
argument of 'sizeof(NFS_COOKIEVERF(inode))' which therefore
changed from sizeof(be32 cookieverf[2]) to sizeof(be32 *).

At this point, NFS_COOKIEVERF seems to be more of an obfuscation
than a helper, so the best thing would be to just get rid of it.

Also see: https://bugzilla.kernel.org/show_bug.cgi?id=46881



Reported-by: default avatarAndi Kleen <andi@firstfloor.org>
Reported-by: default avatarDavid Binderman <dcb314@hotmail.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@vger.kernel.org
parent 08660043
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -154,7 +154,7 @@ static void nfs_zap_caches_locked(struct inode *inode)
	nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
	nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
	nfsi->attrtimeo_timestamp = jiffies;
	nfsi->attrtimeo_timestamp = jiffies;


	memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode)));
	memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf));
	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
		nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
		nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
	else
	else
+1 −1
Original line number Original line Diff line number Diff line
@@ -643,7 +643,7 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
		  u64 cookie, struct page **pages, unsigned int count, int plus)
		  u64 cookie, struct page **pages, unsigned int count, int plus)
{
{
	struct inode		*dir = dentry->d_inode;
	struct inode		*dir = dentry->d_inode;
	__be32			*verf = NFS_COOKIEVERF(dir);
	__be32			*verf = NFS_I(dir)->cookieverf;
	struct nfs3_readdirargs	arg = {
	struct nfs3_readdirargs	arg = {
		.fh		= NFS_FH(dir),
		.fh		= NFS_FH(dir),
		.cookie		= cookie,
		.cookie		= cookie,
+2 −2
Original line number Original line Diff line number Diff line
@@ -3215,11 +3215,11 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
			dentry->d_parent->d_name.name,
			dentry->d_parent->d_name.name,
			dentry->d_name.name,
			dentry->d_name.name,
			(unsigned long long)cookie);
			(unsigned long long)cookie);
	nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
	nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
	res.pgbase = args.pgbase;
	res.pgbase = args.pgbase;
	status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
	status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
	if (status >= 0) {
	if (status >= 0) {
		memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
		memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE);
		status += args.pgbase;
		status += args.pgbase;
	}
	}


+0 −5
Original line number Original line Diff line number Diff line
@@ -265,11 +265,6 @@ static inline const struct nfs_rpc_ops *NFS_PROTO(const struct inode *inode)
	return NFS_SERVER(inode)->nfs_client->rpc_ops;
	return NFS_SERVER(inode)->nfs_client->rpc_ops;
}
}


static inline __be32 *NFS_COOKIEVERF(const struct inode *inode)
{
	return NFS_I(inode)->cookieverf;
}

static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode)
static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode)
{
{
	struct nfs_server *nfss = NFS_SERVER(inode);
	struct nfs_server *nfss = NFS_SERVER(inode);