summaryrefslogtreecommitdiffstats
path: root/src/fuse/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fuse/connection.c')
-rw-r--r--src/fuse/connection.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/fuse/connection.c b/src/fuse/connection.c
index 7e96d88..986393a 100644
--- a/src/fuse/connection.c
+++ b/src/fuse/connection.c
@@ -96,6 +96,7 @@ static void* connection_backgroundThread( void *something );
static void addAltServers();
static void sortAltServers();
static void probeAltServers();
+static size_t receiveRequest(const int sock, dnbd3_async_t* request );
static void switchConnection( int sockFd, alt_server_t *srv );
static void requestAltServers();
static bool throwDataAway( int sockFd, uint32_t amount );
@@ -398,7 +399,7 @@ static void* connection_receiveThreadMain( void *sockPtr )
}
} else {
// Found a match
- const ssize_t ret = sock_recv( sockFd, request->buffer, request->length );
+ const ssize_t ret = receiveRequest( sockFd, request);
if ( ret != (ssize_t)request->length ) {
logadd( LOG_DEBUG1, "receiving payload for a block reply failed" );
connection_read( request );
@@ -423,7 +424,7 @@ static void* connection_receiveThreadMain( void *sockPtr )
cowfile_handleCallback( request );
}
else {
- fuse_reply_buf( request->fuse_req, request->buffer, request->length );
+ fuse_reply_buf( request->fuse_req, container_of( request, dnbd3_async_parent_t, request )->buffer, request->length );
free( request );
}
}
@@ -716,7 +717,7 @@ static void probeAltServers()
}
if ( request != NULL && removeRequest( request ) != NULL ) {
// Request successfully removed from queue
- const ssize_t ret = sock_recv( sock, request->buffer, request->length );
+ ssize_t const ret = receiveRequest( sock, request);
if ( ret != (ssize_t)request->length ) {
logadd( LOG_DEBUG1, "%s probe: receiving payload for a block reply failed", hstr );
// Failure, add to queue again
@@ -728,7 +729,7 @@ static void probeAltServers()
cowfile_handleCallback( request );
}
else {
- fuse_reply_buf( request->fuse_req, request->buffer, request->length );
+ fuse_reply_buf( request->fuse_req, container_of( request, dnbd3_async_parent_t, request )->buffer, request->length );
free( request );
}
logadd( LOG_DEBUG1, "%s probe: Successful direct probe", hstr );
@@ -840,6 +841,19 @@ fail:
}
}
+static size_t receiveRequest(const int sock, dnbd3_async_t* request ) {
+ if(useCow){
+ cow_sub_request_t * cow_request = container_of( request, cow_sub_request_t, dRequest );
+ if( cow_request->callback == readRemoteData){
+ return sock_recv( sock, cow_request->buffer, request->length );
+ } else{
+ return sock_recv( sock, &cow_request->writeBuffer, request->length );
+ }
+ } else {
+ return sock_recv( sock, container_of( request, dnbd3_async_parent_t, request )->buffer, request->length );
+ }
+}
+
static void switchConnection( int sockFd, alt_server_t *srv )
{
struct sockaddr_storage addr;