diff options
| author | Mike Snitzer <snitzer@redhat.com> | 2013-12-20 18:09:02 -0500 |
|---|---|---|
| committer | Mike Snitzer <snitzer@redhat.com> | 2014-01-07 10:14:31 -0500 |
| commit | 6d16202be7bca169771e2cec140a6c6c53ce9df5 (patch) | |
| tree | 466546ddd4dea5779b6493de14126f5795bfac66 | |
| parent | 787a996cb251e20f560e1615cd85693562541a7a (diff) | |
dm thin: eliminate the no_free_space flag
The pool's error_if_no_space flag can easily serve the same purpose that
no_free_space did, namely: control whether handle_unserviceable_bio()
will error a bio or requeue it.
This is cleaner since error_if_no_space is established when the pool's
features are processed during table load. So it avoids managing the
no_free_space flag by taking the pool's spinlock.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
| -rw-r--r-- | drivers/md/dm-thin.c | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 075c39edea21..a55c5ebb4031 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
| @@ -165,7 +165,6 @@ struct pool { | |||
| 165 | 165 | ||
| 166 | struct pool_features pf; | 166 | struct pool_features pf; |
| 167 | bool low_water_triggered:1; /* A dm event has been sent */ | 167 | bool low_water_triggered:1; /* A dm event has been sent */ |
| 168 | bool no_free_space:1; /* bios will be requeued if set */ | ||
| 169 | 168 | ||
| 170 | struct dm_bio_prison *prison; | 169 | struct dm_bio_prison *prison; |
| 171 | struct dm_kcopyd_client *copier; | 170 | struct dm_kcopyd_client *copier; |
| @@ -991,10 +990,10 @@ static void handle_unserviceable_bio(struct pool *pool, struct bio *bio) | |||
| 991 | */ | 990 | */ |
| 992 | WARN_ON_ONCE(get_pool_mode(pool) != PM_READ_ONLY); | 991 | WARN_ON_ONCE(get_pool_mode(pool) != PM_READ_ONLY); |
| 993 | 992 | ||
| 994 | if (pool->no_free_space) | 993 | if (pool->pf.error_if_no_space) |
| 995 | retry_on_resume(bio); | ||
| 996 | else | ||
| 997 | bio_io_error(bio); | 994 | bio_io_error(bio); |
| 995 | else | ||
| 996 | retry_on_resume(bio); | ||
| 998 | } | 997 | } |
| 999 | 998 | ||
| 1000 | static void retry_bios_on_resume(struct pool *pool, struct dm_bio_prison_cell *cell) | 999 | static void retry_bios_on_resume(struct pool *pool, struct dm_bio_prison_cell *cell) |
| @@ -1437,18 +1436,6 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode) | |||
| 1437 | } | 1436 | } |
| 1438 | } | 1437 | } |
| 1439 | 1438 | ||
| 1440 | static void set_no_free_space(struct pool *pool) | ||
| 1441 | { | ||
| 1442 | unsigned long flags; | ||
| 1443 | |||
| 1444 | if (pool->pf.error_if_no_space) | ||
| 1445 | return; | ||
| 1446 | |||
| 1447 | spin_lock_irqsave(&pool->lock, flags); | ||
| 1448 | pool->no_free_space = true; | ||
| 1449 | spin_unlock_irqrestore(&pool->lock, flags); | ||
| 1450 | } | ||
| 1451 | |||
| 1452 | /* | 1439 | /* |
| 1453 | * Rather than calling set_pool_mode directly, use these which describe the | 1440 | * Rather than calling set_pool_mode directly, use these which describe the |
| 1454 | * reason for mode degradation. | 1441 | * reason for mode degradation. |
| @@ -1457,7 +1444,6 @@ static void out_of_data_space(struct pool *pool) | |||
| 1457 | { | 1444 | { |
| 1458 | DMERR_LIMIT("%s: no free data space available.", | 1445 | DMERR_LIMIT("%s: no free data space available.", |
| 1459 | dm_device_name(pool->pool_md)); | 1446 | dm_device_name(pool->pool_md)); |
| 1460 | set_no_free_space(pool); | ||
| 1461 | set_pool_mode(pool, PM_READ_ONLY); | 1447 | set_pool_mode(pool, PM_READ_ONLY); |
| 1462 | } | 1448 | } |
| 1463 | 1449 | ||
| @@ -1470,11 +1456,9 @@ static void metadata_operation_failed(struct pool *pool, const char *op, int r) | |||
| 1470 | 1456 | ||
| 1471 | if (r == -ENOSPC && | 1457 | if (r == -ENOSPC && |
| 1472 | !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) && | 1458 | !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) && |
| 1473 | !free_blocks) { | 1459 | !free_blocks) |
| 1474 | DMERR_LIMIT("%s: no free metadata space available.", | 1460 | DMERR_LIMIT("%s: no free metadata space available.", |
| 1475 | dm_device_name(pool->pool_md)); | 1461 | dm_device_name(pool->pool_md)); |
| 1476 | set_no_free_space(pool); | ||
| 1477 | } | ||
| 1478 | 1462 | ||
| 1479 | set_pool_mode(pool, PM_READ_ONLY); | 1463 | set_pool_mode(pool, PM_READ_ONLY); |
| 1480 | } | 1464 | } |
| @@ -1819,7 +1803,6 @@ static struct pool *pool_create(struct mapped_device *pool_md, | |||
| 1819 | INIT_LIST_HEAD(&pool->prepared_mappings); | 1803 | INIT_LIST_HEAD(&pool->prepared_mappings); |
| 1820 | INIT_LIST_HEAD(&pool->prepared_discards); | 1804 | INIT_LIST_HEAD(&pool->prepared_discards); |
| 1821 | pool->low_water_triggered = false; | 1805 | pool->low_water_triggered = false; |
| 1822 | pool->no_free_space = false; | ||
| 1823 | bio_list_init(&pool->retry_on_resume_list); | 1806 | bio_list_init(&pool->retry_on_resume_list); |
| 1824 | 1807 | ||
| 1825 | pool->shared_read_ds = dm_deferred_set_create(); | 1808 | pool->shared_read_ds = dm_deferred_set_create(); |
| @@ -2346,7 +2329,6 @@ static void pool_resume(struct dm_target *ti) | |||
| 2346 | 2329 | ||
| 2347 | spin_lock_irqsave(&pool->lock, flags); | 2330 | spin_lock_irqsave(&pool->lock, flags); |
| 2348 | pool->low_water_triggered = false; | 2331 | pool->low_water_triggered = false; |
| 2349 | pool->no_free_space = false; | ||
| 2350 | __requeue_bios(pool); | 2332 | __requeue_bios(pool); |
| 2351 | spin_unlock_irqrestore(&pool->lock, flags); | 2333 | spin_unlock_irqrestore(&pool->lock, flags); |
| 2352 | 2334 | ||
