patch for kernel nfsd

Bill Hawes (whawes@star.net)
Sun, 16 Nov 1997 10:10:08 -0500


This is a multi-part message in MIME format.
--------------6B5E1F8702EE626941C4D9A7
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

I've finally got the knfsd code working well enough for others to start
testing, so here it is. The patch is against 2.1.63 but should apply
cleanly to 2.1.64.

The main changes are in nfsd/nfsfh.c where I've built a cacheing system
to back up the dentry validation process. The cacheing works well
enough that I've been able to get most of the way through a kernel
compile with the dentry validation turned off -- i.e. running entirely
on the caches and lookups.

I have not yet added code to do a full volume search, but hopefully it
will seldom be needed. There are still a number of improvements that can
be made to the present cacheing before adding more extensive searching
capabilities.

The filehandle layout should allow server resets without too much client
inconvenience, especially once I add a cache for previous patch-ups.

Anyway, give this a try, and let's start tracking down the bugs.

Regards,
Bill
--------------6B5E1F8702EE626941C4D9A7
Content-Type: application/x-gzip; name="nfsd_63-patch.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="nfsd_63-patch.gz"

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
--------------6B5E1F8702EE626941C4D9A7--