Inefficient but correct fix for 2122381: call finishBackup after every performBackup
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index c6be61d..4186327 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -1018,7 +1018,15 @@
                     backupData = ParcelFileDescriptor.open(backupDataName,
                             ParcelFileDescriptor.MODE_READ_ONLY);
 
-                    if (!transport.performBackup(packInfo, backupData)) throw new Exception();
+                    // TODO - We call finishBackup() for each application backed up, because
+                    // we need to know now whether it succeeded or failed.  Instead, we should
+                    // hold off on finishBackup() until the end, which implies holding off on
+                    // renaming *all* the output state files (see below) until that happens.
+
+                    if (!transport.performBackup(packInfo, backupData) ||
+                        !transport.finishBackup()) {
+                        throw new Exception("Backup transport failed");
+                    }
                 } else {
                     if (DEBUG) Log.i(TAG, "no backup data written; not calling transport");
                 }
@@ -1417,11 +1425,13 @@
                 stateFile.delete();
 
                 // Tell the transport to remove all the persistent storage for the app
+                // STOPSHIP TODO - need to handle failures
                 mTransport.clearBackupData(mPackage);
             } catch (RemoteException e) {
                 // can't happen; the transport is local
             } finally {
                 try {
+                    // STOPSHIP TODO - need to handle failures
                     mTransport.finishBackup();
                 } catch (RemoteException e) {
                     // can't happen; the transport is local