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 <j...@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 <j...@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.fle...@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