summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2014-03-24 14:53:36 +0000
committerJeremy Allison <jra@samba.org>2014-03-27 08:05:46 +0100
commit2e2137f56de2c763b874562868d9879d2ae24fee (patch)
tree3252b5433cd0c47b0d71c7f004e0eababdd07990
parentc35fec883cf344a269e65670521e2580a91c24aa (diff)
downloadsamba-2e2137f56de2c763b874562868d9879d2ae24fee.tar.gz
samba-2e2137f56de2c763b874562868d9879d2ae24fee.tar.xz
samba-2e2137f56de2c763b874562868d9879d2ae24fee.zip
smbd: Use asys_results
When multiple aio requests finish simultaneously, this saves a few syscalls Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Thu Mar 27 08:05:46 CET 2014 on sn-devel-104
-rw-r--r--source3/modules/vfs_default.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 02ab35b128..673ebfe35b 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -793,39 +793,36 @@ static void vfswrap_asys_finished(struct tevent_context *ev,
uint16_t flags, void *p)
{
struct asys_context *asys_ctx = (struct asys_context *)p;
+ struct asys_result results[outstanding_aio_calls];
+ int i, ret;
if ((flags & TEVENT_FD_READ) == 0) {
return;
}
- while (true) {
+ ret = asys_results(asys_ctx, results, outstanding_aio_calls);
+ if (ret < 0) {
+ DEBUG(1, ("asys_results returned %s\n", strerror(-ret)));
+ return;
+ }
+
+ for (i=0; i<ret; i++) {
+ struct asys_result *result = &results[i];
struct tevent_req *req;
struct vfswrap_asys_state *state;
- struct asys_result result;
- int res;
-
- res = asys_results(asys_ctx, &result, 1);
- if (res < 0) {
- DEBUG(1, ("asys_result returned %s\n",
- strerror(-res)));
- return;
- }
- if (res == 0) {
- return;
- }
- if ((result.ret == -1) && (result.err == ECANCELED)) {
- return;
+ if ((result->ret == -1) && (result->err == ECANCELED)) {
+ continue;
}
- req = talloc_get_type_abort(result.private_data,
+ req = talloc_get_type_abort(result->private_data,
struct tevent_req);
state = tevent_req_data(req, struct vfswrap_asys_state);
talloc_set_destructor(state, NULL);
- state->ret = result.ret;
- state->err = result.err;
+ state->ret = result->ret;
+ state->err = result->err;
tevent_req_defer_callback(req, ev);
tevent_req_done(req);
}