svn commit: samba r7600 - in trunk/source/smbd: .
jra at samba.org
jra at samba.org
Wed Jun 15 01:23:06 GMT 2005
Author: jra
Date: 2005-06-15 01:23:06 +0000 (Wed, 15 Jun 2005)
New Revision: 7600
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7600
Log:
Fix up aio write-behind code. Ensure we reset the number of
outstanding aio completes when we're in a loop (thanks valgrind :-).
Jeremy.
Modified:
trunk/source/smbd/aio.c
trunk/source/smbd/process.c
Changeset:
Modified: trunk/source/smbd/aio.c
===================================================================
--- trunk/source/smbd/aio.c 2005-06-15 01:22:30 UTC (rev 7599)
+++ trunk/source/smbd/aio.c 2005-06-15 01:23:06 UTC (rev 7600)
@@ -454,7 +454,7 @@
fsp->fsp_name, strerror(errno) ));
ret = errno;
} else {
- DEBUG(5,("handle_aio_write_complete: aio_write_behind failed ! File %s is corrupt ! \
+ DEBUG(0,("handle_aio_write_complete: aio_write_behind failed ! File %s is corrupt ! \
Wanted %u bytes but only wrote %d\n", fsp->fsp_name, (unsigned int)numtowrite, (int)nwritten ));
ret = EIO;
}
@@ -578,6 +578,7 @@
int i;
struct timespec ts;
+ aio_completion_count = 0;
for( aio_ex = aio_list_head; aio_ex; aio_ex = aio_ex->next) {
if (aio_ex->fsp == fsp) {
aio_completion_count++;
@@ -588,7 +589,7 @@
return ret;
}
- DEBUG(10,("wait_for_aio_completion: waiting for %d aio events to complete.\n",
+ DEBUG(3,("wait_for_aio_completion: waiting for %d aio events to complete.\n",
aio_completion_count ));
aiocb_list = SMB_MALLOC_ARRAY(const SMB_STRUCT_AIOCB *, aio_completion_count);
@@ -606,21 +607,29 @@
ts.tv_sec = seconds_left;
ts.tv_nsec = 0;
+ DEBUG(3,("wait_for_aio_completion: doing a wait of %d seconds.\n", seconds_left ));
+
err = SMB_VFS_AIO_SUSPEND(fsp, aiocb_list, aio_completion_count, &ts);
- if ((err == 0) || (err == -1 && errno == EINTR)) {
- err = process_aio_queue();
- if (err) {
- /* Only return non-zero errors. */
- ret = err;
- }
+ if (err == -1 && errno == EAGAIN) {
+ /* Timeout. */
+ break;
}
+ err = process_aio_queue();
+ if (err) {
+ /* Only return non-zero errors. */
+ ret = err;
+ }
+
SAFE_FREE(aiocb_list);
seconds_left -= (time(NULL) - start_time);
}
/* We timed out - we don't know why. Return ret if already an error, else EIO. */
+ DEBUG(0,("wait_for_aio_completion: aio_suspend timed out waiting for %d events\n",
+ aio_completion_count));
+
return ret ? ret : EIO;
}
Modified: trunk/source/smbd/process.c
===================================================================
--- trunk/source/smbd/process.c 2005-06-15 01:22:30 UTC (rev 7599)
+++ trunk/source/smbd/process.c 2005-06-15 01:23:06 UTC (rev 7600)
@@ -286,15 +286,17 @@
{
DEBUG(10,("async_processing: Doing async processing.\n"));
- if (process_aio_queue()) {
- return;
- }
+ process_aio_queue();
/* check for oplock messages (both UDP and kernel) */
if (receive_local_message(buffer, buffer_len, 1)) {
process_local_message(buffer, buffer_len);
}
+ /* Do the aio check again after receive_local_message as it does a select
+ and may have eaten our signal. */
+ process_aio_queue();
+
if (got_sig_term) {
exit_server("Caught TERM signal");
}
More information about the samba-cvs
mailing list