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

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

[PATCH] NFS: Add debugging code to NFSv4 readdir

parent 6ebf3656
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1722,6 +1722,10 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
	};
	};
	int			status;
	int			status;


	dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__,
			dentry->d_parent->d_name.name,
			dentry->d_name.name,
			(unsigned long long)cookie);
	lock_kernel();
	lock_kernel();
	nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
	nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
	res.pgbase = args.pgbase;
	res.pgbase = args.pgbase;
@@ -1729,6 +1733,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
	if (status == 0)
	if (status == 0)
		memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
		memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
	unlock_kernel();
	unlock_kernel();
	dprintk("%s: returns %d\n", __FUNCTION__, status);
	return status;
	return status;
}
}


+18 −0
Original line number Original line Diff line number Diff line
@@ -1035,6 +1035,13 @@ static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg
		attrs[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
		attrs[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
	WRITE32(attrs[0] & readdir->bitmask[0]);
	WRITE32(attrs[0] & readdir->bitmask[0]);
	WRITE32(attrs[1] & readdir->bitmask[1]);
	WRITE32(attrs[1] & readdir->bitmask[1]);
	dprintk("%s: cookie = %Lu, verifier = 0x%x%x, bitmap = 0x%x%x\n",
			__FUNCTION__,
			(unsigned long long)readdir->cookie,
			((u32 *)readdir->verifier.data)[0],
			((u32 *)readdir->verifier.data)[1],
			attrs[0] & readdir->bitmask[0],
			attrs[1] & readdir->bitmask[1]);


	/* set up reply kvec
	/* set up reply kvec
	 *    toplevel_status + taglen + rescount + OP_PUTFH + status
	 *    toplevel_status + taglen + rescount + OP_PUTFH + status
@@ -1043,6 +1050,9 @@ static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg
	replen = (RPC_REPHDRSIZE + auth->au_rslack + 9) << 2;
	replen = (RPC_REPHDRSIZE + auth->au_rslack + 9) << 2;
	xdr_inline_pages(&req->rq_rcv_buf, replen, readdir->pages,
	xdr_inline_pages(&req->rq_rcv_buf, replen, readdir->pages,
			 readdir->pgbase, readdir->count);
			 readdir->pgbase, readdir->count);
	dprintk("%s: inlined page args = (%u, %p, %u, %u)\n",
			__FUNCTION__, replen, readdir->pages,
			readdir->pgbase, readdir->count);


	return 0;
	return 0;
}
}
@@ -3066,6 +3076,11 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n
		return status;
		return status;
	READ_BUF(8);
	READ_BUF(8);
	COPYMEM(readdir->verifier.data, 8);
	COPYMEM(readdir->verifier.data, 8);
	dprintk("%s: verifier = 0x%x%x\n",
			__FUNCTION__,
			((u32 *)readdir->verifier.data)[0],
			((u32 *)readdir->verifier.data)[1]);



	hdrlen = (char *) p - (char *) iov->iov_base;
	hdrlen = (char *) p - (char *) iov->iov_base;
	recvd = rcvbuf->len - hdrlen;
	recvd = rcvbuf->len - hdrlen;
@@ -3080,12 +3095,14 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n
	for (nr = 0; *p++; nr++) {
	for (nr = 0; *p++; nr++) {
		if (p + 3 > end)
		if (p + 3 > end)
			goto short_pkt;
			goto short_pkt;
		dprintk("cookie = %Lu, ", *((unsigned long long *)p));
		p += 2;			/* cookie */
		p += 2;			/* cookie */
		len = ntohl(*p++);	/* filename length */
		len = ntohl(*p++);	/* filename length */
		if (len > NFS4_MAXNAMLEN) {
		if (len > NFS4_MAXNAMLEN) {
			printk(KERN_WARNING "NFS: giant filename in readdir (len 0x%x)\n", len);
			printk(KERN_WARNING "NFS: giant filename in readdir (len 0x%x)\n", len);
			goto err_unmap;
			goto err_unmap;
		}
		}
		dprintk("filename = %*s\n", len, (char *)p);
		p += XDR_QUADLEN(len);
		p += XDR_QUADLEN(len);
		if (p + 1 > end)
		if (p + 1 > end)
			goto short_pkt;
			goto short_pkt;
@@ -3105,6 +3122,7 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n
	kunmap_atomic(kaddr, KM_USER0);
	kunmap_atomic(kaddr, KM_USER0);
	return 0;
	return 0;
short_pkt:
short_pkt:
	dprintk("%s: short packet at entry %d\n", __FUNCTION__, nr);
	entry[0] = entry[1] = 0;
	entry[0] = entry[1] = 0;
	/* truncate listing ? */
	/* truncate listing ? */
	if (!nr) {
	if (!nr) {