diff options
Diffstat (limited to 'drivers/s390/cio/idset.c')
| -rw-r--r-- | drivers/s390/cio/idset.c | 25 | 
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/s390/cio/idset.c b/drivers/s390/cio/idset.c index e6d5f8c4952..65d13e38803 100644 --- a/drivers/s390/cio/idset.c +++ b/drivers/s390/cio/idset.c @@ -1,9 +1,10 @@  /* - *    Copyright IBM Corp. 2007 + *    Copyright IBM Corp. 2007, 2012   *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>   */  #include <linux/vmalloc.h> +#include <linux/bitmap.h>  #include <linux/bitops.h>  #include "idset.h"  #include "css.h" @@ -89,6 +90,14 @@ void idset_sch_del(struct idset *set, struct subchannel_id schid)  	idset_del(set, schid.ssid, schid.sch_no);  } +/* Clear ids starting from @schid up to end of subchannel set. */ +void idset_sch_del_subseq(struct idset *set, struct subchannel_id schid) +{ +	int pos = schid.ssid * set->num_id + schid.sch_no; + +	bitmap_clear(set->bitmap, pos, set->num_id - schid.sch_no); +} +  int idset_sch_contains(struct idset *set, struct subchannel_id schid)  {  	return idset_contains(set, schid.ssid, schid.sch_no); @@ -111,20 +120,12 @@ int idset_sch_get_first(struct idset *set, struct subchannel_id *schid)  int idset_is_empty(struct idset *set)  { -	int bitnum; - -	bitnum = find_first_bit(set->bitmap, set->num_ssid * set->num_id); -	if (bitnum >= set->num_ssid * set->num_id) -		return 1; -	return 0; +	return bitmap_empty(set->bitmap, set->num_ssid * set->num_id);  }  void idset_add_set(struct idset *to, struct idset *from)  { -	unsigned long i, len; +	int len = min(to->num_ssid * to->num_id, from->num_ssid * from->num_id); -	len = min(__BITOPS_WORDS(to->num_ssid * to->num_id), -		  __BITOPS_WORDS(from->num_ssid * from->num_id)); -	for (i = 0; i < len ; i++) -		to->bitmap[i] |= from->bitmap[i]; +	bitmap_or(to->bitmap, to->bitmap, from->bitmap, len);  }  |