[SCM] Samba Shared Repository - branch v3-5-test updated

Jeremy Allison jra at samba.org
Tue Oct 13 14:30:38 MDT 2009


The branch, v3-5-test has been updated
       via  75b8839... Remove use of "int ret" when we already have errcode. Jeremy.
       via  4cbb0fb... Catch one more erroneous use of errno. Jeremy.
       via  e5aecfa... correctly handle aio_error() and errno
      from  7ff4fc5... s3: Fix vfs_shadow_copy2 to allow in-path @GMT-xxx

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit 75b88390b481545ed1210ea498fba45901ae26e3
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Oct 13 13:28:57 2009 -0700

    Remove use of "int ret" when we already have errcode.
    Jeremy.

commit 4cbb0fb9f628f08a4bd1fcf08f50a4a1418fe2e7
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Oct 13 13:03:39 2009 -0700

    Catch one more erroneous use of errno.
    Jeremy.

commit e5aecfa81d0e496ba972e5fef532e4b6464ff364
Author: Olaf Flebbe <o.flebbe at science-computing.de>
Date:   Tue Oct 13 15:48:19 2009 +0200

    correctly handle aio_error() and errno

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/aio.c |   66 ++++++++++++++++++++++------------------------------
 1 files changed, 28 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/aio.c b/source3/smbd/aio.c
index 491dd79..751fed1 100644
--- a/source3/smbd/aio.c
+++ b/source3/smbd/aio.c
@@ -45,11 +45,11 @@ struct aio_extra {
 	files_struct *fsp;
 	struct smb_request *req;
 	char *outbuf;
-	int (*handle_completion)(struct aio_extra *ex);
+	int (*handle_completion)(struct aio_extra *ex, int errcode);
 };
 
-static int handle_aio_read_complete(struct aio_extra *aio_ex);
-static int handle_aio_write_complete(struct aio_extra *aio_ex);
+static int handle_aio_read_complete(struct aio_extra *aio_ex, int errcode);
+static int handle_aio_write_complete(struct aio_extra *aio_ex, int errcode);
 
 static int aio_extra_destructor(struct aio_extra *aio_ex)
 {
@@ -319,9 +319,8 @@ bool schedule_aio_write_and_X(connection_struct *conn,
  Returns errno or zero if all ok.
 *****************************************************************************/
 
-static int handle_aio_read_complete(struct aio_extra *aio_ex)
+static int handle_aio_read_complete(struct aio_extra *aio_ex, int errcode)
 {
-	int ret = 0;
 	int outsize;
 	char *outbuf = aio_ex->outbuf;
 	char *data = smb_buf(outbuf);
@@ -333,18 +332,11 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
 		   will return an error. Hopefully this is
 		   true.... JRA. */
 
-		/* If errno is ECANCELED then don't return anything to the
-		 * client. */
-		if (errno == ECANCELED) {
-			return 0;
-		}
-
-		DEBUG( 3,( "handle_aio_read_complete: file %s nread == -1. "
+		DEBUG( 3,( "handle_aio_read_complete: file %s nread == %d. "
 			   "Error = %s\n",
-			   fsp_str_dbg(aio_ex->fsp), strerror(errno)));
+			   fsp_str_dbg(aio_ex->fsp), (int)nread, strerror(errcode)));
 
-		ret = errno;
-		ERROR_NT(map_nt_error_from_unix(ret));
+		ERROR_NT(map_nt_error_from_unix(errcode));
 		outsize = srv_set_message(outbuf,0,0,true);
 	} else {
 		outsize = srv_set_message(outbuf,12,nread,False);
@@ -377,17 +369,16 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
 		  fsp_str_dbg(aio_ex->fsp), (double)aio_ex->acb.aio_offset,
 		  (unsigned int)nread ));
 
-	return ret;
+	return errcode;
 }
 
 /****************************************************************************
  Complete the write and return the data or error back to the client.
- Returns errno or zero if all ok.
+ Returns error code or zero if all ok.
 *****************************************************************************/
 
