X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device-src%2Ftape-device.c;fp=device-src%2Ftape-device.c;h=0c7fe243b34536c8852bb8f586c72f7b3ab040f2;hb=109540caa4e37a3663b3dcfb9a205b9609e3f561;hp=5e4b44970ac4d2f184edd4634c5659883727e2dd;hpb=4c9eba1feb11adf189bceb4001c425e641f0b56a;p=debian%2Famanda diff --git a/device-src/tape-device.c b/device-src/tape-device.c index 5e4b449..0c7fe24 100644 --- a/device-src/tape-device.c +++ b/device-src/tape-device.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, 2009, 2010 Zmanda, Inc. All Rights Reserved. + * Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published @@ -995,6 +995,9 @@ tape_device_write_block(Device * pself, guint size, gpointer data) { } pself->block++; + g_mutex_lock(pself->device_mutex); + pself->bytes_written += size; + g_mutex_unlock(pself->device_mutex); return TRUE; } @@ -1025,6 +1028,9 @@ static int tape_device_read_block (Device * pself, gpointer buf, case RESULT_SUCCESS: *size_req = size; pself->block++; + g_mutex_lock(pself->device_mutex); + pself->bytes_read += size; + g_mutex_unlock(pself->device_mutex); return size; case RESULT_SMALL_BUFFER: { gsize new_size; @@ -1059,7 +1065,9 @@ static int tape_device_read_block (Device * pself, gpointer buf, } case RESULT_NO_DATA: pself->is_eof = TRUE; + g_mutex_lock(pself->device_mutex); pself->in_file = FALSE; + g_mutex_unlock(pself->device_mutex); device_set_error(pself, stralloc(_("EOF")), DEVICE_STATUS_SUCCESS); @@ -1160,7 +1168,9 @@ tape_device_start (Device * d_self, DeviceAccessMode mode, char * label, } d_self->access_mode = mode; + g_mutex_lock(d_self->device_mutex); d_self->in_file = FALSE; + g_mutex_unlock(d_self->device_mutex); if (IS_WRITABLE_ACCESS_MODE(mode)) { if (self->write_open_errno != 0) { @@ -1272,10 +1282,13 @@ static gboolean tape_device_start_file(Device * d_self, amfree(amanda_header); /* arrange the file numbers correctly */ - d_self->in_file = TRUE; d_self->block = 0; if (d_self->file >= 0) d_self->file ++; + g_mutex_lock(d_self->device_mutex); + d_self->in_file = TRUE; + d_self->bytes_written = 0; + g_mutex_unlock(d_self->device_mutex); return TRUE; } @@ -1295,7 +1308,9 @@ tape_device_finish_file (Device * d_self) { return FALSE; } + g_mutex_lock(d_self->device_mutex); d_self->in_file = FALSE; + g_mutex_unlock(d_self->device_mutex); return TRUE; } @@ -1323,9 +1338,12 @@ tape_device_seek_file (Device * d_self, guint file) { difference --; } - d_self->in_file = FALSE; d_self->is_eof = FALSE; d_self->block = 0; + g_mutex_lock(d_self->device_mutex); + d_self->in_file = FALSE; + d_self->bytes_read = 0; + g_mutex_unlock(d_self->device_mutex); reseek: if (difference > 0) { @@ -1452,7 +1470,9 @@ reseek: return NULL; } + g_mutex_lock(d_self->device_mutex); d_self->in_file = TRUE; + g_mutex_unlock(d_self->device_mutex); d_self->file = file; return rval; @@ -1546,9 +1566,14 @@ tape_device_finish (Device * d_self) { } /* Polish off this file, if relevant. */ + g_mutex_lock(d_self->device_mutex); if (d_self->in_file && IS_WRITABLE_ACCESS_MODE(d_self->access_mode)) { - if (!device_finish_file(d_self)) + g_mutex_unlock(d_self->device_mutex); + if (!device_finish_file(d_self)) { goto finish_error; + } + } else { + g_mutex_unlock(d_self->device_mutex); } /* Straighten out the filemarks. We already wrote one in finish_file, and