summaryrefslogtreecommitdiffstats
path: root/src/fuse/cowfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fuse/cowfile.c')
-rw-r--r--src/fuse/cowfile.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/src/fuse/cowfile.c b/src/fuse/cowfile.c
index c059812..365a9a4 100644
--- a/src/fuse/cowfile.c
+++ b/src/fuse/cowfile.c
@@ -911,9 +911,9 @@ static void finishWriteRequest( fuse_req_t req, cow_request_t *cowRequest )
static void writePaddedBlock( cow_sub_request_t *sRequest )
{
//copy write Data
- memcpy( ( sRequest->dRequest.buffer + ( sRequest->inBlockOffset % DNBD3_BLOCK_SIZE ) ), sRequest->buffer,
+ memcpy( ( sRequest->writeBuffer + ( sRequest->inBlockOffset % DNBD3_BLOCK_SIZE ) ), sRequest->writeSrc,
sRequest->size );
- writeData( sRequest->dRequest.buffer, DNBD3_BLOCK_SIZE, (ssize_t)sRequest->size, sRequest->cowRequest,
+ writeData( sRequest->writeBuffer, DNBD3_BLOCK_SIZE, (ssize_t)sRequest->size, sRequest->cowRequest,
sRequest->block, ( sRequest->inBlockOffset - ( sRequest->inBlockOffset % DNBD3_BLOCK_SIZE ) ) );
@@ -933,19 +933,18 @@ static void padBlockFromRemote( fuse_req_t req, off_t offset, cow_request_t *cow
{
if ( offset > (off_t)metadata->originalImageSize ) {
//pad 0 and done
- //TODO
char buf[DNBD3_BLOCK_SIZE] = { 0 };
memcpy( buf, buffer, size );
writeData( buf, DNBD3_BLOCK_SIZE, (ssize_t)size, cowRequest, block, inBlockOffset );
return;
}
- cow_sub_request_t *sRequest = malloc( sizeof( cow_sub_request_t ) + DNBD3_BLOCK_SIZE );
+ cow_sub_request_t *sRequest = malloc( sizeof( cow_sub_request_t ) + DNBD3_BLOCK_SIZE);
sRequest->callback = writePaddedBlock;
sRequest->inBlockOffset = inBlockOffset;
sRequest->block = block;
sRequest->size = size;
- sRequest->buffer = buffer;
+ sRequest->writeSrc = buffer;
sRequest->cowRequest = cowRequest;
off_t start = offset - ( offset % DNBD3_BLOCK_SIZE );
@@ -975,12 +974,8 @@ void cowfile_handleCallback( dnbd3_async_t *request )
sRequest->callback( sRequest );
}
-static void readRemoteData( cow_sub_request_t *sRequest )
+void readRemoteData( cow_sub_request_t *sRequest )
{
- memcpy( sRequest->cowRequest->readBuffer + ( sRequest->dRequest.offset - sRequest->cowRequest->fuseRequestOffset ),
- sRequest->dRequest.buffer, sRequest->dRequest.length );
-
-
atomic_fetch_add( &sRequest->cowRequest->bytesWorkedOn, sRequest->dRequest.length );
if ( atomic_fetch_sub( &sRequest->cowRequest->workCounter, 1 ) == 1 ) {
@@ -1091,15 +1086,15 @@ void cowfile_write( fuse_req_t req, cow_request_t *cowRequest, off_t offset, siz
* @param buffer into which the data is to be written
* @param workCounter workCounter is increased by one and later reduced by one again when the request is completed.
*/
-static void readRemote( fuse_req_t req, off_t offset, ssize_t size, cow_request_t *cowRequest )
+static void readRemote( fuse_req_t req, off_t offset, ssize_t size, char * buffer, cow_request_t *cowRequest )
{
- cow_sub_request_t *sRequest = malloc( sizeof( cow_sub_request_t ) + size );
+ cow_sub_request_t *sRequest = malloc( sizeof( cow_sub_request_t ));
sRequest->callback = readRemoteData;
sRequest->dRequest.length = (uint32_t)size;
sRequest->dRequest.offset = offset;
sRequest->dRequest.fuse_req = req;
sRequest->cowRequest = cowRequest;
-
+ sRequest->buffer = buffer;
atomic_fetch_add( &cowRequest->workCounter, 1 );
if ( !connection_read( &sRequest->dRequest ) ) {
@@ -1185,7 +1180,7 @@ void cowfile_read( fuse_req_t req, size_t size, off_t offset )
if ( doRead || searchOffset >= endOffset ) {
ssize_t sizeToRead = MIN( searchOffset, endOffset ) - lastReadOffset;
if ( !isLocal ) {
- readRemote( req, lastReadOffset, sizeToRead, cowRequest );
+ readRemote( req, lastReadOffset, sizeToRead, cowRequest->readBuffer + ( lastReadOffset - offset ), cowRequest );
} else {
// Compute the offset in the data file where the read starts
off_t localRead =