update for 2.1.58 smbfs (mostly performance)

Bill Hawes (whawes@star.net)
Thu, 16 Oct 1997 12:55:09 -0400


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

The attached patch is the latest smbfs updated for 2.1.58. The changes
this time are mostly for improved performance, especially for directory
scans.

In smb_proc_readdir I eliminated two copy operations on filenames by
passing the name as a reference -- the only copy done is that in the
filldir call.

The smb_receive_trans2 routine has been completely rewritten to avoid
copying the message packet in the most common case, when the incoming
data all fits in the original packet. This saves doing a vmalloc() as
well as the data copying.

Other changes include some cleanup in the include files, checking for
expired dentries in delete_dentry (rather than waiting for a validation
failure later), and two additions to kernel/ksyms.c for module support.

Please give it a thorough testing and let me know of any problems.

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

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
++XNZa006qwzGeTA6rsFhKr8B0Y36v6OjwAA
--------------0F64AD50575AE7DD2C4E95D5--