diff options
author | Michael Scherle | 2022-02-17 18:58:25 +0100 |
---|---|---|
committer | Simon Rettberg | 2024-05-13 18:25:14 +0200 |
commit | d92d1d3faf7cde517d8c3fe914301eb5aa872f62 (patch) | |
tree | ff2eaa0a640223b36dfabd3ffe29772e44e50733 /src/fuse/connection.c | |
parent | [KERNEL] Fix build on 5.15 kernels >= 5.15.132 (diff) | |
download | dnbd3-d92d1d3faf7cde517d8c3fe914301eb5aa872f62.tar.gz dnbd3-d92d1d3faf7cde517d8c3fe914301eb5aa872f62.tar.xz dnbd3-d92d1d3faf7cde517d8c3fe914301eb5aa872f62.zip |
[FUSE] basic cow implementation & rudimentary tests
Diffstat (limited to 'src/fuse/connection.c')
-rw-r--r-- | src/fuse/connection.c | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/src/fuse/connection.c b/src/fuse/connection.c index e760d98..018ad89 100644 --- a/src/fuse/connection.c +++ b/src/fuse/connection.c @@ -6,6 +6,8 @@ #include <dnbd3/shared/sockhelper.h> #include <dnbd3/shared/log.h> +#include "main.h" +#include "cowfile.h" #include <stdlib.h> #include <pthread.h> #include <string.h> @@ -108,6 +110,7 @@ static bool hasAltServer( dnbd3_host_t *host ); static void addAltServers( void ); 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( void ); static bool sendAltServerRequest( int sock ); @@ -349,6 +352,17 @@ bool connection_initThreads() return success; } +char * connection_getImageName() +{ + return image.name; +} + +uint16_t connection_getImageRID() +{ + return image.rid; +} + + uint64_t connection_getImageSize() { return image.size; @@ -492,7 +506,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 ); @@ -513,8 +527,13 @@ static void* connection_receiveThreadMain( void *sockPtr ) } unlock_rw( &altLock ); } - fuse_reply_buf( request->fuse_req, request->buffer, request->length ); - free( request ); + if( useCow ) { + cowfile_handleCallback( request ); + } + else { + fuse_reply_buf( request->fuse_req, container_of( request, dnbd3_async_parent_t, request )->buffer, request->length ); + free( request ); + } } } else if ( reply.cmd == CMD_GET_SERVERS ) { // List of known alt servers @@ -812,7 +831,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 @@ -820,8 +839,13 @@ static void probeAltServers() goto fail; } // Success, reply to fuse - fuse_reply_buf( request->fuse_req, request->buffer, request->length ); - free( request ); + if( useCow ) { + cowfile_handleCallback( request ); + } + else { + 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 ); } else { // Wasn't a request that's in our request queue @@ -931,6 +955,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; |