Browse Source

md/raid5: change ->inactive_blocked to a bit-flag.

This allows us to easily add more (atomic) flags.

Signed-off-by: NeilBrown <neilb@suse.de>
NeilBrown 10 years ago
parent
commit
5423399a84
2 changed files with 14 additions and 8 deletions
  1. 8 5
      drivers/md/raid5.c
  2. 6 3
      drivers/md/raid5.h

+ 8 - 5
drivers/md/raid5.c

@@ -672,20 +672,23 @@ get_active_stripe(struct r5conf *conf, sector_t sector,
 				    *(conf->hash_locks + hash));
 				    *(conf->hash_locks + hash));
 		sh = __find_stripe(conf, sector, conf->generation - previous);
 		sh = __find_stripe(conf, sector, conf->generation - previous);
 		if (!sh) {
 		if (!sh) {
-			if (!conf->inactive_blocked)
+			if (!test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state))
 				sh = get_free_stripe(conf, hash);
 				sh = get_free_stripe(conf, hash);
 			if (noblock && sh == NULL)
 			if (noblock && sh == NULL)
 				break;
 				break;
 			if (!sh) {
 			if (!sh) {
-				conf->inactive_blocked = 1;
+				set_bit(R5_INACTIVE_BLOCKED,
+					&conf->cache_state);
 				wait_event_lock_irq(
 				wait_event_lock_irq(
 					conf->wait_for_stripe,
 					conf->wait_for_stripe,
 					!list_empty(conf->inactive_list + hash) &&
 					!list_empty(conf->inactive_list + hash) &&
 					(atomic_read(&conf->active_stripes)
 					(atomic_read(&conf->active_stripes)
 					 < (conf->max_nr_stripes * 3 / 4)
 					 < (conf->max_nr_stripes * 3 / 4)
-					 || !conf->inactive_blocked),
+					 || !test_bit(R5_INACTIVE_BLOCKED,
+						      &conf->cache_state)),
 					*(conf->hash_locks + hash));
 					*(conf->hash_locks + hash));
-				conf->inactive_blocked = 0;
+				clear_bit(R5_INACTIVE_BLOCKED,
+					  &conf->cache_state);
 			} else {
 			} else {
 				init_stripe(sh, sector, previous);
 				init_stripe(sh, sector, previous);
 				atomic_inc(&sh->count);
 				atomic_inc(&sh->count);
@@ -4602,7 +4605,7 @@ static int raid5_congested(struct mddev *mddev, int bits)
 	 * how busy the stripe_cache is
 	 * how busy the stripe_cache is
 	 */
 	 */
 
 
-	if (conf->inactive_blocked)
+	if (test_bit(R5_INACTIVE_BLOCKED, &conf->cache_state))
 		return 1;
 		return 1;
 	if (conf->quiesce)
 	if (conf->quiesce)
 		return 1;
 		return 1;

+ 6 - 3
drivers/md/raid5.h

@@ -509,9 +509,11 @@ struct r5conf {
 	struct llist_head	released_stripes;
 	struct llist_head	released_stripes;
 	wait_queue_head_t	wait_for_stripe;
 	wait_queue_head_t	wait_for_stripe;
 	wait_queue_head_t	wait_for_overlap;
 	wait_queue_head_t	wait_for_overlap;
-	int			inactive_blocked;	/* release of inactive stripes blocked,
-							 * waiting for 25% to be free
-							 */
+	unsigned long		cache_state;
+#define R5_INACTIVE_BLOCKED	1	/* release of inactive stripes blocked,
+					 * waiting for 25% to be free
+					 */
+
 	int			pool_size; /* number of disks in stripeheads in pool */
 	int			pool_size; /* number of disks in stripeheads in pool */
 	spinlock_t		device_lock;
 	spinlock_t		device_lock;
 	struct disk_info	*disks;
 	struct disk_info	*disks;
@@ -526,6 +528,7 @@ struct r5conf {
 	int			worker_cnt_per_group;
 	int			worker_cnt_per_group;
 };
 };
 
 
+
 /*
 /*
  * Our supported algorithms
  * Our supported algorithms
  */
  */