=== modified file 'includes/form.inc'
--- includes/form.inc	2010-06-16 05:06:15 +0000
+++ includes/form.inc	2010-06-18 23:52:02 +0000
@@ -1432,6 +1432,11 @@ function form_builder($form_id, $element
       $element[$key]['#access'] = FALSE;
     }
 
+    // Disable child elements if parent is disabled.
+    if (isset($element['#disabled'])) {
+      $element[$key]['#disabled'] = $element[$key];
+    }
+
     // Don't squash existing parents value.
     if (!isset($element[$key]['#parents'])) {
       // Check to see if a tree of child elements is present. If so,

=== modified file 'modules/file/file.js'
--- modules/file/file.js	2010-05-01 21:55:13 +0000
+++ modules/file/file.js	2010-06-18 23:37:41 +0000
@@ -92,7 +92,11 @@ Drupal.file = Drupal.file || {
       $enabledFields = $(this).parents('div.form-managed-file').find('input.form-file');
     }
 
-    var $disabledFields = $('div.form-managed-file input.form-file').not($enabledFields);
+    var $disabledFields = $('div.form-managed-file input.form-file').not($enabledFields).each(function() {
+      if ($(this).is(':disabled')) {
+        $(this).addClass('disabled');
+      }
+    });
 
     // Disable upload fields other than the one we're currently working with.
     $disabledFields.attr('disabled', 'disabled');
@@ -102,7 +106,8 @@ Drupal.file = Drupal.file || {
     // re-enables the file fields after other processing is complete even though
     // it is only a 1 second timeout.
     setTimeout(function (){
-      $disabledFields.attr('disabled', '');
+      $disabledFields.filter(':not(.disabled)').attr('disabled', '')
+      .end().filter('.disabled').removeClass('disabled');
     }, 1000);
   },
   /**

