[OpenAFS-devel] Fileserver crash when out of space during Symlink creation

Rainer Toebbicke rtb@pclella.cern.ch
Tue, 02 Aug 2005 11:07:57 +0200


This is a multi-part message in MIME format.
--------------040705050200060006030802
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

The fileserver will crash (assert) when writing the Symlink text fails 
because of e.g. ENOSPC.

Better log it and return an error to the user, in this case the most 
likely error (VDISKFULL) to be consistent with e.g. StoreData (although 
that may not be the real reason).

-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Rainer Toebbicke
European Laboratory for Particle Physics(CERN) - Geneva, Switzerland
Phone: +41 22 767 8985       Fax: +41 22 767 7155


--------------040705050200060006030802
Content-Type: text/plain;
 name="patch_Symlink_ENOSPC"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch_Symlink_ENOSPC"

*** openafs/src/viced/afsfileprocs.c.2rig	2005-04-06 10:32:03.000000000 +0200
--- openafs/src/viced/afsfileprocs.c	2005-04-19 14:33:49.000000000 +0200
***************
*** 4218,4224 ****
      Vnode *targetptr = 0;	/* vnode of the new link */
      Vnode *parentwhentargetnotdir = 0;	/* parent for use in SetAccessList */
      int errorCode = 0;		/* error code */
!     int code = 0;
      DirHandle dir;		/* Handle for dir package I/O */
      Volume *volptr = 0;		/* pointer to the volume header */
      struct client *client;	/* pointer to client structure */
--- 4218,4224 ----
      Vnode *targetptr = 0;	/* vnode of the new link */
      Vnode *parentwhentargetnotdir = 0;	/* parent for use in SetAccessList */
      int errorCode = 0;		/* error code */
!     int len, code = 0;
      DirHandle dir;		/* Handle for dir package I/O */
      Volume *volptr = 0;		/* pointer to the volume header */
      struct client *client;	/* pointer to client structure */
***************
*** 4309,4316 ****
      /* Write the contents of the symbolic link name into the target inode */
      fdP = IH_OPEN(targetptr->handle);
      assert(fdP != NULL);
!     assert(FDH_WRITE(fdP, (char *)LinkContents, strlen((char *)LinkContents))
! 	   == strlen((char *)LinkContents));
      FDH_CLOSE(fdP);
      /*
       * Set up and return modified status for the parent dir and new symlink
--- 4309,4318 ----
      /* Write the contents of the symbolic link name into the target inode */
      fdP = IH_OPEN(targetptr->handle);
      assert(fdP != NULL);
!     len = strlen((char *) LinkContents);
!     code = (len == FDH_WRITE(fdP, (char *) LinkContents, len)) ? 0 : VDISKFULL;
!     if (code) ViceLog(0, ("SAFSS_Symlink FDH_WRITE failed for len=%d, Fid=%u.%d.%d\n",
! 		len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
      FDH_CLOSE(fdP);
      /*
       * Set up and return modified status for the parent dir and new symlink
***************
*** 4334,4340 ****
  			   volptr);
      FidZap(&dir);
      ViceLog(2, ("SAFS_Symlink returns %d\n", errorCode));
!     return errorCode;
  
  }				/*SAFSS_Symlink */
  
--- 4334,4340 ----
  			   volptr);
      FidZap(&dir);
      ViceLog(2, ("SAFS_Symlink returns %d\n", errorCode));
!     return ( errorCode ? errorCode : code );
  
  }				/*SAFSS_Symlink */
  

--------------040705050200060006030802--