On Sun, Dec 30, 2001 at 05:01:41PM +0200, Sheldon Hearn wrote: > On Sun, 30 Dec 2001 15:47:45 +0100, Michal Mertl wrote: > > > I did use the "goto oldway;" and the problem went away. I tried to look at > > /sys/kern/uipc_syscalls.c sendfile implementation but it is too complex > > for me :-(. > > I've added your feedback to the audit trail of PR bin/31692, thanks. > > > I tried ktrace on ftpd but only saw the call to sendfile(2). If you > > give me some guidance I can try to look into problem deeper. I don't > > have any experience in kernel debugging but would like to learn it. > > No idea. I was just trying to narrow this down so we know who to nag. > > This smells like one of those things someone like dillon or bmilekic > could fix. Gents, any takers?
I don't know if this is correct, but I find the usage of cnt for the loop to be very suspicious. Could you try this patch (against -CURRENT, but should apply to -STABLE)? Consider that sendfile may be executed many times and cnt will only be the value of how much was written that last iteration. Therefore, you need to check whether the *entire* file has been written. And, I would wonder with a network-based FS, it would potentially take multiple sendfile(2) calls - therefore the check against cnt is invalid. And, of course, ftpd.c isn't built against libc_r. Otherwise, I'd say to upgrade your kernel. Alfred got the libc_r sendfile working again a few weeks ago. -- justin --- libexec/ftpd/ftpd.c.old Mon Nov 19 13:52:03 2001 +++ libexec/ftpd/ftpd.c Sun Dec 30 11:33:26 2001 @@ -1811,7 +1811,7 @@ len = filesize; err = cnt = offset = 0; - while (err != -1 && cnt < filesize) { + while (err != -1 && len > 0) { err = sendfile(filefd, netfd, offset, len, (struct sf_hdtr *) NULL, &cnt, 0); byte_count += cnt; To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-current" in the body of the message