diff options
Diffstat (limited to 'drivers/s390/cio/idset.c')
| -rw-r--r-- | drivers/s390/cio/idset.c | 29 | 
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/s390/cio/idset.c b/drivers/s390/cio/idset.c index 4d10981c7cc..5a999084a22 100644 --- a/drivers/s390/cio/idset.c +++ b/drivers/s390/cio/idset.c @@ -1,11 +1,10 @@  /* - *  drivers/s390/cio/idset.c - * - *    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" @@ -18,7 +17,7 @@ struct idset {  static inline unsigned long bitmap_size(int num_ssid, int num_id)  { -	return __BITOPS_WORDS(num_ssid * num_id) * sizeof(unsigned long); +	return BITS_TO_LONGS(num_ssid * num_id) * sizeof(unsigned long);  }  static struct idset *idset_new(int num_ssid, int num_id) @@ -91,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); @@ -113,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);  }  | 
