Imported Upstream version 3.2.1
[debian/amanda] / device-src / xfer-dest-taper-splitter.c
index 7295da389c90301ecfb9222bfd7c6c6a91a18014..561f04dccaead748572865aae8ed20df0d75d668 100644 (file)
@@ -540,18 +540,20 @@ device_thread_write_part(
     g_mutex_unlock(self->ring_mutex);
 part_done:
 
-    if (elt->cancelled) {
-       g_timer_destroy(timer);
-       return NULL;
-    }
-
     /* if we write all of the blocks, but the finish_file fails, then likely
      * there was some buffering going on in the device driver, and the blocks
      * did not all make it to permanent storage -- so it's a failed part.  Note
      * that we try to finish_file even if the part failed, just to be thorough. */
     if (self->device->in_file) {
        if (!device_finish_file(self->device))
-           part_status = PART_FAILED;
+           if (!elt->cancelled) {
+               part_status = PART_FAILED;
+           }
+    }
+
+    if (elt->cancelled) {
+       g_timer_destroy(timer);
+       return NULL;
     }
 
     g_timer_stop(timer);
@@ -737,15 +739,15 @@ cancel_impl(
 
     /* then signal all of our condition variables, so that threads waiting on them
      * wake up and see elt->cancelled. */
-    g_mutex_lock(self->state_mutex);
-    g_cond_broadcast(self->state_cond);
-    g_mutex_unlock(self->state_mutex);
-
     g_mutex_lock(self->ring_mutex);
     g_cond_broadcast(self->ring_add_cond);
     g_cond_broadcast(self->ring_free_cond);
     g_mutex_unlock(self->ring_mutex);
 
+    g_mutex_lock(self->state_mutex);
+    g_cond_broadcast(self->state_cond);
+    g_mutex_unlock(self->state_mutex);
+
     return rv;
 }