Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Mar 1997 10:23:18 -0700 (MST)
From:      Terry Lambert <terry@lambert.org>
To:        jkh@time.cdrom.com (Jordan K. Hubbard)
Cc:        terry@lambert.org, jfieber@indiana.edu, mrcpu@cdsnet.net, hackers@FreeBSD.ORG
Subject:   Re: Maybe a showstopper, maybe not.
Message-ID:  <199703121723.KAA27592@phaeton.artisoft.com>
In-Reply-To: <14986.858129528@time.cdrom.com> from "Jordan K. Hubbard" at Mar 11, 97 05:18:48 pm

next in thread | previous in thread | raw e-mail | index | archive | help
> > > That's truly bizarre.  Do these "undeleted" files have *anything*
> > > in common, so far as you can make out?
> > 
> > They remain after an "rm -f"?
> > 
> > Sorry, couldn't resist.  ;-).
> 
> I suppose I deserved that.  I meant anything *else* of course. ;)
> 
> > Gee, I wonder if this has anything to do with the cookie code and the
> > multiple entry return wire protocol extension in the NFSv3 spec....
> > naw!
> 
> Do you have a relatively small diff which would fix it?

I don't.  I have a relatively large diff that I would have to
reintegrate into -current (which I'm not running because it's too
unstable right now) that implements the changes that Doug Rabson
and I talked about nearly a year and a half ago.  Basically, it:

1)	Splits the VOP into VOP_READDIR() to atomically read a
	directory block for a given offset, and VOP_GETDIR to
	copy out the data to the consumer buffer (the syscall
	and NFS code are treated as equal consumers of the VFS
	interface).

2)	Modifies getdents to use the new interface

3)	Modifies nfssrv to use the new interface

4)	Incidently gets rid of VOP_READDIR cookies and implements
	the restart algorithm from my last posting

The point being that the consumer buffer is probably smaller than the
on disk buffer if the formats are different (they are for NFS, but
not for syscalls, so you don't see the problem with syscalls).


> If so, it
> seems like John has the perfect test case, not to mention a strong
> reason to have it brought in if it works.

Most likely, what is happening is that the copy buffer is running
out of space in the NFS case on the original copy, even though
space remains in the buffer after it has been processed into the
correct form for the transport.

It is easy to test this with a small tool to dump raw directory
blocks and note block boundries.  If the problem is occurring on
a directory block boundry, this is the culprit.  Run the tool on
a test directory, dumping to a file, then cause the error, then
run the tool again.  The tool isn't more than a couple hundred
lines of C code to write, even if you go all out and format up the
entries and support 4.3 and 4.4 FFS's.


					Regards,
					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703121723.KAA27592>