Index: src/wp-admin/includes/image.php
===================================================================
--- src/wp-admin/includes/image.php	(revision 46593)
+++ src/wp-admin/includes/image.php	(working copy)
@@ -142,20 +142,37 @@
 		// Previously failed upload?
 		// If there is an uploaded file, make all sub-sizes and generate all of the attachment meta.
 		if ( ! empty( $image_file ) ) {
-			return wp_create_image_subsizes( $image_file, $attachment_id );
+			$image_meta = wp_create_image_subsizes( $image_file, $attachment_id );
 		} else {
 			return new WP_Error( 'invalid_attachment', __( 'The attached file cannot be found.' ) );
 		}
-	}
+	} else {
+		$missing_sizes = wp_get_missing_image_subsizes( $attachment_id );
 
-	$missing_sizes = wp_get_missing_image_subsizes( $attachment_id );
+		if ( empty( $missing_sizes ) ) {
+			return $image_meta;
+		}
 
-	if ( empty( $missing_sizes ) ) {
-		return $image_meta;
+		// This also updates the image meta.
+		$image_meta = _wp_make_subsizes( $missing_sizes, $image_file, $image_meta, $attachment_id );
 	}
 
-	// This also updates the image meta.
-	return _wp_make_subsizes( $missing_sizes, $image_file, $image_meta, $attachment_id );
+	/**
+	 * Runs after new image sub-sizes have been created.
+	 *
+	 * At this point all of the new sub-sizes have been created successfully
+	 * and the image metadata has been updated and saved.
+	 *
+	 * @since 5.3.0
+	 *
+	 * @param array  $image_meta    The image attachment metadata.
+	 * @param int    $attachment_id The attachment post ID.
+	 * @param array  $missing_sizes Array of the settings for the image sub-sizes that were created.
+	 * @param string $image_file    Path to the originally uploaded image file.
+	 */
+	do_action( 'wp_update_image_subsizes', $image_meta, $attachment_id, $missing_sizes, $image_file );
+
+	return $image_meta;
 }
 
 /**
