diff options
Diffstat (limited to 'drivers/md/raid5-cache.c')
| -rw-r--r-- | drivers/md/raid5-cache.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 9b6da759dca2..4337ae0e6af2 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -195,9 +195,7 @@ struct r5l_log {  static inline sector_t r5c_tree_index(struct r5conf *conf,  				      sector_t sect)  { -	sector_t offset; - -	offset = sector_div(sect, conf->chunk_sectors); +	sector_div(sect, conf->chunk_sectors);  	return sect;  } @@ -298,8 +296,8 @@ r5c_return_dev_pending_writes(struct r5conf *conf, struct r5dev *dev)  	wbi = dev->written;  	dev->written = NULL;  	while (wbi && wbi->bi_iter.bi_sector < -	       dev->sector + STRIPE_SECTORS) { -		wbi2 = r5_next_bio(wbi, dev->sector); +	       dev->sector + RAID5_STRIPE_SECTORS(conf)) { +		wbi2 = r5_next_bio(conf, wbi, dev->sector);  		md_write_end(conf->mddev);  		bio_endio(wbi);  		wbi = wbi2; @@ -316,7 +314,7 @@ void r5c_handle_cached_data_endio(struct r5conf *conf,  			set_bit(R5_UPTODATE, &sh->dev[i].flags);  			r5c_return_dev_pending_writes(conf, &sh->dev[i]);  			md_bitmap_endwrite(conf->mddev->bitmap, sh->sector, -					   STRIPE_SECTORS, +					   RAID5_STRIPE_SECTORS(conf),  					   !test_bit(STRIPE_DEGRADED, &sh->state),  					   0);  		} @@ -364,7 +362,7 @@ void r5c_check_cached_full_stripe(struct r5conf *conf)  	 */  	if (atomic_read(&conf->r5c_cached_full_stripes) >=  	    min(R5C_FULL_STRIPE_FLUSH_BATCH(conf), -		conf->chunk_sectors >> STRIPE_SHIFT)) +		conf->chunk_sectors >> RAID5_STRIPE_SHIFT(conf)))  		r5l_wake_reclaim(conf->log, 0);  } @@ -2430,10 +2428,15 @@ static void r5c_recovery_flush_data_only_stripes(struct r5l_log *log,  	struct mddev *mddev = log->rdev->mddev;  	struct r5conf *conf = mddev->private;  	struct stripe_head *sh, *next; +	bool cleared_pending = false;  	if (ctx->data_only_stripes == 0)  		return; +	if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { +		cleared_pending = true; +		clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); +	}  	log->r5c_journal_mode = R5C_JOURNAL_MODE_WRITE_BACK;  	list_for_each_entry_safe(sh, next, &ctx->cached_list, lru) { @@ -2448,6 +2451,8 @@ static void r5c_recovery_flush_data_only_stripes(struct r5l_log *log,  		   atomic_read(&conf->active_stripes) == 0);  	log->r5c_journal_mode = R5C_JOURNAL_MODE_WRITE_THROUGH; +	if (cleared_pending) +		set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);  }  static int r5l_recovery_log(struct r5l_log *log) @@ -2532,13 +2537,10 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)  	struct r5conf *conf;  	int ret; -	ret = mddev_lock(mddev); -	if (ret) -		return ret; - +	spin_lock(&mddev->lock);  	conf = mddev->private;  	if (!conf || !conf->log) { -		mddev_unlock(mddev); +		spin_unlock(&mddev->lock);  		return 0;  	} @@ -2558,7 +2560,7 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)  	default:  		ret = 0;  	} -	mddev_unlock(mddev); +	spin_unlock(&mddev->lock);  	return ret;  }  |