Subject: Re: server woes due to file permissions

From: "Erdwing Coronado" <[email-masked]>
Date: Wed, 22 Sep 93 10:52:52 EDT

Hans Koomen writes:
> Folks, we're running netatalk-1.3b2 here, on a Sparc 10 server, providing
> half a Gig of file space to our ~70 Macs.  Among the troubles we're
> experiencing are
> 
> 	Mac hangs and needs to be rebooted

I have yet to see a Mac hang. What I have seen is that Macs running
Appleshare prior to version 3.5 are incredibly slow (they might take
20 minutes to write a single 2KB file).

Appleshare 3.5 (and Appletalk 58.x) cures this particular problem.

> cannot write because you have insufficient privledges

I have a similar setup and have noticed the permission problem as well.
Thanks for the explanation.

Erdwing Coronado - The UofM Comprehensive Cancer Center      [email-masked]
________________________________________________________________________________

---

From: [email-masked]
Date: Wed, 22 Sep 1993 16:45:21 -0400

> From:    "Erdwing Coronado"  <[email-masked]>
> To:      [email-masked]

> What I have seen is that Macs running

> Appleshare 3.5 (and Appletalk 58.x) cures this particular problem.

This is a bug in netatalk's atp implementation.  The release packets
are too long (the same size as the last response packet).  Older
version of AppleTalk drop these releases, causing *very* slow
performance.

Here's the patch:

*** netatalk-1.3b2/libatalk/atp/atp_rsel.c-	Tue Aug 10 13:08:36 1993
--- netatalk-1.3b2/libatalk/atp/atp_rsel.c	Wed Aug 25 21:39:07 1993
***************
*** 280,289 ****
  #endif EBUG
  
      if ( !ah->atph_rbitmap && ( req_hdr.atphd_ctrlinfo & ATP_XO )) {
! 	/* successful completion - send release */
  	req_hdr.atphd_ctrlinfo = ATP_TREL;
  	bcopy( (char *)&req_hdr, ah->atph_reqpkt->atpbuf_info.atpbuf_data + 1,
  	    sizeof( struct atphdr ));
  #ifdef EBUG
  	printf( "<%d> sending TREL", getpid() );
  	bprint( ah->atph_reqpkt->atpbuf_info.atpbuf_data,
--- 280,293 ----
  #endif EBUG
  
      if ( !ah->atph_rbitmap && ( req_hdr.atphd_ctrlinfo & ATP_XO )) {
! 	/*
! 	 * successful completion - send release
! 	 * the release consists of DDP type byte + ATP header + 4 user bytes
! 	 */
  	req_hdr.atphd_ctrlinfo = ATP_TREL;
  	bcopy( (char *)&req_hdr, ah->atph_reqpkt->atpbuf_info.atpbuf_data + 1,
  	    sizeof( struct atphdr ));
+ 	ah->atph_reqpkt->atpbuf_dlen = sizeof( struct atphdr ) + 5;
  #ifdef EBUG
  	printf( "<%d> sending TREL", getpid() );
  	bprint( ah->atph_reqpkt->atpbuf_info.atpbuf_data,

> Thanks for the explanation.

Um, I don't think the explanation is too correct.  I'll respond to the
original, in a few.

:wes