From be87a4934ebebaad6c595ffb7d9f848311a9993e Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 4 Aug 2008 02:57:03 +0000 Subject: [PATCH] do_iterative_fd_io(): * When do_iterative_fd_io_iterate() fails, we must not invoke the supplied finished hook explicitly, since it is invoked indirectly by request->SetStatusAndNotify() anyway. Should fix #2557. * We must detach the descriptor putter as soon as we have adjusted the request's finished callback, since that will put the descriptor. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26776 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/fs/vfs_request_io.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/fs/vfs_request_io.cpp b/src/system/kernel/fs/vfs_request_io.cpp index fda774077c..21bbf12f2a 100644 --- a/src/system/kernel/fs/vfs_request_io.cpp +++ b/src/system/kernel/fs/vfs_request_io.cpp @@ -440,6 +440,9 @@ do_iterative_fd_io(int fd, io_request* request, iterative_io_get_vecs getVecs, request->SetFinishedCallback(&do_iterative_fd_io_finish, iterationCookie); request->SetIterationCallback(&do_iterative_fd_io_iterate, iterationCookie); + descriptorPutter.Detach(); + // From now on the descriptor is put by our finish callback. + bool partialTransfer = false; status_t error = do_iterative_fd_io_iterate(iterationCookie, request, &partialTransfer); @@ -449,13 +452,9 @@ do_iterative_fd_io(int fd, io_request* request, iterative_io_get_vecs getVecs, request->TransferredBytes()); } - finished(cookie, request, error, request->IsPartialTransfer(), - request->TransferredBytes()); request->SetStatusAndNotify(error); return error; } - descriptorPutter.Detach(); - return B_OK; }