Index: src/wp-admin/network/users.php
===================================================================
--- src/wp-admin/network/users.php	(revision 38170)
+++ src/wp-admin/network/users.php	(working copy)
@@ -75,8 +75,18 @@
 								$userfunction = 'all_spam';
 								$blogs = get_blogs_of_user( $user_id, true );
 								foreach ( (array) $blogs as $details ) {
-									if ( $details->userblog_id != $current_site->blog_id ) // main blog not a spam !
+									// main blog not a spam !
+									if ( (int) $details->userblog_id === (int) $current_site->blog_id ) {
+										continue;
+									}
+
+									/**
+									 * Do not punish an entire site if one of its subscriber
+									 * has been marked as spam.
+									 */
+									if ( 'subscriber' !== $details->user_role ) {
 										update_blog_status( $details->userblog_id, 'spam', '1' );
+									}
 								}
 								update_user_status( $user_id, 'spam', '1' );
 							break;
Index: src/wp-includes/user.php
===================================================================
--- src/wp-includes/user.php	(revision 38170)
+++ src/wp-includes/user.php	(working copy)
@@ -621,7 +621,12 @@
 	$blogs = array();
 
 	if ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) {
-		$blog = get_blog_details( 1 );
+		$blog       = get_blog_details( 1 );
+		$user_roles = get_user_meta( $user_id, $wpdb->base_prefix . 'capabilities', true );
+		$user_role  = '';
+		if ( is_array( $user_roles ) ) {
+			$user_role = key( $user_roles );
+		}
 		if ( $blog && isset( $blog->domain ) && ( $all || ( ! $blog->archived && ! $blog->spam && ! $blog->deleted ) ) ) {
 			$blogs[ 1 ] = (object) array(
 				'userblog_id' => 1,
@@ -634,14 +639,13 @@
 				'mature'      => $blog->mature,
 				'spam'        => $blog->spam,
 				'deleted'     => $blog->deleted,
+				'user_role'   => $user_role,
 			);
 		}
 		unset( $keys[ $wpdb->base_prefix . 'capabilities' ] );
 	}
 
-	$keys = array_keys( $keys );
-
-	foreach ( $keys as $key ) {
+	foreach ( $keys as $key => $value ) {
 		if ( 'capabilities' !== substr( $key, -12 ) )
 			continue;
 		if ( $wpdb->base_prefix && 0 !== strpos( $key, $wpdb->base_prefix ) )
@@ -650,6 +654,26 @@
 		if ( ! is_numeric( $blog_id ) )
 			continue;
 
+		// Reset the user role at each loop.
+		$user_role = '';
+
+		// Unserialize meta value
+		if ( is_array( $value ) ) {
+			$value = array_map( 'maybe_unserialize', $value );
+		} else {
+			$value = maybe_unserialize( $value );
+		}
+
+		if ( is_array( $value ) ) {
+			// Only take the first meta_id.
+			$user_roles = reset( $value );
+
+			// Only take the first role.
+			if ( is_array( $user_roles ) ) {
+				$user_role = key( $user_roles );
+			}
+		}
+
 		$blog_id = (int) $blog_id;
 		$blog = get_blog_details( $blog_id );
 		if ( $blog && isset( $blog->domain ) && ( $all || ( ! $blog->archived && ! $blog->spam && ! $blog->deleted ) ) ) {
@@ -664,6 +688,7 @@
 				'mature'      => $blog->mature,
 				'spam'        => $blog->spam,
 				'deleted'     => $blog->deleted,
+				'user_role'   => $user_role,
 			);
 		}
 	}