-static int handle_aio_write_complete(struct aio_extra *aio_ex)
+static int handle_aio_write_complete(struct aio_extra *aio_ex, int errcode)
 {
-	int ret = 0;
 	files_struct *fsp = aio_ex->fsp;
 	char *outbuf = aio_ex->outbuf;
 	ssize_t numtowrite = aio_ex->acb.aio_nbytes;
@@ -399,8 +390,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
 				DEBUG(5,("handle_aio_write_complete: "
 					 "aio_write_behind failed ! File %s "
 					 "is corrupt ! Error %s\n",
-					 fsp_str_dbg(fsp), strerror(errno)));
-				ret = errno;
+					 fsp_str_dbg(fsp), strerror(errcode)));
 			} else {
 				DEBUG(0,("handle_aio_write_complete: "
 					 "aio_write_behind failed ! File %s "
@@ -408,13 +398,14 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
 					 "only wrote %d\n", fsp_str_dbg(fsp),
 					 (unsigned int)numtowrite,
 					 (int)nwritten ));
-				ret = EIO;
+				errcode = EIO;
 			}
 		} else {
 			DEBUG(10,("handle_aio_write_complete: "
 				  "aio_write_behind completed for file %s\n",
 				  fsp_str_dbg(fsp)));
 		}
+		/* TODO: should no return 0 in case of an error !!! */
 		return 0;
 	}
 
@@ -425,16 +416,9 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
 		DEBUG( 3,( "handle_aio_write: file %s wanted %u bytes. "
 			   "nwritten == %d. Error = %s\n",
 			   fsp_str_dbg(fsp), (unsigned int)numtowrite,
-			   (int)nwritten, strerror(errno) ));
+			   (int)nwritten, strerror(errcode) ));
 
-		/* If errno is ECANCELED then don't return anything to the
-		 * client. */
-		if (errno == ECANCELED) {
-			return 0;
-		}
-
-		ret = errno;
-		ERROR_BOTH(map_nt_error_from_unix(ret), ERRHRD, ERRdiskfull);
+		ERROR_NT(map_nt_error_from_unix(errcode));
 		srv_set_message(outbuf,0,0,true);
         } else {
 		bool write_through = BITSETW(aio_ex->req->vwv+7,0);
@@ -451,8 +435,8 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
 			 fsp->fnum, (int)numtowrite, (int)nwritten));
 		status = sync_file(fsp->conn,fsp, write_through);
 		if (!NT_STATUS_IS_OK(status)) {
-			ret = errno;
-			ERROR_BOTH(map_nt_error_from_unix(ret),
+			errcode = errno;
+			ERROR_BOTH(map_nt_error_from_unix(errcode),
 				   ERRHRD, ERRdiskfull);
 			srv_set_message(outbuf,0,0,true);
                 	DEBUG(5,("handle_aio_write: sync_file for %s returned %s\n",
@@ -475,7 +459,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
 		  fsp_str_dbg(fsp), (double)aio_ex->acb.aio_offset,
 		  (unsigned int)numtowrite, (unsigned int)nwritten ));
 
-	return ret;
+	return errcode;
 }
 
 /****************************************************************************
@@ -493,14 +477,21 @@ static bool handle_aio_completed(struct aio_extra *aio_ex, int *perr)
 	}
 
 	/* Ensure the operation has really completed. */
-	if (SMB_VFS_AIO_ERROR(aio_ex->fsp, &aio_ex->acb) == EINPROGRESS) {
+	err = SMB_VFS_AIO_ERROR(aio_ex->fsp, &aio_ex->acb);
+	if (err == EINPROGRESS) {
 		DEBUG(10,( "handle_aio_completed: operation mid %u still in "
 			   "process for file %s\n",
 			   aio_ex->req->mid, fsp_str_dbg(aio_ex->fsp)));
 		return False;
-	}
+	} else if (err == ECANCELED) {
+		/* If error is ECANCELED then don't return anything to the
+		 * client. */
+	        DEBUG(10,( "handle_aio_completed: operation mid %u"
+                           " canceled\n", aio_ex->req->mid));
+		return True;
+        }
 
-	err = aio_ex->handle_completion(aio_ex);
+	err = aio_ex->handle_completion(aio_ex, err);
 	if (err) {
 		*perr = err; /* Only save non-zero errors. */
 	}
@@ -510,7 +501,6 @@ static bool handle_aio_completed(struct aio_extra *aio_ex, int *perr)
 
 /****************************************************************************
  Handle any aio completion inline.
- Returns non-zero errno if fail or zero if all ok.
 *****************************************************************************/
 
 void smbd_aio_complete_mid(unsigned int mid)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list