diff options
Diffstat (limited to 'drivers/md/bcache/util.c')
| -rw-r--r-- | drivers/md/bcache/util.c | 24 | 
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c index 420dad545c7..db3ae4c2b22 100644 --- a/drivers/md/bcache/util.c +++ b/drivers/md/bcache/util.c @@ -168,10 +168,14 @@ int bch_parse_uuid(const char *s, char *uuid)  void bch_time_stats_update(struct time_stats *stats, uint64_t start_time)  { -	uint64_t now		= local_clock(); -	uint64_t duration	= time_after64(now, start_time) +	uint64_t now, duration, last; + +	spin_lock(&stats->lock); + +	now		= local_clock(); +	duration	= time_after64(now, start_time)  		? now - start_time : 0; -	uint64_t last		= time_after64(now, stats->last) +	last		= time_after64(now, stats->last)  		? now - stats->last : 0;  	stats->max_duration = max(stats->max_duration, duration); @@ -188,6 +192,8 @@ void bch_time_stats_update(struct time_stats *stats, uint64_t start_time)  	}  	stats->last = now ?: 1; + +	spin_unlock(&stats->lock);  }  /** @@ -203,7 +209,13 @@ uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done)  {  	uint64_t now = local_clock(); -	d->next += div_u64(done, d->rate); +	d->next += div_u64(done * NSEC_PER_SEC, d->rate); + +	if (time_before64(now + NSEC_PER_SEC, d->next)) +		d->next = now + NSEC_PER_SEC; + +	if (time_after64(now - NSEC_PER_SEC * 2, d->next)) +		d->next = now - NSEC_PER_SEC * 2;  	return time_after64(d->next, now)  		? div_u64(d->next - now, NSEC_PER_SEC / HZ) @@ -212,10 +224,10 @@ uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done)  void bch_bio_map(struct bio *bio, void *base)  { -	size_t size = bio->bi_size; +	size_t size = bio->bi_iter.bi_size;  	struct bio_vec *bv = bio->bi_io_vec; -	BUG_ON(!bio->bi_size); +	BUG_ON(!bio->bi_iter.bi_size);  	BUG_ON(bio->bi_vcnt);  	bv->bv_offset = base ? ((unsigned long) base) % PAGE_SIZE : 0;  | 
