diff options
Diffstat (limited to 'drivers/net/netconsole.c')
| -rw-r--r-- | drivers/net/netconsole.c | 21 | 
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 194570443493..5d8d0214786c 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -886,8 +886,11 @@ static ssize_t userdatum_value_show(struct config_item *item, char *buf)  static void update_userdata(struct netconsole_target *nt)  { -	int complete_idx = 0, child_count = 0;  	struct list_head *entry; +	int child_count = 0; +	unsigned long flags; + +	spin_lock_irqsave(&target_list_lock, flags);  	/* Clear the current string in case the last userdatum was deleted */  	nt->userdata_length = 0; @@ -897,8 +900,11 @@ static void update_userdata(struct netconsole_target *nt)  		struct userdatum *udm_item;  		struct config_item *item; -		if (WARN_ON_ONCE(child_count >= MAX_EXTRADATA_ITEMS)) -			break; +		if (child_count >= MAX_EXTRADATA_ITEMS) { +			spin_unlock_irqrestore(&target_list_lock, flags); +			WARN_ON_ONCE(1); +			return; +		}  		child_count++;  		item = container_of(entry, struct config_item, ci_entry); @@ -912,12 +918,11 @@ static void update_userdata(struct netconsole_target *nt)  		 * one entry length (1/MAX_EXTRADATA_ITEMS long), entry count is  		 * checked to not exceed MAX items with child_count above  		 */ -		complete_idx += scnprintf(&nt->extradata_complete[complete_idx], -					  MAX_EXTRADATA_ENTRY_LEN, " %s=%s\n", -					  item->ci_name, udm_item->value); +		nt->userdata_length += scnprintf(&nt->extradata_complete[nt->userdata_length], +						 MAX_EXTRADATA_ENTRY_LEN, " %s=%s\n", +						 item->ci_name, udm_item->value);  	} -	nt->userdata_length = strnlen(nt->extradata_complete, -				      sizeof(nt->extradata_complete)); +	spin_unlock_irqrestore(&target_list_lock, flags);  }  static ssize_t userdatum_value_store(struct config_item *item, const char *buf,  | 
