Merge tag 'upstream/3.3.2'
[debian/amanda] / device-src / rait-device.c
index dda81fb1c9b3d9c12c0f75a1037ddc76ac287afb..fa174580e35c2b5b0834c7c761064c50e50a6e69 100644 (file)
@@ -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
@@ -1222,7 +1222,9 @@ rait_device_start (Device * dself, DeviceAccessMode mode, char * label,
        return FALSE;
 
     dself->access_mode = mode;
+    g_mutex_lock(dself->device_mutex);
     dself->in_file = FALSE;
+    g_mutex_unlock(dself->device_mutex);
     amfree(dself->volume_label);
     amfree(dself->volume_time);
     dumpfile_free(dself->volume_header);
@@ -1404,9 +1406,12 @@ rait_device_start_file (Device * dself, dumpfile_t * info) {
         return FALSE;
     }
 
-    dself->in_file = TRUE;
     g_assert(actual_file >= 1);
     dself->file = actual_file;
+    g_mutex_lock(dself->device_mutex);
+    dself->in_file = TRUE;
+    dself->bytes_written = 0;
+    g_mutex_unlock(dself->device_mutex);
 
     return TRUE;
 }
@@ -1584,6 +1589,9 @@ rait_device_write_block (Device * dself, guint size, gpointer data) {
         return FALSE;
     } else {
         dself->block ++;
+       g_mutex_lock(dself->device_mutex);
+       dself->bytes_written += size;
+       g_mutex_unlock(dself->device_mutex);
 
         return TRUE;
     }
@@ -1626,7 +1634,9 @@ rait_device_finish_file (Device * dself) {
         return FALSE;
     }
 
+    g_mutex_lock(dself->device_mutex);
     dself->in_file = FALSE;
+    g_mutex_unlock(dself->device_mutex);
     return TRUE;
 }
 
@@ -1655,9 +1665,12 @@ rait_device_seek_file (Device * dself, guint file) {
 
     if (rait_device_in_error(self)) return NULL;
 
-    dself->in_file = FALSE;
     dself->is_eof = FALSE;
     dself->block = 0;
+    g_mutex_lock(dself->device_mutex);
+    dself->in_file = FALSE;
+    dself->bytes_read = 0;
+    g_mutex_unlock(dself->device_mutex);
 
     ops = g_ptr_array_sized_new(self->private->children->len);
     for (i = 0; i < self->private->children->len; i ++) {
@@ -1722,7 +1735,9 @@ rait_device_seek_file (Device * dself, guint file) {
     }
 
     /* update our state */
+    g_mutex_lock(dself->device_mutex);
     dself->in_file = in_file;
+    g_mutex_unlock(dself->device_mutex);
     dself->file = actual_file;
 
     return rval;
@@ -1990,7 +2005,9 @@ rait_device_read_block (Device * dself, gpointer buf, int * size) {
                stralloc(_("EOF")),
                DEVICE_STATUS_SUCCESS);
             dself->is_eof = TRUE;
+           g_mutex_lock(dself->device_mutex);
            dself->in_file = FALSE;
+           g_mutex_unlock(dself->device_mutex);
         } else {
            device_set_error(dself,
                stralloc(_("All child devices failed to read, but not all are at eof")),
@@ -2007,6 +2024,9 @@ rait_device_read_block (Device * dself, gpointer buf, int * size) {
     if (success) {
        dself->block++;
        *size = blocksize;
+       g_mutex_lock(dself->device_mutex);
+       dself->bytes_read += blocksize;
+       g_mutex_unlock(dself->device_mutex);
         return blocksize;
     } else {
         return -1;