Updated from Linux LTS 3.10.21 to 3.10.22
This commit is contained in:
@@ -151,6 +151,9 @@ struct cache {
|
||||
atomic_t nr_migrations;
|
||||
wait_queue_head_t migration_wait;
|
||||
|
||||
wait_queue_head_t quiescing_wait;
|
||||
atomic_t quiescing_ack;
|
||||
|
||||
/*
|
||||
* cache_size entries, dirty if set
|
||||
*/
|
||||
@@ -742,8 +745,9 @@ static void cell_defer(struct cache *cache, struct dm_bio_prison_cell *cell,
|
||||
|
||||
static void cleanup_migration(struct dm_cache_migration *mg)
|
||||
{
|
||||
dec_nr_migrations(mg->cache);
|
||||
struct cache *cache = mg->cache;
|
||||
free_migration(mg);
|
||||
dec_nr_migrations(cache);
|
||||
}
|
||||
|
||||
static void migration_failure(struct dm_cache_migration *mg)
|
||||
@@ -1340,24 +1344,6 @@ static void writeback_some_dirty_blocks(struct cache *cache)
|
||||
/*----------------------------------------------------------------
|
||||
* Main worker loop
|
||||
*--------------------------------------------------------------*/
|
||||
static void start_quiescing(struct cache *cache)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&cache->lock, flags);
|
||||
cache->quiescing = 1;
|
||||
spin_unlock_irqrestore(&cache->lock, flags);
|
||||
}
|
||||
|
||||
static void stop_quiescing(struct cache *cache)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&cache->lock, flags);
|
||||
cache->quiescing = 0;
|
||||
spin_unlock_irqrestore(&cache->lock, flags);
|
||||
}
|
||||
|
||||
static bool is_quiescing(struct cache *cache)
|
||||
{
|
||||
int r;
|
||||
@@ -1370,6 +1356,41 @@ static bool is_quiescing(struct cache *cache)
|
||||
return r;
|
||||
}
|
||||
|
||||
static void ack_quiescing(struct cache *cache)
|
||||
{
|
||||
if (is_quiescing(cache)) {
|
||||
atomic_inc(&cache->quiescing_ack);
|
||||
wake_up(&cache->quiescing_wait);
|
||||
}
|
||||
}
|
||||
|
||||
static void wait_for_quiescing_ack(struct cache *cache)
|
||||
{
|
||||
wait_event(cache->quiescing_wait, atomic_read(&cache->quiescing_ack));
|
||||
}
|
||||
|
||||
static void start_quiescing(struct cache *cache)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&cache->lock, flags);
|
||||
cache->quiescing = true;
|
||||
spin_unlock_irqrestore(&cache->lock, flags);
|
||||
|
||||
wait_for_quiescing_ack(cache);
|
||||
}
|
||||
|
||||
static void stop_quiescing(struct cache *cache)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&cache->lock, flags);
|
||||
cache->quiescing = false;
|
||||
spin_unlock_irqrestore(&cache->lock, flags);
|
||||
|
||||
atomic_set(&cache->quiescing_ack, 0);
|
||||
}
|
||||
|
||||
static void wait_for_migrations(struct cache *cache)
|
||||
{
|
||||
wait_event(cache->migration_wait, !atomic_read(&cache->nr_migrations));
|
||||
@@ -1414,16 +1435,15 @@ static void do_worker(struct work_struct *ws)
|
||||
struct cache *cache = container_of(ws, struct cache, worker);
|
||||
|
||||
do {
|
||||
if (!is_quiescing(cache))
|
||||
if (!is_quiescing(cache)) {
|
||||
writeback_some_dirty_blocks(cache);
|
||||
process_deferred_writethrough_bios(cache);
|
||||
process_deferred_bios(cache);
|
||||
}
|
||||
|
||||
process_migrations(cache, &cache->quiesced_migrations, issue_copy);
|
||||
process_migrations(cache, &cache->completed_migrations, complete_migration);
|
||||
|
||||
writeback_some_dirty_blocks(cache);
|
||||
|
||||
process_deferred_writethrough_bios(cache);
|
||||
|
||||
if (commit_if_needed(cache)) {
|
||||
process_deferred_flush_bios(cache, false);
|
||||
|
||||
@@ -1436,6 +1456,9 @@ static void do_worker(struct work_struct *ws)
|
||||
process_migrations(cache, &cache->need_commit_migrations,
|
||||
migration_success_post_commit);
|
||||
}
|
||||
|
||||
ack_quiescing(cache);
|
||||
|
||||
} while (more_work(cache));
|
||||
}
|
||||
|
||||
@@ -1998,6 +2021,9 @@ static int cache_create(struct cache_args *ca, struct cache **result)
|
||||
atomic_set(&cache->nr_migrations, 0);
|
||||
init_waitqueue_head(&cache->migration_wait);
|
||||
|
||||
init_waitqueue_head(&cache->quiescing_wait);
|
||||
atomic_set(&cache->quiescing_ack, 0);
|
||||
|
||||
r = -ENOMEM;
|
||||
cache->nr_dirty = 0;
|
||||
cache->dirty_bitset = alloc_bitset(from_cblock(cache->cache_size));
|
||||
|
||||
Reference in New Issue
Block a user